【发布时间】:2020-01-11 17:29:30
【问题描述】:
scala.Enumerator.nextName 和.nextNameOrNull 当前阅读:
/** The string to use to name the next created value. */
protected var nextName: Iterator[String] = _
private def nextNameOrNull =
if (nextName != null && nextName.hasNext) nextName.next() else null
nextNameOrNull 随后被调用以获取用于在枚举中创建的项目的名称。
这段代码实际上是如何实现这一点的?
当我将它复制粘贴到一个简单的例子中时:
class MyBaseClass extends Serializable {
/** The string to use to name the next created value. */
protected var nextName: Iterator[String] = _
private def nextNameOrNull =
if (nextName != null && nextName.hasNext) nextName.next() else null
protected final def Value(): Val = Val(nextNameOrNull)
case class Val(name:String)
}
object MyObject extends MyBaseClass {
val myValue = Value
println("Hello from MyObject, myValue: " + myValue)
}
它打印:Hello from MyObject, myValue: Val(null) 而不是希望的Val(myValue)
我需要添加什么才能使其正常工作?
【问题讨论】:
-
总结:引用的枚举代码实际上并没有实现这一点(始终返回 null),如果您更深入地遵循调用链,则会使用反射。使用反射(a la Enumeration)或宏(请参阅所选答案中的链接)以获得相同的效果。