у меня возникла проблема с моим кодом подсчета встречающихся символов - PullRequest
0 голосов
/ 04 января 2019

Я создаю программу на 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 голосов
/ 04 января 2019

Внутри блока вы пытаетесь использовать неинициализированную переменную экземпляра @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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...