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