6

我是 Scala 的新手。我一直在搜索,但对于我遇到的看似简单的问题,没有简单的“搜索字符串”。

def foo( f: (String) => String ){println(f("123"))}
foo{_+"abc"} //works

def bar( f :() => String ){println(f())}
bar{"xyz"} // why does this not work?

def baz( f: => String ){println(f)}
baz{"xyz"} //works

为什么第二个 ( bar) 不起作用?

4

3 回答 3

6

第二个baz有效,因为它不是函数文字,而是按名称调用的参数。基本上它所做的是将参数计算的时刻延迟到程序需要它为止。您也可以在问题中阅读有关此内容的信息。至于bar你只需要传递一个函数bar{() => "xyz"}

于 2013-05-04T08:56:32.240 回答
1

bar接受一个不带参数并返回的函数String。你给了它一个String. 为了使它工作:

bar{() => "xyz"}
于 2013-05-04T08:54:29.690 回答
0

这种情况对于无参数函数/块来说是特殊的。

object Fs2 {
  def f0=1
  def f0_1()=1
}

object Main extends App {
  println(Fs2.f0)
  //println(Fs2.f0()) wont compile
  println(Fs2.f0_1)
  println(Fs2.f0_1())
}

f0_1 的单位“()”是可选的。将其添加到 f0 将导致错误。f0 不接受任何参数。单元本身是一个参数,声明没有参数。Fs2.f0对应baz,Fs2.f0()对应bar。

于 2013-08-23T23:30:00.707 回答