我最近使用以下方法偶然发现了一个抽象类:
abstract class Boolean {
def && (x: => Boolean): Boolean = etc...
}
我想知道x: => Boolean
的含义是什么?这是否意味着x
可以是任何类型,它确实产生一个布尔值?或者说x是抽象类的类型?
感谢
答案 0 :(得分:2)
https://docs.scala-lang.org/tour/by-name-parameters.html
仅在使用时评估名称参数。他们形成鲜明对比 按值参数。
按名称参数的优点是,如果不对它们进行评估 它们不在函数体中使用。另一方面,按价值计算 参数的优点是它们只被评估一次。
答案 1 :(得分:2)
x
是一个名称参数,这意味着只有在方法中引用它时才会对其进行求值。在这种情况下,它被用于产生&&
方法的短路行为:
def foo(): Boolean = {
println("In foo")
true
}
true && foo()
如果你在REPL中运行它,你永远不会看到打印“In foo”,因为&&
不需要foo
的结果。
您可以将by-name参数视为与零参数函数类似,但更轻量级,并且语法略有不同:
def bar(x: () => Int): Unit // bar takes a function returning an Int
def baz(x: => Int): Unit // baz takes an Int as a by-name parameter