2014-02-11 74 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