在Python中,我可以这样做:
val f1 = m1
在Scala中,
scala> val f1:()=> String = m1
f1: () => String = <function0>
相当于我上面所做的不是
scala> val f1 = m1 _
f1: () => String = <function0>
但我必须指定
val f1 = m1
或
val f1 = m1
为什么选择这种设计? 当有人从Python进入Scala时,能够 通过
分配功能m1
似乎比必须采用上述方法更自然。
我知道f1
导致调用val f1 = m1()
并将结果值分配给f1
,但不会更清楚地遵循Python方法
并且在这种情况下要求括号,即
{{1}}
如果我想调用该函数并将结果分配给{{1}}?
答案 0 :(得分:1)
在Scala中,如果方法没有副作用可以大大提高可读性,则应省略括号。引自Scala docs:
Scala允许省略arity-0方法的括号(no 参数)。但是,只应在方法时使用此语法 有问题没有副作用(纯功能)。换一种说法, 调用queue.size时省略括号是可以接受的, 但是在调用println()时却没有。该约定反映了该方法 上面给出的声明公约。
宗教观察此会议将大大改善代码 可读性,将使一目了然更容易理解 任何给定方法的最基本操作。抵制省略的冲动 括号只是为了保存两个字符!
关于统一访问,有一些更深层次的考虑
原理。它们在Martin Odersky等人的“Programming in Scala”一书的第10.3节中有所阐述。我不会在这里引用它(它超过两页),但重点是在调用arity-0方法时省略括号允许您无缝地将这些方法更改为vals
,甚至无需触及客户端代码。这样做,您可以管理通常的时空权衡。特别是,您可以override defs
with vals
(但反之亦然):
abstract class Mass {
def kilograms: Double
}
class Grams(grams: Double) extends Mass {
val kilograms: Double = {
Thread.sleep(5000) // pretend to think hard
grams / 1000.0
}
}
More on def vs val vs lazy val
当然,如果允许类似python的分配,所有这些东西都是不可能的。