簡體   English   中英

方法的ruby關鍵字參數

[英]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)

兩個筆記:

  1. 在Ruby中,在大多數情況下調用方法時,不需要在{}中包圍參數哈希,除非你有一些復雜的事情,如傳遞多個哈希值。 在這種情況下,請確保用{}包圍這些參數
  2. Ruby是動態類型的,因此在定義方法時不需要說params是一個哈希值。

由於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.

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