2011-06-01 48 views

回答

3

你總是可以定義需要的參數任意數量的方法:

def foo(*args) 
    puts args.inspect 
end 

這不正是你想要的東西,但只適用於以這樣的方式定義的方法。

*args表示法在這種情況下表示「零個或多個參數」。與之相反的是splat操作符,它將它們展開成一個列表,對調用其他方法很有用。

作爲說明,* - 任選參數必須在參數列表中排在最後。

+0

嗯,並且不幸的是不能用命名參數(所以在實例化時不會創建'a')。很好的回答,雖然 – 2011-06-01 22:16:43

+0

@juwiley:看到我的答案與模糊命名參數類似。 – 2011-06-01 22:22:25

3

如果按照您指定的方式定義方法,則始終有3個參數,或者方法調用無效。所以「所有參數」已經爲您定義。所以你只需改變你的方法:

​​

要定義一個可以與任何ARGS被稱爲(並隨後訪問這些參數),你可以做這樣的事情的方法:

def foo(*args) 
    args 
end 

什麼*確實將該點之後的所有參數放入數組中。

+0

嘿艾米莉,我想的是通過爭論,我得到的方法循環,​​提高如果有錯誤的用例他們中的任何一個都沒有或沒有特定的班級。我想這樣做在一個班輪,而不是說「提高如果a.nil?||| a.kind_of?(整數)」 – 2011-06-01 21:26:12

+0

嗯,我不知道任何方式直接得到所有的論點,但是你至少可以簡化條件來做類似'raise ArgumentError if [a,b,c] .any?{| arg | arg.nil?或arg.kind_of?整數}' – Emily 2011-06-01 21:44:07

+0

是的,我結束了類似的東西 – 2011-06-01 22:17:55

2

正如其他人指出的,你可以使用圖示操作符(*)來實現你想要的。如果你不喜歡這樣的話,你可以使用Ruby方法可以將hash作爲最後一個參數,並使用更好的語法。

def foo(args) 
    raise ArgumentError if args.keys.any? { |arg| arg.nil? || !arg.kind_of?(Integer) } 
end 

puts foo(:a => 1, :b => 2, :c => "a") # raise an ArgumentError 

要訪問參數的方法中,你必須使用args[:a]

相關問題