私有方法`chomp'调用nil:NilClass(NoMethodError)

0 ruby

我试图通过将Java程序转换为Ruby来学习Ruby,但是我一直在想出围绕这段代码的错误:

  def create
    @user_input = String.new()
#   @word_arr = Array.new

  print "Enter the text to be converted to pig latin, EOF to quit: "
    while gets do
      STDOUT.flush
      @user_input = gets.chomp
      @word_arr = @user_input.string.split(' ')
      @word_arr.each { |x| puts x.engToLatin() + ' '}
      print "EOF to Quit"
      @user_input = ""

    end

  end
Run Code Online (Sandbox Code Playgroud)

我一直在收到这个错误:

EnglishToPigLatin.rb:14:in `create': private method `chomp' called for nil:NilClass (NoMethodError)
    from EnglishToPigLatin.rb:60
Run Code Online (Sandbox Code Playgroud)

这是第60行周围的区域:

#if __FILE__ == $0

  mg = EnglishToPigLatin.new
  mg.create

#end
Run Code Online (Sandbox Code Playgroud)

基本上我要做的是在仍有输入时,获取输入,将其拆分为单个单词,并通过Pig Latin转换方法运行每个单词.

Mar*_*rio 5

看起来你正试图在循环中输入.

尝试

loop do
  user_input = gets.chomp!
  word_arr = user_input.to_s.split(' ')
  word_arr.each { |x| puts x.engToLatin() + ' '}
  puts "EOF to Quit"
end
Run Code Online (Sandbox Code Playgroud)

否则,当没有输入时,你会尝试获取下一行输入.此外,声明do不是必需的while.
您也不需要重置@user_input为''.

由于这只是一个块,你不需要使用实例变量,除非你调用的方法需要它们.

你的条件总是如此. gets将阻止,直到它获得一行输入.您可以使用loop以中断结束的无限循环.

此外,STDOUT如果您puts在最后一行使用a 而不是a ,则无需刷新print.

整个过程可能是模块中的脚本或方法.甚至不需要制作实例.如果你这样做,mg.create你应该定义一个initialize方法,而不是使用你的两行.这用作构造函数,并且在创建实例时设置的任何内容都应该放在那里.

它可以这样做:

loop do
  puts gets.chomp.split(' ').map{ |x| x.engToLatin() }.join(' ')
  puts "EOF to Quit"
end
Run Code Online (Sandbox Code Playgroud)