2011-08-29 91 views
7

這工作如何定義無參數函數的scala類型?

def func(f: => Int) = f 

這不到風度(內部類爲例)

type EmptyFunct = => Int 

type EmptyFunct = (=> Int) 

斯卡拉版本2.9 兩個問題:

  1. 爲什麼dosn't語法糖在第二種情況下工作?
  2. 如何定義不通過語法糖這個功能呢?
+0

你能給EmptyFunct'的'使用顯示爲什麼'()=> Unit'的例子不適合你的需要? – Nicolas

回答

12

=> int是不完全不帶參數的函數,它是一個int參數與由名字傳遞約定呼叫。 (當然,這是相當好的一點,因爲它通過傳遞一個沒有參數的函數來實現)。

的功能,但沒有參數寫入() => Int。你可以做type EmptyFunct =() => Int

這是不是一個類型。在函數內部,f將被輸入爲Int。類型()=> Int的參數不會。

def func(f: => Int) = f *2 

func (: => Int) Int

def func(f:() => Int) : Int = f*2 

error: value * is not a member of() => Int

+0

那麼有沒有辦法創建無參數(:=> Unit)函數的集合? – yura

+0

見我回應:'收藏[Function0 [單位]]' – Nicolas

+0

如果你正在尋找(=>單位*)反覆論證,這是不允許的。的確,這隻能是Seq [Unit](Seq包含值,而不是調用約定的參數)。而且相當無用。你想要的是Seq [Function0 [Unit]](或Seq [()=> Unit],它意味着同樣的事情)。符號將不太方便:()=> X + = 1而不是X + = 1 –

3

您應該使用Function0

在第一種情況下,它不工作,因爲你聲明瞭一個非參數的功能,但因爲你表示該參數的名字叫。

+0

這不是我的問題的解決方案。因爲Function0實際上具有type()=> T not(=> T),而我根本沒有這個功能。 – yura

0

我沒有看到一個方法太大的意義,返回一個int,無參數調用。要麼它返回一個常量,所以你可以使用常量,或者它會使用一個var?

所以,讓我們用VAR:

var k = 10 
val fi = List (() => k * 2,() => k - 2) 
val n = fi(0) 
n.apply 
k = 11 
n.apply 

結果是20,那麼22

+0

「我在方法中看不到多少意義,返回一個int,調用時沒有參數。」櫃檯? – Nicolas

+0

或者任何在創建階段都有其所有上下文的回調函數 – yura