繁体   English   中英

私有方法“ chomp”调用了nil:NilClass(NoMethodError)

[英]private method `chomp' called for nil:NilClass (NoMethodError)

我试图通过将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

我一直收到此错误:

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

这是第60行附近的区域:

#if __FILE__ == $0

  mg = EnglishToPigLatin.new
  mg.create

#end

本质上,我想做的是在仍然有输入的情况下,获取输入,将其拆分为单个单词,然后通过Pig Latin转换方法运行每个单词。

看来您正在尝试在循环中获取输入。

尝试

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

否则,您将尝试在没有输入的情况下获取下一行输入。 此外,对于while语句, do
您也不需要将@user_input重置为''

而且由于这一切都在一个块中,因此您无需使用实例变量,除非调用的方法需要它们。

同样,您的条件始终为真。 gets将阻塞,直到获得一行输入为止。 您可以将loop用于终止于中断的无限循环。

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

整个事情可能是脚本或模块中的方法。 甚至不需要创建一个实例。 如果这样做,则应该定义一个initialize方法,而不是在mg.create中使用两行。 然后将其用作构造函数,创建实例时设置的任何内容都应放在此处。

可以这样完成:

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

马里奥的答案是正确的。 但我有以下注意事项。

  • 您仍然可以按以下方式使用while结构。
  • +' '表示您不希望每个单词后都有换行符。 我改变了那部分。 mapjoin在类似情况下很常见。 print不添加换行符,而puts则添加换行符。
  • 我不确定您要使用STDOUT.flushSTDOUT.flush 如果要在每次输出之前滚动到屏幕顶部,请使用system('clear')
  • 您有一个entToLatin方法,它应该可以工作,但是使用下划线是红宝石的约定,例如eng_to_latin用于方法(尽管有一些例外)。

因此,更红宝石的方式是:

def create
  print "Enter the text to be converted to pig latin, EOF to quit: "
  while input = gets.strip and input != 'EOF'
    system('clear')
    puts input.split(/\s+/).map{|x| x.engToLatin}.join(' ')
    puts "EOP to Quit"
  end
end

如果使用的是Ruby 1.9.2,则可以缩短map以便:

def create
  print "Enter the text to be converted to pig latin, EOF to quit: "
  while input = gets.strip and input != 'EOF'
    system('clear')
    puts input.split(/\s+/).map(:engToLatin).join(' ')
    puts "EOP to Quit"
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM