[英]ruby keyword arguments of method
我怎樣才能像rails一樣用關鍵字參數聲明一個方法。 一些例子可能是
Person.find(:all, :conditions => "...").
如何使用符號創建類似於上述的方法?
我對紅寶石很新。 提前致謝!
Ruby實際上沒有關鍵字參數。 Rails正在利用Ruby的一個功能,它可以省略哈希周圍的大括號。 例如,使用find
,我們真正稱之為:
Person.find(:all, { :conditions => "...", :offset => 10, :limit => 10 } )
但是如果哈希是方法的最后一個參數,你可以省略大括號,它仍將被視為哈希:
Person.find(:all, :conditions => "...", :offset => 10, :limit => 10)
您可以在自己的方法中使用它:
def explode(options={})
defaults = { :message => "Kabloooie!", :timer => 10, :count => 1 }
options = defaults.merge(options)
options[:count].times do
sleep options[:timer]
puts options[:message]
end
end
然后叫它:
explode :message => "Meh.", :count => 3
或者在沒有參數的情況下調用它,導致使用所有默認值:
explode
從Ruby 2.0開始,ruby 確實有關鍵字參數 。
def my_method(arg1, name: 'defaultName', number: 0)
puts arg1, name, number
end
我同意Samir Talwar和christopherwright給出的公認答案。 唯一可能的缺點是,如果您使用不正確的關鍵字符號作為參數或查找選項時沒有警告,它最終會被忽略。 如果這是你關心的事情,那么gem hash_keyword_args會解決它。 這個成語是
def explode(opts={})
opts = opts.keyword_args(:message => "Kabloooie!", :timer => 10, :count => 1)
opts.count.times do
sleep opts.timer
puts opts.message
end
end
請注意使用訪問器方法,以便在輸入關鍵字時輸入NoMethodError。 調用行為是:
explode(:message => "Okay") # works
explode(:msg => "Oops") # raises ArgumentError
gem還提供了一些您可能或可能不關心的其他功能,例如能夠指示需要關鍵字。 我一直在愉快地使用它一段時間了。
(免責聲明:我是寶石的作者。)
您只需要定義一個方法,其中一個參數是哈希值。 它實際上非常簡單。
def method(arg1, params)
name = params[:name]
number = params[:number]
然后把它稱為:
method(arg1, :name => 'Eric', :number => 2)
兩個筆記:
由於Ruby是動態輸入的,所以只需:
def my_method(arg1, arg2)
#things
end
例:
my_method(:test, {:somehash => "yay"})
要么
my_method :test, :somehash => "yay"
要么
my_method(:test, :somehash => "yay")
Ruby 2.0引入了真正的關鍵字參數,Ruby 2.1添加了必需的關鍵字參數。
在https://chriszetter.com/blog/2012/11/02/keyword-arguments-in-ruby-2-dot-0/上有一篇很好的文章,我從那里借用了這些例子:
Ruby 2.0+:
def exclaim(text, exclamation: '!', number: 7)
text + exclamation * number
end
exclaim('hello', number: 4) #=> 'hello!!!!'
# equivalent:
exclaim('hello', {:number => 4}) #=> 'hello!!!!'
Ruby 2.1+:
def exclaim(text, exclamation: '!', number:)
text + exclamation * number
end
exclaim('Yo', number: 5) # => 'Yo!!!!!'
exclaim('Yo') # raises: ArgumentError: missing keyword: number
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.