2017-05-09 34 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-incrementpost-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

「短」不一定是「好」。您爲每次計數掃描一次字符串。 – Stefan

+0

是不是比生成兩個範圍'('A'..'Z')'和'('a'..'z')'更好,然後檢查是否包含?並且對於每個字符串。 –

+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

對於那種任務,使用Ruby的MINITEST從STDLIB。

全部在一個文件的例子(所有的人都會失敗)

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

嘿男人謝謝。不幸的是我完全忘記了這些語法規則!感謝您幫助我成爲更好的程序員。 –

相關問題