通常我都希望创建作用于if语句的变量.有些计算只涉及特定的"if"语句 - 用临时变量污染外部范围.
我想做什么:
val data = (whatever)
if (val x = data*2+5.4345/2.45; val y = data/128.4; x*y < 10)
x * y
else
x * 2
println(x) //ERROR!
Run Code Online (Sandbox Code Playgroud)
一种选择是相当混乱:
val data = (whatever)
if (data*2+5.4345/2.45*data/128.4 < 10)
data*2+5.4345/2.45*data/128.4
else
data*2+5.4345/2.45 * 2
Run Code Online (Sandbox Code Playgroud)
我试图避免的明显替代方案:
val data = (whatever)
val x = data*2+5.4345/2.45
val y = data/128.4
if (x*y < 10)
x*y
else
x * 2
println(x) //OK
Run Code Online (Sandbox Code Playgroud)
在Scala中这样的事情可能吗?有一个体面的解决方法吗?如果没有,其他语言支持这样的想法?
使用实验性的Scala 2.10反射,当我尝试在一个惰性val的字段上调用FieldMirror.get()时,它返回null.有没有办法用反射评估懒惰的val?之后get()函数不应再返回null.
考虑这个例子:
case class Person(val firstName: String,
val lastName: String) {
lazy val name = firstName + " " + lastName
}
import scala.reflect.runtime.{universe => ru}
val runtimeMirror = ru.runtimeMirror(getClass.getClassLoader)
val fred = Person("Fred", "Smith")
val instanceMirror = runtimeMirror.reflect(fred)
val nameTerm = ru.typeOf[Person].declaration(ru.newTermName("name")).asTerm
val nameLazy = instanceMirror.reflectField(nameTerm)
nameLazy.get
>>> res8: Any = null
fred.name
>>> res9: String = Fred Smith
nameLazy.get
>>> res10: Any = Fred Smith
Run Code Online (Sandbox Code Playgroud)