我正在尝试在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) from C:/Users/Sten Sootla/Desktop/Ruby workspace/exercise.rb:3:in `' What is your name? [Finished in 0.1s with exit code 1]
为什么程序不停止向我询问输入?
答案 0 :(得分:2)
尝试使用$stdin.gets
而不是普通的gets
,这会强制输入来自stdin
答案 1 :(得分:1)
以下是我的理解方式。 gets
和puts
是IO
的实例方法,默认IO
是$stdout
和$stdin
。
只有当翻译人员能够处理stdout / in时才会调用gets / puts。 IRB
如果你从bash运行ruby文件,它也可以。
io_test.rb
puts gets
在bash中
ruby io_test.rb
然后它将“放入”stdout,无论它从stdin“获取”。
答案 2 :(得分:0)
如果您想在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中是自包含的,因此您无需在终端上来回翻转,保存和重新加载程序。