簡體   English   中英

Ruby:使用默認值在多參數函數上指定單參數的值

[英]Ruby: specifying value of single argument on multiple argument function with default values

來自python背景,我習慣於運行僅提供所需參數的函數:

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

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

Ruby似乎為可選參數提供了相同的語法:

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

但是運行f(b=3)打印3 2

我的猜測是,它會在函數調用發生之前評估b=3 ,並將其作為第一個參數傳遞。

這種解釋正確嗎?有沒有辦法調用提供任意參數的函數?

f(b=3)表示創建的本地變量b ,其值分配為3 ,然后將其作為參數傳遞。 在您的方法中,實際參數a值為3b為其默認值2

因此, 運行f(b=3)打印3 2

在Ruby中,當您調用方法時,您只是將值傳遞給方法的實際參數,而沒有范圍從方法調用區域設置其實際參數的值。

您應該使用Keyword Arguments來滿足您的需求。 我不會寫代碼,就像@sawa為您做的那樣。

注意,所有參數都在方法調用之前進行求值。 如果執行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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM