【问题标题】:Ruby .gets doesn't workRuby .gets 不起作用
【发布时间】:2013-06-30 16:32:20
【问题描述】:

我正在尝试在 Ruby 中获取简单的用户输入,但无法正常工作。我正在使用gets 方法,但程序永远不会停止询问我的输入。我正在使用 Sublime Text 2 作为我的文本编辑器,并且我也在其中运行程序(如果这有所不同的话)。

这是我的代码:

puts "What is your name?"
name = gets 
puts "Hello " + name + ". How are you?"

这是给我的错误(和输出):

C:/Users/Sten Sootla/Desktop/Ruby workspace/exercise.rb:3:in `+': can't convert nil into String (TypeError) 来自 C:/Users/Sten Sootla/Desktop/Ruby workspace/exercise.rb:3:in `' 你叫什么名字? [在 0.1 秒内完成,退出代码为 1]

为什么程序没有停下来询问我的输入?

【问题讨论】:

  • IRB 中尝试,而不是在编辑器中。代码很完美。
  • 是的,它适用于 irb。但是为什么它在编辑器中不起作用?
  • 我猜 sublime text ruby​​ 解释器不允许输入..
  • 因为get 可以在您运行它时提示并从编辑器中获取输入..

标签: ruby sublimetext2 user-input


【解决方案1】:

尝试使用$stdin.gets 而不是简单的gets,这将强制输入来自标准输入

【讨论】:

    【解决方案2】:

    我是这样理解的。 getsputsIO的实例方法,默认IO$stdout$stdin

    只有当翻译器能够处理 stdout/in 时,gets/puts 调用才会有效,例如内部审查委员会

    如果你从 bash 运行一个 ruby​​ 文件,它也可以工作。

    io_test.rb

    puts gets
    

    在 bash 中

    ruby io_test.rb
    

    然后它将从标准输入“得到”的任何东西“放入”标准输出。

    【讨论】:

      【解决方案3】:

      如果您想在 ST2 中运行代码,请查看 SublimeREPL 插件,该插件可通过 Package Control 获得。虽然您可以使用IRB,但它的主要Ruby 接口是通过pry,它更强大。您可以将它用作经典的 REPL(想想 Clojure 或 LISP),还可以通过选择、行范围或块将代码从一个选项卡转移到另一个选项卡中正在运行的 REPL。

      有趣的是,您上面的代码在IRB 中对我有效,但由于某种原因不适用于pry - 它正在读取我的$EDITOR 环境变量,该变量设置为subl -w,但由于Errno::ENOENT: No such file or directory - subl -w 而失败。奇怪……

      无论如何,我强烈推荐 SublimeREPL,因为它是一个非常强大的工具,并且在 ST2 中是自包含的,因此您不必一直在终端来回切换、保存和重新加载程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 2013-01-24
        • 1970-01-01
        • 2013-06-07
        • 2018-10-15
        • 1970-01-01
        相关资源
        最近更新 更多