Scala - '=> SomeType'是什么意思?

Arg*_*Arg 11 scala

今天我想问一下这=> SomeType是什么意思.我发现它在本文中使用过.它位于"顺序组合器"部分.

谢谢你的回答!

Owe*_*wen 11

它表示您可以运行的代码块.

例如:

scala> def doTwice(op: =>Unit) = {op; op}
doTwice: (op: => Unit)Unit

scala> doTwice({println("Hi")})
Hi
Hi
Run Code Online (Sandbox Code Playgroud)

在这种情况下=>Unit{println("Hi")}

这里"SomeType"是Unit,因为println它不产生值.如果它产生了Int,那就是=>Int.

  • 很好的例子.这里,`op`被称为*name by name*参数(而不是*by value*).请注意,编写`doTwice(println("Hi"))`同样有效.在Scala中调用函数时,语法不表示您是通过*name*还是*value*传递参数. (4认同)
  • @Arg [SymbolHound](http://symbolhound.com/)是你的朋友. (3认同)
  • 哦,我明白了。谢谢!这就是我讨厌scala的原因。用谷歌搜索这样的东西真是荒唐可笑:)谢谢上帝的好人和stackoverflow :) (2认同)

Dan*_*ral 7

它表明了两件事.首先,由于前缀=>,它表示参数将按名称传递.然后,它表示传递的参数的类型必须是SomeType.

有些人把这两者混为一谈,思考=> SomeType是一种类型本身 - 事实并非如此.它是两件事的结合:参数评估策略和参数类型.

因此,如果你有这个问题,如果维基百科链接没有明确说明,请按名称简短解释

def f[A](x: => A) = { x; x }
f(some stuff)
Run Code Online (Sandbox Code Playgroud)

然后Scala会像这样执行:

{ some stuff; some stuff }
Run Code Online (Sandbox Code Playgroud)

在按值调用时,会发生什么更像是这样:

val x = some stuff
{ x; x }
Run Code Online (Sandbox Code Playgroud)

另请注意,参数始终按值调用,但仅一次.在按名称调用时,可能永远不会计算参数(例如,如果它在一个非执行的分支上if),但可能会多次评估.