2011-08-29 28 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

謝謝丹尼爾,現在就明白了 –