相关疑难解决方法(0)

获得Scala的desugared部分/理解表达式?

有没有人知道在实际尝试在REPL(或编译器)中编译之前如何获取(仅Scala部分)desgoared for for/comprehension表达式?

到目前为止,我唯一发现的是编译器"-print"标志,但它为您提供了完整的Scala转换...

scala syntactic-sugar for-comprehension

25
推荐指数
5
解决办法
8372
查看次数

如果方法是中缀和右关联,为什么Scala会为name-by-name参数计算参数?

由于我理解call-by-name了方法的参数,因此在将参数表达式传递给方法时,不会计算相应的参数表达式,但只有在方法体中使用参数的值时(以及如果).

但是,在下面的例子中,这只在前两个方法调用中才有效,但在第三个方法调用中不是这样,尽管它应该只是第二种情况的语法变体!

为什么在第三个方法调用中计算参数表达式?

(我使用Scala 2.11.7测试了此代码)

class Node(x: => Int)

class Foo {
  def :: (x: =>Int) = new Node(x)  // a right-associative method
  def !! (x: =>Int) = new Node(x)  // a left-associative method
}

// Infix method call will not evaluate a call-by-name parameter:
val node = (new Foo) !! {println(1); 1}
println("Nothing evaluated up to here")

// Right-associative method call will not evaluate a call-by-name parameter:
val node1 = (new Foo).::({println(1); 1})
println("Nothing evaluated up to …
Run Code Online (Sandbox Code Playgroud)

scala infix-notation lazy-evaluation callbyname

11
推荐指数
2
解决办法
565
查看次数