2014-02-11 40 views
0

从蟒蛇背景的多参数功能单一参数的指定值,我已经习惯了运行只提供我需要的参数功能:红宝石:在使用默认值

def f(a=1,b=2) 
    print a,b 

f(b=3) #prints "1 3" 

红宝石似乎提供可选参数相同的语法:

def f(a=1, b=2) 
    puts "#{a} #{b}" 
end 

但运行f(b=3)打印3 2代替。

我的猜测是它正在评估b=3之前函数调用发生,并将其作为第一个参数传递。

这个解释是否正确,是否有一种方法可以调用提供任意参数的函数?

回答

2

请注意,所有参数都是在方法调用之前评估的。如果您使用f(b = 3),则首先发生值为b = 3的值,其返回值为3,并将其用作参数,因此它与f(3)相同。由于您只提供一个参数,因此它将被解释为第一个参数a,而默认值将用于b

您正在使用错误的构造。这是要做的方法:

def f a: 1, b: 2 
    puts "#{a} #{b}" 
end 
f(b: 3) 
# => 1 3 

它使用Ruby 2.0中引入的关键字参数,如Arup的答案链接到的页面中所述。

这是Ruby 1.8,Ruby 1.9的解决方法。

def f h = {} 
    h[:a] ||= 1 
    h[:b] ||= 2 
    puts "#{h[:a]} #{h[:b]}" 
end 
f(:b => 3) # Ruby 1.8 
f(b: 3) # Ruby 1.9 
# => 1 3 
+0

不幸的是我得到的函数定义语法错误:'语法错误,意想不到的“:”,希望“\ n”或“;”'。这个语法在Ruby 1.8上可用吗? – goncalopp

+0

@goncalopp你使用Ruby'2.0.0'吗? As *关键字参数*仅在此处可用。 –

+0

@ArupRakshit不,我仍然在'1.8'(硬性要求)。有什么解决方法吗? – goncalopp

3

f(b=3)表示创建值为3的局部变量b,然后将其作为参数传递。子方法实际参数a得到的值为3,b的默认值为2

因此运行f(b=3)打印3 2而不是

在Ruby中,当您调用方法时,您只是将值传递给方法实参,没有范围从方法调用区域设置实参的值。

您应该使用Keyword Arguments来满足您的需求。我不会写代码,因为@sawa是为你做的。

+1

这是正确的解释+1 – Abdo