函数赋值给Scala中的值/变量

时间:2016-05-22 09:19:43

标签: scala

在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}}?

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的分配,所有这些东西都是不可能的。