2010-12-29 39 views
10

Ben uyarısı operatörü kabul eden bir yöntem vardır:bir yöntem çağrısı bağımsız değişken olarak bir dizinin elemanlarını gönderme

def hello(foo, *bar) 
    #... do some stuff 
end 

Ben bu merhaba yöntem haline göndermek istiyorum değişken uzunlukta bir dizi var :

arr1 = ['baz', 'stuff'] 
arr2 = ['ding', 'dong', 'dang'] 

o yönteme argüman olarak arr1 ve ARR2 ile yöntemini aramak istiyorum ama bunun yerine bireysel tartışmaların bir dizi olarak yorumlanır edildiğini * çubuğunda takıldığım tutun. İşleri daha eğlenceli hale getirmek için, merhaba yöntemini hiç değiştiremem.

this SO question'a benzer bir şey arıyorum ama yakutta.

+1

Bazı kodlar çok yardımcı olabilir. –

+0

Lütfen en yararlı cevabın solundaki içi boş onay işaretinin içine tıklayarak sorularınıza doğru cevapları kabul edin. Teşekkürler! :) –

cevap

11

bu

hello(arr1, *arr2) 

gibi çağrılabilir deneyin burada bir çalışma ikinci diziye * ekleyerek irb

irb(main):002:0> def hello(foo, *bar) 
irb(main):003:1> puts foo.inspect 
irb(main):004:1> puts bar.inspect 
irb(main):005:1> end 
=> nil 
irb(main):006:0> arr1 = ['baz', 'stuff'] 
=> ["baz", "stuff"] 
irb(main):007:0> arr2 = ['ding', 'dong', 'dang'] 
=> ["ding", "dong", "dang"] 
irb(main):008:0> hello(arr1, arr2) 
["baz", "stuff"] 
[["ding", "dong", "dang"]] 
=> nil 
irb(main):009:0> hello(arr1, *arr2) 
["baz", "stuff"] 
["ding", "dong", "dang"] 
=> nil 

yoluyla, öyle bir dizinin yerine bir olarak kabul eder dizisi dizisi, sizin için aradığınız şey budur.

+0

teşekkürler, bu tam olarak ne oluyordu. Ben argümanlar geçtiğinde 'bar.class' dediğimde bile diziyi görüyordum. Bir dizi dizi olabileceğini düşünmemiştim. – brycemcd

8

Buradan başlayabilirsiniz:

hello('Something', *(arr1 + arr2)) 

Bu arr1 ve arr2 dizileri birleştirir ve toplu yönteme ikinci argüman onları geçmektedir.

Örnek: bir yöntemin son parametre bir yıldız (*) olması olabilir

>> def hello(str, *args) 
>> puts str 
>> args.each do |arg| 
?> puts 'Splat: ' + arg 
>> end 
>> end 
=> nil 
>> hello('Hello', *(['programming'] + ['is', 'fun'])) 
Hello 
Splat: programming 
Splat: is 
Splat: fun 
=> ["programming", "is", "fun"] 

, bu daha fazla parametre işleve geçirilen olabileceğini göstermektedir. Bu parametreler toplanır ve bir dizi oluşturulur.

Son parametreler bir diziye toplandığından, yönteme gerçekten bir dizi gönderiyor olduğunuzu ve argümanları başka bir dizide sarmaması gerektiğini belirtmek için * işlecini kullanmanız gerekir.

+0

Gerçek kod yerine ekran görüntülerini yapıştırmayı tercih etmenizin bir nedeni var mı? –

+0

@Mladen Jablanovic Hiç bir neden yok aslında, aslında isterseniz kodu yapıştıracağım. –

+3

Teşekkürler. Sanırım birisi aslında kodu basacak, basılı kağıdı tarayacak ve görüntü olarak ekleyecektir. :) –

İlgili konular