3

を使用したコードを次に示しますDynamic。ご覧のとおり、以下の部分は期待どおりに機能します。

scala> import language.dynamics
import language.dynamics                                                     

scala> class ExpandoObject extends Dynamic {
     |   private val dict = collection.mutable.Map.empty[String, Any]
     |   def selectDynamic(name: String): Any = dict(name)
     |   def updateDynamic(name: String)(arg: Any) = dict(name) = arg
     | }
defined class ExpandoObject

scala> val e = new ExpandoObject
e: ExpandoObject = ExpandoObject@14e03fec

scala> e.name = "rahul"
e.name: Any = rahul

scala> e.name
res62: Any = rahul

ただし、一部のブロックで使用すると、機能しません。

scala> {
     |   val e = new ExpandoObject
     |   e.name = "rahul"
     | }
<console>:20: error: reassignment to val
                e.name = "rahul"
                       ^

scala>

繰り返しますが、updateDynamic明示的に呼び出すと機能します。

scala> {
     |   val e = new ExpandoObject
     |   e.updateDynamic("name")("rahul")
     |   e
     | }
res66: ExpandoObject = ExpandoObject@3f755bd2

scala> res66.name
res67: Any = rahul

これはバグですか?それとも私が単に欠けているものですか?

4

1 に答える 1