将函数参数传递为代码块

时间:2013-05-04 08:46:45

标签: scala

我是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)不起作用?

3 个答案:

答案 0 :(得分:6)

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

这样的函数

答案 1 :(得分:1)

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

bar{() => "xyz"}

答案 2 :(得分: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。