2

我试图在 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]

为什么程序不停止询问我的输入?

4

3 回答 3

6

尝试使用$stdin.gets而不仅仅是一个 plain gets,这将强制输入来自 stdin

于 2013-06-30T08:32:20.883 回答
1

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

仅当翻译器能够处理标准输出/输入(例如 IRB)时,对获取/放置的调用才会有效

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

io_test.rb

puts gets

在 bash

ruby io_test.rb

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

于 2013-06-29T10:34:17.437 回答
0

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

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

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

于 2013-06-29T18:14:25.883 回答