2016-03-26 20 views
2

文字列の母音の数を文字の配列に分割し、母音の文字を1にマップして配列を合計してみようとしています。trueまたはfalseの数値0または1を返すmap関数

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

include?一部が正しく1または0を返しません。これはなぜ飛ばないのですか?

は私が働くこのバージョンにそれをハッキング、愚かなのようなものを探します:

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

答えて

6

理由:

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

n ? 1 : 0ための引数として評価され、渡されている動作しません。 nの代わりにinclude?あなたはinclude?にいくつかの括弧を追加する必要があります。

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

あなたは、単にあなたがinclude?メソッドのパラメータの括弧を必要とする。この場合、

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

良い説明。私が提案した改訂された方法: 'split(//)'ではなく 'each_char'、' select/length'ではなく 'count'、そして#1と#2ではなく@steenslagの提案です。 –

+1

私はcondit ional演算子を含むこのような質問のほとんどすべてについて私が言っていることを言うつもりです:ちょうど 'if'を代わりに使用します。これはあなたが期待する優先順位を持ち、より読みやすくなります:' if vowels.include? n then 1 else 0 end'となる。もちろん、かっこを追加することは、とにかく(そしてほとんどのスタイルガイドで推奨される)良いアイデアです。 –

+0

@JörgWMittag提案に感謝私は文字通りRubyを使いこなし始めたので、まだすべての構文を理解していませんでした。私はjsから3次演算子を知っていたので、それを持ってきて完全に動き出しました。あなたは正しい明示的なキーワードはより読みやすいです – dedalux

0

を行うことができます。だから、

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

とにかく、あなたのコードが良いかもしれない

  • VOWELS = %w(a e i o u) # string's array
  • あなたの方法でリターンを必要としない、それが最後の文
  • string.split("") =>string.chars
です

あなたの方法はそうかもしれないことに注意してください:

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

mapは必要ありません。

def count_vowels(string) 
    vowels = %w[a e i o u] 
    string.chars.select{|n| vowels.include? n}.size 
end 
関連する問題