2012-10-11 89 views
1
val flag = false 

if (val data = flag) { 
    println(data) 
} 

是否有可能在012语句中分配flag并在Scala中自动评估?斯卡拉如果条件内分配

+3

为什么要编写这样的代码?在'if'的主体内部,'data'总是'true',那么为什么你需要'val data'呢? – Jesper

+0

更新了我的问题 – Ryan

+5

现在还很不清楚,你试图在这里实现什么。不要将'data'分配给'flag'的值,你可以使用标志,这在范围内。请澄清你想要做什么。 – drexin

回答

4

是,但它不逃避的范围,所以你不能在体内使用它,如果

if ({val data = true; data}) 
    println("data was true") 

的分配不会返回一个值,但可以改为返回。更好地做类似

def test(data: Boolean) { 
    if (data) {/* data in scope */} 
    else  {/* data in scope */}} 
+0

从你的第一个示例代码中,是否有可能在整个if区块中使用'data'? – Ryan

+0

不幸的是,它只在大括号内部,如果你需要分配和测试然后在'if'的主体中使用,那么看起来你应该声明一个'var'(这需要一个抛弃分配)在包含'if'的外部范围中。然而,使用'var's更重要的是能够分配,测试然后在'if'条件部分的范围中使用。 –

3

有一个很好的扩展功能,可以帮助你与你的情况和其他许多人。

implicit class AnyExtensions[A](val x: A) extends AnyVal { 
    def asSatisfying(p: A => Boolean): Option[A] = 
    if (p(x)) Some(x) else None 
} 

有它的范围进口的,你可以做你的榜样如下:你可以用下面的隐式转换实现它

flag.asSatisfying(_).foreach(println) 

有一些更好的用例为它详细解释this answer

该函数的主要优点是它可以让您有效地消除引入中间变量的需要,从而使您能够将任何“if-else”逻辑解决为单行表达式。