2016-03-26 29 views
2

için sayısal 0 veya 1 döndüren bir işlev işlevi Bir dizede harfler dizisine bölerek bir dizedeki ünlülerin sayısını saymaya çalışıyorum ve daha sonra harfleri 1 ile eşleştirip diziyi toplamaya çalışıyorum.doğru veya yanlış

def count_vowels(string) 
    vowels = ['a','e', 'i', 'o', 'u'] 
    return string.split("").map{ |n| vowels.include? n ? 1 : 0}.inject(0,:+) 
end 

include? kısmı doğru 1 veya 0 döndürmez. Bunun neden uçmayacağı konusunda bir önerin var mı?

Ben çalışan bu sürümle kesmek, ama aptal görünüyor tür:

def count_vowels(string) 
    vowels = ['a','e', 'i', 'o', 'u'] 
    return string.split("").map{ |n| vowels.include? n}.inject(0) do |mem,x| 
     x ? mem + 1 : mem 
    end 
end 
+5

'string.count (" aeiou ") – steenslag

cevap

6

nedeni:

string.split("").map{ |n| vowels.include? n ? 1 : 0}.inject(0,:+) 

n ? 1 : 0 çünkü bir argüman olarak değerlendirilir ve geçirilir edilir çalışmıyor n yerine include?. Sen include? bazı parantez eklemek gerekir: Sadece size include? yöntem parametresi için parantez gerek Bu durumda

def count_vowels(string) 
    vowels = ['a','e', 'i', 'o', 'u'] 
    string.split(//).select { |x| vowels.include? x }.length 
end 
+0

İyi bir açıklama. Önerdiğim revize edilmiş yöntem: 1 'her_char' yerine' split (//) ',' '' '' '' '' ''/'' yerine '' '' '' yerine '' ve '@ '' ve # 1 ve # 2 yerine steenslag'ın önerisi yerine. –

+1

Hemen hemen her böyle bir soruyla ilgili durağan operatörün sözünü söyleyeceğim: sadece 'if' kullan, beklediğiniz önceliğe sahip ve daha okunaklı: 'vowels.include ise? n sonra 1 tane daha 0 tane bit. Tabii ki, parantez eklemek zaten iyi bir fikirdir (ve çoğu stil kılavuzları tarafından tavsiye edilir). –

+0

@ JörgWMittag kelimenin tam anlamıyla Ruby ile etrafta dalga geçmeye başladığım öneri için teşekkürler, bu yüzden henüz tüm sözdizimini anlayamadım. Üçüncül operatörü js'den biliyordum, bu yüzden yeni getirdim ve mükemmel bir şekilde çalıştı. Açık anahtar kelimelerin daha okunabilir olduğu konusunda haklısınız – dedalux

0

yapabilirsiniz

string.split("").map{ |n| vowels.include?(n) ? 1 : 0}.inject(0,:+) 

. Yani

return string.split("").map{ |n| vowels.include?(n) }.inject(0) do |mem,x| 

Neyse, kod

  • VOWELS = %w(a e i o u) # string's array
  • Eğer yönteminde dönüşü gerekmez, son deyimi
  • string.split("") =>string.chars
var daha iyi olabilir

Yönteminizin şöyle olabileceğini unutmayın:

def count_vowels(string) 
    string.count "aeiou" 
end 
1

map'a ihtiyacınız yoktur.

def count_vowels(string) 
    vowels = %w[a e i o u] 
    string.chars.select{|n| vowels.include? n}.size 
end 
İlgili konular