2017-05-09 18 views
-2
def letter_case_count(string) 
    char = new Hash 
    char[:lower] = 0 
    char[:upper] = 0 
    char[:neither] = 0 
    string.split("").each do |x| 
    if ('A'..'Z').include?(x) 
     char[:upper]++ 
    elsif ('a'..'z').include?(x) 
     char[:lower]++ 
    else 
     char[:neither]++ 
    end 
    end 
end 

puts letter_case_count('abCdef 123') == { lowercase: 5, uppercase: 1, neither: 4 } 
puts letter_case_count('AbCd +Ef') == { lowercase: 3, uppercase: 3, neither: 2 } 
puts letter_case_count('123') == { lowercase: 0, uppercase: 0, neither: 3 } 
puts letter_case_count('') == { lowercase: 0, uppercase: 0, neither: 0 } 

このエラーが発生します。"elsif"について予期しないキーワードエラーが発生する

(repl):9: syntax error, unexpected keyword_elsif 
    elsif ('a'..'z').include?(x) 
     ^
(repl):11: syntax error, unexpected keyword_else 
(repl):13: syntax error, unexpected keyword_end 
(repl):20: syntax error, unexpected end-of-input, expecting keyword_end 
...: 0, uppercase: 0, neither: 0 } 
...  

        ^

予期しないキーワードや予期しない入力があります。なぜ、私はRubyでほぼ一年間プログラミングしていないので、問題が何であるかわかりません。

答えて

1

Rubyにはpre-incrementまたはpost-incrementの演算子がありません。 +=1を使用するとうまくいくはずです。比較のために異なるキーを使用して

def letter_case_count(string) 
    char = {} 
    char[:lower] = 0 
    char[:upper] = 0 
    char[:neither] = 0 
    string.split('').each do |x| 
    if ('A'..'Z').include?(x) 
     char[:upper] += 1 
    elsif ('a'..'z').include?(x) 
     char[:lower] += 1 
    else 
     char[:neither] += 1 
    end 
    end 
    char #returning the char is also important. 
end 

も間違った結果を返します、それは...

puts letter_case_count('abCdef 123') == { lower: 5, upper: 1, neither: 4 } 
puts letter_case_count('AbCd +Ef') == { lower: 3, upper: 3, neither: 2 } 
puts letter_case_count('123') == { lower: 0, upper: 0, neither: 3 } 
puts letter_case_count('') == { lower: 0, upper: 0, neither: 0 } 

より良いアプローチする必要があります:

def letter_case_count(string) 
    { 
    lower: string.scan(/[a-z]/).count, 
    upper: string.scan(/[A-Z]/).count, 
    neither: string.scan(/[^a-z]/i).count 
    } 
end 
+0

「短い」は必ずしもないが、「より良い」(それらのすべてが失敗します)。文字列を各カウントごとに1回スキャンしています。 – Stefan

+0

は '( 'A' .. 'Z')'と '( 'a' .. 'z')の2つの範囲を生成するよりも良くないです。文字列。 –

+0

'count'もこのように使うことができます:' str.count( "az") '、' str.count( "AZ") '、' str.count( "1-9") 'など –

0

構文エラーの束は、あなたの中にあります。コード。タスクの種類については

def letter_case_count(string) 
    char = Hash.new # not new Hash 
    char[:lower] = 0 
    char[:upper] = 0 
    char[:neither] = 0 
    string.split("").each do |x| 
    if ('A'..'Z').include?(x) 
     char[:upper]+=1 # var++ is not valid ruby code 
    elsif ('a'..'z').include?(x) 
     char[:lower]+=1 #same here 
    else 
     char[:neither]+=1 # same here 
    end 
    end 
end 

puts letter_case_count('abCdef 123') == { lowercase: 5, uppercase: 1, neither: 4 } 
puts letter_case_count('AbCd +Ef') == { lowercase: 3, uppercase: 3, neither: 2 } 
puts letter_case_count('123') == { lowercase: 0, uppercase: 0, neither: 3 } 
puts letter_case_count('') == { lowercase: 0, uppercase: 0, neither: 0 } 

UPDATE

、STDLIBからRubyのminitestを使用しています。

すべて一つのファイルの例では

require 'minitest/autorun' 

class String 
    def letter_case_count 
    char = Hash.new # not new Hash 
    char[:lower] = 0 
    char[:upper] = 0 
    char[:neither] = 0 
    self.split("").each do |x| 
     if ('A'..'Z').include?(x) 
     char[:upper]+=1 # var++ is not valid ruby code 
     elsif ('a'..'z').include?(x) 
     char[:lower]+=1 #same here 
     else 
     char[:neither]+=1 # same here 
     end 
    end 
    return char 
    end 
end 

class TestFoo < MiniTest::Test 

    def setup 
    @w1, @w2, @w3, @w4 = ["abCdef 123", "AbCd +Ef", "123", ""].map {|e| String.new(e)} 
    end 

    def test_some 
    assert_equal @w1.letter_case_count, { lowercase: 3, uppercase: 1, neither: 4 } 
    end 

    def test_some_other 
    assert_equal @w2.letter_case_count, { lowercase: 3, uppercase: 3, neither: 2 } 
    end 
    def test_other 
    assert_equal @w3.letter_case_count, { lowercase: 0, uppercase: 0, neither: 3 } 
    end 

    def test_definitely_other 
    assert_equal @w4.letter_case_count, { lowercase: 0, uppercase: 0, neither: 0 } 
    end 
end 
+0

ねえ、ありがとう。残念ながら、私はこれらの構文規則を完全に忘れていました!私がより良いプログラマになるのを助けてくれてありがとう。 –

関連する問題