

メソッドで匿名クラスを作るとき、引数とそのクラスのメソッド名が同じ場合

[code]

    trait User{ val name:String }
    
    def newUser(name:String) = new User{
      val name = name
    }
    
[/code]

のようにしたいのですが、warning: value name does nothing other than call itself
recursively となります、というかval name=name が val name=this.name
と解釈されているため、意図通りには動きません。

関数の引数名は、名前付き引数などで利用したいので、なるべくクラスで使われているそのものにしたいです。その場合

[code]

    def newUser(name:String) = {
      val xname=name
      new User{
        val name = xname
      }
    }
    
[/code]

のように一時的に別名の引数に代入するしかないのでしょうか？


CC BY-SA 3.0
2014-12-17T10:23:12.063
1911
2014-12-17T17:06:54.143
3466
question
scala
匿名クラスを作るときに関数の引数名と匿名クラスのメソッド名が同じ場合の回避方法を知りたい


通常それしかなさそうです。

スタイルガイドでも名前の衝突に関して

> Scalaコンパイラはnameフィールドとnameメソッドの名前が衝突していると文句を言ってくるでしょう

とした上で

[code]

    class Company {
      private val _name: String = _
    
      def name = _name
    
      def name_=(name: String) {
        _name = name
      }
    }
    
[/code]

というコードを示しています。  
訳の方だと回避方法が多数あり～とあるのですが、原文の方だとそれも今は削除されているように見えますね。

スタイルガイド：

<http://yanana.github.io/scala-
style/naming_conventions/methods/accessors_mutators.html>

<http://docs.scala-lang.org/style/naming-conventions.html>

* * *

参考に本家での同様の質問も載せておきます。  
こちらでは、scalaのガイドのshadowingのところでも暗黙スコープについて語られていない。というようなコメントも回答者がされていますね。

<https://stackoverflow.com/questions/7438025/in-scala-is-there-a-way-to-
access-a-symbol-variable-defined-in-an-outer-scope>


CC BY-SA 3.0
2014-12-17T17:06:54.143
1942
2014-12-17T17:06:54.143
2017-05-23T12:38:55.307
-1
728
1911
answer