2012-03-15 27 views
6

Bazı kodunda bir üçlü rastladım ve sorun anlama yaşıyorum koşullu:Ruby'de bu üçlü koşulu nasıl okursunuz?

str.split(/',\s*'/).map do |match| 
    match[0] == ?, ? 
    match : "some string" 
end.join 

Ben belli noktalarda bir dize bölme ve bir diziye toplam neticenin ve uğraşıyorum anlıyoruz sırayla dizinin her elemanı. Bunun ötesinde ne olup bittiği hakkında hiçbir fikrim yok. Bu yazma

cevap

7

A (biraz) daha az kafa karıştırıcı yoludur:

str.split(/',\s*'/).map do |match| 
    if match[0] == ?, 
    match 
    else 
    "some string" 
    end 
end.join 

Ben satırlı üçlü ifadeleri korkunç olduğunu düşünüyorum, if blok Ruby dönebilirsiniz özellikle.

Muhtemelen en kafa karıştırıcı şey, bir karakter literal olan ?,'dur. Ruby 1.8'de bu, karakterin ASCII değeri anlamına gelir (bu durumda 44), Ruby 1.9'da bu sadece bir dizedir (bu durumda ",").

Sadece "," yerine bir karakter değişmezi kullanmanın nedeni, Ruby 1.9'da değiştirilen bir dizede [] aramasının geri dönüş değeridir. In 1.8 it returned the ASCII value of the character at that position, in 1.9 it returns a single-character string. ?,'u kullanarak, Ruby 1.8 & 1.9 arasındaki String#[] arasındaki farklar hakkında endişelenmenize gerek kalmaz. match ilk karakter, , ise

Sonuçta şartlı sadece kontrol edilir ve değerini aynı tutar eğer öyleyse, aksi halde "some string" için onu ayarlar.

+0

Teşekkürler @AndrewMarshall, 'match == (?,) Olsaydı yardımcı olurdu? eşleşme: "bazı dize" '? Yoksa bu başka bir şey anlamına mı geliyor? – ismail

+0

@IsmailTabtabai Bu aynı olurdu. Üçlü ifadeler yaptığımda, genellikle tüm koşullu ifadeyi nerede olduğu açıkça belirtmek için parantez içinde sardım, ama bu sadece bir stil. Karakter edebileri muhtemelen Ruby'nin daha az bilinen sözdizimsel yapılarından biridir ve ne olduğunu bilmediğinizde (özellikle diğer '' 'lerle eşleştirildiğinde) kafa karıştırıcı olabilir. –

+0

Aynı şey anlamına geliyor. Yani [0] ==?,? eşleşme: "bazı dize" – Bijan