2011-03-09 32 views
11

Ruby on Rails 3 kullanıyorum ve bir fonksiyon argümanının yakınında bir * operatörünün varlığının ne anlama geldiğini bilmek ve diğer senaryolardaki kullanımlarını anlamak istiyorum.* (yıldız işareti) sembolü bir işlev argümanının yanında ne yapar ve bunu başka senaryolarda nasıl kullanır?

Örnek senaryo (bu yöntem Ruby on 3 çerçeve ile ilgili olarak):

def find(*args) 
    return to_a.find { |*block_args| yield(*block_args) } if block_given? 

    options = args.extract_options! 

    if options.present? 
    apply_finder_options(options).find(*args) 
    else 
    case args.first 
    when :first, :last, :all 
     send(args.first) 
    else 
     find_with_ids(*args) 
    end 
    end 
end 

cevap

34

Bu, yakuttan gelen (ve dolayısıyla raylara özel olmayan) splat operatörüdür. Kullanıldığı yere bağlı iki şekilde uygulanabilir:

  • için "paket"
  • bir argüman listesindeki

yılında içine bir dizi bölmek bir diziye argümanları bir dizi İşleviniz, işlev tanımında kullanılan uyarıcı operatörü görürsünüz. Sonuç, fonksiyonun herhangi bir sayıda argümanı kabul etmesidir. Tam argüman listesi bir dizi olarak args'a konacaktır.

def bar(a, b, c) 
    a + b + c 
end 

Tam üç argüman gerektirir: aşağıdaki yöntemi göz önüne aldığımızda

def foo(*args) 
    args.each_with_index{ |arg, i| puts "#{i+1}. #{arg}" } 
end 

foo("a", "b", "c") 
# 1. a <== this is the output 
# 2. b 
# 3. c 

ikinci varyant olacaktır.

my_array = [1, 2, 3] 
bar(*my_array) 
# returns 6 

bölmek ve yönteme bağımsız bir parametre olarak dizinin her öğesi geçecek dizi bu durumda uygulanan uyarısı aşağıdaki gibi Artık, bu yöntem çağırabilir. Hatta foo arayarak aynı yapabilirdi: Eğer örnek yönteminde görebileceğiniz gibi, bu kurallar aynı şekilde parametrelerini engellemek için

foo(*my_array) 
# 1. 1 <== this is the output 
# 2. 2 
# 3. 3 

uygularım.

2

Bu temelde yönteme geçirilen herhangi bir 'ekstra' bağımsız tümü atanacak demektir splat argüman, bir * args.

İlgili konular