2015-07-29 26 views
7

sadece tek bir String elemanının oluşan bir dizi ile arama için bir kısaltması olarak kullanılır, Dizge veya Dizge alan bir Ruby yöntemi nasıl tanımlanır?

def list(projects) 
    puts projects.join(', ') 
end 

list(['a', 'b']) 

Ancak

gibi (String arasında) bir dizi alan bir yöntem, tanımlanmıştır, İsterdim Aynı işlev aynı zamanda tek bir düz Dize gibi tek bir dize de kabul etmek için , bu yöntemin içinde işlemek için Ruby yolu ne olurdu?

Örneğin, giriş tipini kontrol edebilirsiniz
+3

'Array (projeler) .join (',')' –

+1

Bu yorumu yanıtlayın, doğru yoldur. – DGM

+0

Ciddi şekilde, @LeeJarvis, bunu bir cevap olarak gönderin, böylece onu destekleyebiliriz. –

cevap

5

Neden böyle bir şey: Eğer

memnun olarak

def list(*projects) 
    projects.join(', ') 
end 

Sonra birçok argümanlarla diyebilirsin

list('a') 
#=> "a" 
list('a','b') 
#=> "a, b" 
arr = %w(a b c d e f g) 
list(*arr) 
#=> "a, b, c, d, e, f, g" 
list(arr,'h','i') 
#=> "a, b, c, d, e, f, g, h, i" 

Uyarılar (*) tüm argümanları otomatik olarak bir Array'a dönüştürecek, bu da bir Array ve/veya bir String'i sorun yaşamanıza izin verecektir. Bu diğer nesnelerle iyi çalışır çok

list(1,2,'three',arr,{"test" => "hash"}) 
#=> "1, 2, three, a, b, c, d, e, f, g, {\"test\"=>\"hash\"}" 

iç içe Diziler işleyebilir Array#join işaret için size @Stefan ve @WandMaker ederiz

+2

Diziyi argümanlara bile eklemeniz gerekmez. –

+1

@SergioTulentsev Biliyorum, hatalardan endişe duymadan kullanılabilecek tüm yolları göstermek istedim. Artı başlangıçta orada düzlük yoktu ve sonra OP gerçek bir dizi geçmek istedi bu yüzden bu işlemek için en kolay yolu olacağını düşündüm. – engineersmnky

+0

Neden 'flatten' gerekli? Projects.join (',') 'ı denediğimde istenen sonuç vermek için –

4

:

def list(projects) 
    if projects.is_a? Array 
     puts projects.join(', ') 
    else 
     puts projects 
    end 
end 

list('a') # a 
list(['a', 'b']) # a, b 

You: Bir şey bağlantı ile sona ereceğini

>> a = ['foo', 'bar'] 
=> ['foo', 'bar'] 
>> a.is_a? Array 
=> true 

ayrıca is_a?

ile dize kontrol edebilirsiniz Ruby, respond_to? ve kind_of?'da bunu yapmanın birçok yolu var.

1

bir yolu girişi tip-kontrol edebilir olacaktır:

def list(projects) 
    if projects.is_a?(String) 
    projects = [projects] 
    end 
    puts projects.join(', ') 
end 

Yoksa bir diziye bir dize otomatik dönüştürme Array() kullanın veya tek başına var olan bir dizi bırakabilir:

def list(projects) 
    Array(projects).join(', ') 
end 
1

isterim o join yanıt verirse sağlanan değerini sormak :

def list(projects) 
    projects.respond_to?(:join) ? projects.join(', ') : projects 
end 
1
def list(projects) 
    puts ([*projects]).join(', ') 
end 

list(['a', 'b']) 
a, b 
list('a') 
a 

Bir uyarı: Bunu kullanmayın.

Bu çözümü yalnızca kullandığı numarayı göstermek için gönderdim. @sawa, silinen cevabında haklıdır: yöntemin kullanıcılarının bir diziyi argüman olarak iletmesine izin verilmemelidir. Bunun yerine, bireysel unsurları geçmekle sınırlandırılmalıdırlar.Eğer:

list 1 
list 1,2 
list 1,2,3 
list *arr 

ancak:

arr = [1,2,3] 

yöntem aşağıdakilerden biri aranmak

list arr 

Bu yöntem kolaylaştırır ve uygulama daha tutarlı hale getirir. Kendinize şunu sorun: neden *arr yerine arr izin verin? Bir karakteri kurtarmak için mi?

Bunu yapan yöntem, @ engineersmnky'nin .flatten numaralı yanıtıyla kaldırıldı.

+0

[sawa'nın cevabı] 'nın geri alınmasına oy verdim (http://stackoverflow.com/a/31704638/477037), * ya * bir dizi kabul * veya * bir nesne listesi gidilecek yoldur. Her ikisini de ele geçirmeye çalışmak zahmetli. – Stefan

+1

@Stefan, Bir yanıtın iptali için oy kullanabileceğini bilmiyordum. Bu garip, ama şimdi iki oy var. Belki de sawa isteklerimize boyun eğecek ve gönüllü olarak geri alacaktır. –

+0

Kayıt için 'flatten' kaldırmayı önermedim :) –

İlgili konular