小编ver*_*der的帖子

if语句作用域变量

通常我都希望创建作用于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

8
推荐指数
2
解决办法
5468
查看次数

如何使用反射评估懒惰的val?

使用实验性的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)

reflection scala lazy-evaluation

8
推荐指数
1
解决办法
646
查看次数

标签 统计

scala ×2

lazy-evaluation ×1

reflection ×1