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

12
今天我想问一下,"=> SomeType" 是什么意思。我在这篇文章中找到了它的使用方法。它出现在" Sequential Combinator" 部分。
谢谢任何回答!
3个回答

12

它表示一块可以运行的代码。

例如:

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

scala> doTwice({println("Hi")})
Hi
Hi
在这种情况下,=>Unit{println("Hi")}。在这里,“SomeType”是Unit,因为println没有产生任何值。如果它产生一个Int,那么它会是=>Int

2
哦,我明白了。谢谢!这就是我讨厌 Scala 的原因。它非常难在谷歌上找到这样的东西 :) 感谢上帝有好心人和 StackOverflow :) - Arg
4
不错的例子。在这里,“op”被称为“按名传递”参数(与“按值传递”相对)。请注意,编写doTwice(println(“Hi”))同样有效。在Scala中调用函数时,语法不表明您是按名称还是按传递参数。 - Kipton Barros
3
@Arg SymbolHound 是你的好朋友。 - Daniel C. Sobral

7
它表示两个意思。首先,由于前缀=>,它表示参数将通过按名称传递。然后,它指示所传递的参数类型必须为SomeType
有些人混淆这两个概念,认为=> SomeType本身就是一种类型——它不是。它是两个东西的结合:参数评估策略和参数类型。
因此,在这里简要解释一下按名称调用,以防万一维基百科链接没有让事情变得清晰。如果你有这个:
def f[A](x: => A) = { x; x }
f(some stuff)

那么Scala将会像这样执行它:
{ some stuff; some stuff }

在值传递时,发生的事情更类似于这样:

val x = some stuff
{ x; x }

注意,参数始终按值调用并进行计算,但仅计算一次。在按名称调用时,如果参数位于非执行分支上(例如,在if语句中),则可能永远不会被计算,但可能会被计算多次。

1
在这种情况下,[A]代表什么?我在许多地方都看到过它,但仍然不理解。 - SamAko
1
@elimence 这是一个类型参数。它是在声明 f 的时候不知道的一种类型,但是在使用 f 的时候会知道。函数 f 对于所有类型 A 都是有效的,在这种情况下,没有关于 A 可以是什么的限制。我可以使用 A <: SomeConcreteType 来表示一个下界(A 必须是 SomeConcreteType 或其子类型),A >: SomeOtherTypeA 必须是 SomeOtherType 的超类),以及指示 A 必须是某个隐式参数的一部分,这会导致对 A 可以是什么的任意限制。 - Daniel C. Sobral
谢谢 Daniel,现在我明白了。 - SamAko

2

它只是一种不带参数的函数值类型。Owen的例子很棒,只需要知道"A => B"是一个带有类型A参数和返回类型B的函数,而"=> B"是一个不带参数且返回类型为B的函数。


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