使用(gets.chomp)输入字符串并生成直方图

时间:2018-12-31 18:40:58

标签: ruby

我很难理解红宝石。我希望有一个程序,用户可以在其中输入一组文本,然后带星号返回。到目前为止,我已经可以通过.txt文件执行此操作。谁能解释我哪里出问题了?我在红宝石方面挣扎很多。

Image of outcome when I run it

print "Please enter any length of text:"
user_input = String(gets.chomp)
h = Hash.new
f = user_input
f.each_line { |line|
  letters = line.split(//)
  letters.each { |w|
    if h.has_key?(w)
      h[w] = h[w] + 1
    else
      h[w] = 1
    end
  }
}

# sort the hash by
h.sort{|a,b| a[1]<=>b[1]}.each { |elem|
  puts "\"#{elem[0]}\": " + '*' * elem[1]
}


我遇到的错误消息

Undefined method `chomp' for nil:NilClass (NoMethodError)

3 个答案:

答案 0 :(得分:0)

在当前正在运行Ruby程序的Atom脚本运行程序中,您无法使用gets从标准输入中读取内容。看来script-runner package可以对此进行扩展,以提供脚本的真实终端,然后您还可以在其中使用STDIN。

或者,您也可以从真实的控制台运行程序。为此,您可以从命令行窗口运行它,例如ruby name_of_program.rb,而不是从Atom启动。

答案 1 :(得分:0)

gets方法必须单独调用。在第二行尝试一下:

user_input = gets.chomp

没有String

我希望它对您有用。 :)

答案 2 :(得分:0)

您的代码按预期工作。您通过在文本编辑器中而不是通过控制台运行代码来出错。 Kernal#gets方法需要用户输入,为了在您的文本编辑器中运行,需要进行模拟。由于您的编辑器返回的是nil而不是用户输入的字符串格式,因此chomp方法将引发您的NoMethodError

基本上,您的代码很好,但是您试图在有限的环境中运行它。作为初学者,如果您的代码需要用户输入,则使用ruby <filename.rb>通过控制台/终端运行ruby文件,可以更轻松地测试代码。