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