2009-06-10 4 views

Répondre

16

Si vous utilisez Rails (pas tout simplement Ruby), une méthode légèrement plus courte est

def foo(options = {}) 
    options.reverse_merge! { ... defaults ... } 
end 

Ceci a l'avantage de vous permettre de faire plusieurs lignes un peu peu plus proprement:

def foo(options = {}) 
    options.reverse_merge!(
    :some_default => true, 
    :other_default => 5 
) 
end 
+1

Juste ce que je cherchais, merci. J'ai aussi découvert que si vous n'utilisez pas Rails, le facem gemme aussi des patchs de singe Hash avec un reverse_merge! méthode. –

+1

Notez que vous n'avez pas besoin d'utiliser tous les Rails pour obtenir cette méthode (bien que cela puisse ne pas être vrai lorsque cette réponse a été publiée en 2009). Vous avez juste besoin d'utiliser la gemme 'activeupport' (qui est incluse dans Rails), puis assurez-vous que vous avez appelé' require 'support_support/core_ext/hash/reverse_merge "'. – GMA

19
def foo(options = {}) 
    options = { ... defaults ... }.merge(options) 
end 
4

Il est généralement préférable d'encapsuler les valeurs par défaut en toute sécurité dans un hachage déclaré comme constante. Par exemple:

require « ostruct »

require 'ostruct' 

class Tiger < OpenStruct 
    DEFAULTS = { 
    :num_stripes => 12, 
    :max_speed => 43.2 
    }.freeze 

    def initialize(options = { }) 
    super(DEFAULTS.merge(options)) 
    end 
end 

tiger = Tiger.new(:max_speed => 19.95) 

puts tiger.max_speed 
puts tiger.num_stripes 

Il est important de noter lors de la fusion des objets de hachage que les clés de chaîne et le symbole sont différents et ne seront pas combinés que vous pourriez attendre. Dans l'environnement Rails, vous pouvez toujours convertir l'un à l'autre en utilisant Hash # symbolize_keys ou en les déclarant HashWithIndifferentAccess qui mappe la différence pour vous.

3

Au cas où quelqu'un verrait ceci de google, cette question est vieille et démodée. La réponse moderne et beaucoup plus propre (avec Ruby> 2.0) est d'utiliser des arguments de mots-clés. Ils ont plusieurs avantages. 1.12) Vous pouvez exiger le nom de la clé dans le hachage. (en ruby> 2.1)

2.) vous n'avez pas besoin de "déballer" le hachage dans la fonction. Les clés vous sont simplement transmises en tant que variables. (Donc vous ne devez pas faire comme speed = opts[:speed])

3.) Il est plus propre

def foo(num_stripes: 12, **rest) 
    print num_stripes, rest 
end 

foo({max_speed: 42}) # would print '12, {max_speed: 42}' 

voir docs rubis complet ici: http://www.ruby-doc.org/core-2.1.0/doc/syntax/methods_rdoc.html#label-Array%2FHash+Argument

et un bon petit poste de blog ici: http://robots.thoughtbot.com/ruby-2-keyword-arguments

Questions connexes