2010-03-17 19 views
18

Tıpkı rayların yaptığı gibi anahtar kelime argümanlarıyla bir yöntemi nasıl bildirebilirim. Bazı örnekler yukarıdaki gibi benzer yöntemler oluşturmak için sembolleri kullanabilir miyim?ruby ​​anahtar sözcüğü argümanları

Çok yakıcıyım. Şimdiden teşekkürler! Yakut dinamik yazılan yana

+0

Bunlar anahtar kelime argümanları değil. Bunun yerine, bu tekniğin nasıl uygulanacağını öğrenmek için bu argümanları alan yöntemlerin kaynak koduna bakabilirsiniz. Fikirler için 'ActiveRecord :: Base.find' (http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263) belgesine bir göz atın. – yfeldblum

cevap

37

Ruby'de anahtar kelime argümanları yok. Raylar, bir hashın etrafındaki parantezleri çıkarmanıza izin veren bir Ruby özelliğini kullanıyor.

Ama karma yöntemin son argüman ise, parantez dışında bırakabilir ve hala bir karma olarak kabul edilir: Örneğin, find ile, ne gerçekten aradığınız ise

Person.find(:all, :conditions => "...", :offset => 10, :limit => 10) 
kendi yöntemlerde kullanabilirsiniz

: o zaman

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 

Ve diyoruz:

explode :message => "Meh.", :count => 3 

Ya da tüm varsayılan değerler sonuçlanan bir argüman olmadan çağırır kullanılıyor: Sadece parametrelerden biri karma bir yöntem tanımlamak gerekir

explode 
+6

Bu cevap şimdi (kısmen) güncel değil. Ruby 2.0, gerçek anahtar kelime argümanlarına sahiptir. Bununla birlikte, son argüman karmalarını kullanma kuralıyla sneakily uyumludurlar: anahtar kelimeleri bekleyen bir yönteme sembol anahtarlarıyla bir karma aktarırsanız, Ruby bunları anahtar kelime argümanlarına aktarabilir. Raylar hala Ruby 1.9 ile uyumluluk sağlamak için Ruby 2.0'ın anahtar kelime argümanlarını kullanmıyor. – Peeja

0

, sadece yapın:

def my_method(arg1, arg2) 
    #things 
end 

örnek:

my_method(:test, {:somehash => "yay"}) 

veya

my_method :test, :somehash => "yay" 

veya

my_method(:test, :somehash => "yay") 
1

. Aslında oldukça basit.

method(arg1, :name => 'Eric', :number => 2) 

iki not:

  1. Ruby, sen yöntemini çağırdığınızda parametreler} {yılında karma çevreleyen gerekmez sonra

    def method(arg1, params) 
        name = params[:name] 
        number = params[:number] 
    

    Ve gibi çağrı Çoğu durumda, birden fazla karmaşayı geçmek gibi karmaşık bir şey olmadıkça. Bu durumda, bu parametreleri {}

  2. Ruby ile dinamik olarak yazdığınızdan emin olun, böylece yöntemi tanımladığınızda paramların bir karma olduğunu söylemeniz gerekmez.
6

Samir Talwar ve christopherwright tarafından verilen kabul edilmiş bir cevaba katılıyorum. Potansiyel tek olumsuz yanı, bir argüman olarak yanlış bir anahtar kelime sembolü kullanırsanız veya bir seçenek ararken, hiçbir zaman ihmal edilmez. Eğer endişe duyduğunuz bir şey varsa, mücevher hash_keyword_args adresleri.Bir anahtar kelime yanlış yazarsanız, bir NoMethodError alırsınız deyim

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 

Bildirimi erişimci yöntemlerinin kullanılması olacaktır. Ve çağıran davranıştır:

explode(:message => "Okay") # works 
explode(:msg => "Oops")  # raises ArgumentError 

mücevher da böyle bir anahtar kelime gerekli olduğunu belirtmek için edememek gibi ya umurumda olmayabilir belki birkaç diğer özellikleri sağlar. Şimdi bir süreliğine mutlu bir şekilde kullanıyorum.

(Yasal Uyarı:. Ben mücevher yazarım)

0

Ruby 2.0, gerçek anahtar kelime bağımsız değişkenlerini tanıttı ve Ruby 2.1 gerekli anahtar kelime bağımsız değişkenlerini ekledi.

güzel makale bu konuda https://chriszetter.com/blog/2012/11/02/keyword-arguments-in-ruby-2-dot-0/ de var kalmış, oradan örnekler ödünç ettik:

Yakut 2.0+:

def exclaim(text, exclamation: '!', number: 7) 
    text + exclamation * number 
end 

exclaim('hello', number: 4) #=> 'hello!!!!' 

# equivalent: 
exclaim('hello', {:number => 4}) #=> 'hello!!!!' 

Yakut 2.1+:

def exclaim(text, exclamation: '!', number:) 
    text + exclamation * number 
end 

exclaim('Yo', number: 5) # => 'Yo!!!!!' 
exclaim('Yo') # raises: ArgumentError: missing keyword: number 
İlgili konular