我的代码计数出现的字符时出现问题

时间:2019-01-04 14:12:31

标签: ruby regex

我正在创建一个将使用“ hello world!”的Ruby程序。作为标准字符串,除非指定了字符串,否则我可以获取它来注册“ hello world”或我通过IRB传递的任何字符串,但是一旦进入计算方法,我就会遇到方法错误,并且不知道它在哪里出问题了。

def display
  calculateFrequencies
end
private
def calculateFrequencies
  @text = "Hello World!"
  @letters = text.downcase.each_char.with_object(Hash.new(0)) do |c, letters|
      next if c == " "
      @letters[c] += 1
  end
end

预期输出将是例如它计算频率,然后当调用方法显示时,频率将显示在终端中,例如Hello World = h=1 e=2 l=3 o=2 d=1 但是我实际上得到的是这个。

h.calculateFrequencies
NoMethodError: undefined method `[]' for nil:NilClass
from LetterHistogram.rb:17:in `block in calculateFrequencies'
from LetterHistogram.rb:15:in `each_char'
from LetterHistogram.rb:15:in `with_object'
from LetterHistogram.rb:15:in `calculateFrequencies'
from (irb):5
from /usr/bin/irb:11:in `<main>'

1 个答案:

答案 0 :(得分:2)

在该块内,您尝试使用未初始化的实例变量@letters,因为它是已初始化的哈希/数组。您需要在调用块之前对其进行初始化,或者(而是)使用块参数。我建议尝试这样:

def calculateFrequencies
  @text = "Hello World!"
  @letters = @text.downcase.each_char.with_object(Hash.new(0)) do |c, letters|
      next if c == " "
      letters[c] += 1
  end
end

它可以在我的控制台中使用:

[8] pry(main)> @text = "Hello World!"  
=> "Hello World!"
[9] pry(main)> @letters = @text.downcase.each_char.with_object(Hash.new(0)) do |c, letters|  
[9] pry(main)*   next if c == " "      
[9] pry(main)*   letters[c] += 1      
[9] pry(main)* end    
=> {"h"=>1, "e"=>1, "l"=>3, "o"=>2, "w"=>1, "r"=>1, "d"=>1, "!"=>1}