2017-05-09 50 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

嘿男人谢谢。不幸的是我完全忘记了这些语法规则!感谢您帮助我成为更好的程序员。 –

相关问题