2011-08-29 73 views

回答

10

它意味着您可以运行的一段代码。

因此,例如:

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

scala> doTwice({println("Hi")}) 
Hi 
Hi 

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

这里的 “SOMETYPE” 为单位,因为println不产生价值。如果它产生了Int,那将是=>Int

+1

哦,我明白了。谢谢!这是我讨厌scala的原因。这是很荒唐的谷歌这样的事情:)感谢上帝的好人和计算器:) – Arg

+4

不错的例子。在这里,“op”被称为* call by *参数(而不是*由值*)。请注意,编写'doTwice(println(“Hi”))''同样适用。当你在Scala中调用一个函数时,语法不会指出你是通过* name *还是* value *传递参数。 –

+2

@Arg [SymbolHound](http://symbolhound.com/)是你的朋友。 –

2

这只是一种不带参数的函数值。 Owen的例子很酷,只知道“A => B”是一个函数,其参数具有类型A,返回值类型为B,“=> B”是不带参数并返回的函数一个B型值。

6

它表示两件事。首先,由于前缀=>,它表示参数将通过by name。然后,它表示传递参数的类型必须是SomeType

有人混淆了这两个,认为=> SomeType是一种类型 - 它不是。它是两件事的结合:参数评估策略和参数类型。

因此,由名字叫简要说明,如果维基百科的链接并没有把事情说清楚,如果你有这样的:

def f[A](x: => A) = { x; x } 
f(some stuff) 

然后斯卡拉将这样执行此:

{ some stuff; some stuff } 

论价值的看涨,会发生什么情况更是这样的:

val x = some stuff 
{ x; x } 

还要注意参数是总是按价值评估,但只有一次。按名称呼叫时,参数决不会被评估(例如,如果它位于if的非执行分支上),但可以多次评估。

+1

[A]在这种情况下代表什么?我曾在很多地方看过它,但仍然没有看到它 –

+1

@elimence这是一个_type parameter_。它是一种在声明'f'处未知的类型,但在使用'f'的点处已知。函数'f'对所有类型'A'都是有效的,在这种情况下,'A'可以是什么都没有限制。我可以使用'A <:SomeConcreteType'来表示下边界('A'必须是SomeConcreteType或它的子类型),'A>:SomeOtherType'('A'必须是'SomeOtherType'的超类) ,并且指出'A'必须是某个隐含参数的一部分,这会导致对'A'的任意限制。 –

+0

谢谢丹尼尔,现在就明白了 –