将函数参数作为代码块传递

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)不能工作?
3个回答

6

第二个baz之所以有效,是因为它不是函数字面量,而是按名称调用的参数。基本上它的作用是延迟参数计算的时刻,直到程序需要它。你也可以在这个问题中了解更多相关信息。 至于bar,您只需要传递一个函数,如bar{() => "xyz"}


2
那么,当您想要定义类似于 try{...} 的结构时,baz 方法是否是推荐的方法? - jfisher
1
@jfisher 实际上,在Scala中,try catch根本不被推荐使用。有更多的函数式方法来处理Try。至于按名称调用,当您有一些大型计算并且不确定是否需要它时,例如在if-else表达式中,它是有帮助的。 - 4lex1v
2
我的意思是,如果我想创建类似于 monitor{...}mutex{...}instrument{...} 等的尝试结构,那么“baz”方法是否最适合这些类型的“语言”结构? - jfisher

1

bar 接受一个不带参数且返回 String 的函数,但是你传入的只是一个 String。为了让它正常工作:

bar{() => "xyz"}

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接