为什么在Scala中重新分配函数值失败?

为什么在Scala中重新分配函数值失败?,scala,Scala,在下面的代码中,我尝试创建一个不带参数的函数值并打印一条消息 trait Base { var onTrade = () => println("nothing") def run { onTrade } } 在下面的子类中,我尝试重新分配函数值以打印不同的消息 class BaseImpl extends Base { onTrade = () => { val price = 5 println("trade price: " + pr

在下面的代码中,我尝试创建一个不带参数的函数值并打印一条消息

trait Base {
  var onTrade = () => println("nothing")

  def run {
    onTrade
  }
}
在下面的子类中,我尝试重新分配函数值以打印不同的消息

class BaseImpl extends Base {
  onTrade = () => {
    val price = 5
    println("trade price: " + price)
  }
  run
}
当我运行BaseImpl时,控制台上根本不会打印任何内容。我在等你

trade price: 5

为什么我的代码会失败?

onTrade
是一个函数,因此需要使用括号才能调用它:

def run {
   onTrade()
}

更新 方法
run
很可能会让您感到困惑-您甚至可以在没有括号的情况下调用它。方法和功能是有区别的。你可以看看这个问题,它会很有帮助:


很有趣,谢谢。那么onTrade实际上做什么呢?(没有括号)@deltanovember:字面上什么都没有:)在本例中,方法
run
只返回此函数,但由于您这样定义了方法,返回值将被忽略(实际返回类型
run
Unit
),我相信如果您这样做,它会像正常变量一样使用它。(请确认比我更擅长Scala的人)@Gunnar Hoffman:是的,它被视为一种价值。您可以将其作为参数传递给其他函数/方法或返回它,但重要的是,除非您使用括号显式调用它,否则不会调用/计算此函数。此外,建议始终编写方法返回类型。