我正在创建一个将使用“ 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>'
答案 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}