2012-02-29 74 views
30

究竟方法參數的該聲明是指:功能參數類型和=>

def myFunc(param: => Int) = param 

什麼是=>在上定義的含義?

+19

將來會使用[Symbol Hound](http://symbolhound.com)。 – 2012-03-01 16:29:13

+0

[Scala - '=> SomeType'是什麼意思?](http:// stackoverflow。com/questions/7225308/scala-what-do-sometype-means) – 2012-03-01 16:29:30

+0

不知道我是怎麼沒找到它的......認爲我應該換我的眼鏡...... :) – PrimosK 2012-03-01 19:59:08

回答

51

這就是所謂的通過名稱。這意味着你傳遞的函數應該返回Int,但主要用於實現參數的懶惰評估。它有點類似於:

def myFunc(param:() => Int) = param 

這裏是一個例子。考慮一個answer函數返回一些Int值:

def eagerEval(x: Int) = { println("eager"); x; } 
def lazyEval(x: => Int) = { println("lazy"); x; } 

現在執行兩者使用answer

def answer = { println("answer"); 40 } 

和兩個功能,一是Int按姓名採取Int和一個以

eagerEval(answer + 2) 
> answer 
> eager 

lazyEval(answer + 2) 
> lazy 
> answer 

第一種情況是obvi ous:在致電eagerEval()answer進行評估並打印"answer"字符串。第二種情況更有趣。實際上,我們將功能傳遞給lazyEval()lazyEval首先打印"lazy"並評估x參數(實際上,調用x函數作爲參數傳遞)。

又見

+0

很好的解釋! +1 – PrimosK 2012-02-29 23:23:12

+2

您想要的術語是「按名稱傳遞」 - 不是「按值傳遞」。按價值傳遞是完全不同的;這是Java對基元的作用。 – Destin 2012-02-29 23:31:01

+4

我認爲你的意思是「按名稱」,而不是「按名稱傳遞」或「按價值傳遞」(見語言規範4.6.1) – 2012-02-29 23:59:18

10

只是爲了確保存在使用適當的期限答案:Scala語言規範使用術語的call-by-名

值參數的類型可以用=>來定義,例如x:=> T。 這樣一個參數的類型就是無參數方法type => T。這表明 相應的參數不是在函數應用程序點評估的,而是 而不是在函數內的每次使用時評估。也就是說,參數 評估使用調用名爲

- 的Scala Language Specification

6

4.6.1節要添加到托馬斯Nurkiewicz的回答以上,我之間遇到的差值()=> int和=> int是第二允許與裸塊調用:

scala> def myfunc(f :() => Int) = println("Evaluated: " + f) 
myfunc: (f:() => Int)Unit 

scala> def myfunc2(f : => Int) = println("Evaluated: " + f) 
myfunc2: (f: => Int)Unit 

scala> myfunc({1}) 
<console>:9: error: type mismatch; 
found : Int(1) 
required:() => Int 
       myfunc({1}) 
       ^

scala> myfunc2({1}) 
Evaluated: 1 
相關問題