0

我看到了两种使用方式gets,一个简单的形式:

print 'Insert your name: '
name = gets()
puts "Your name is #{name}"

和一个引起我注意的表格:

print 'Insert your name: '
STDOUT.flush
name = gets.chomp
puts "Your name is #{name}"

第二个示例看起来像 perl 中使用flush默认输出流的方法。Perl 对默认输出流进行显式操作;这个方法flush对我来说是个谜。它的行为可能与我推断的不同,它用于chomp删除换行符。

第二种形式的幕后发生了什么?在什么情况下使用第二种形式有用或必要?

4

3 回答 3

2

查看一些Github 代码,我可以看到它STDOUT.flush主要用于服务器端/多线程作业,而不是日常使用。

一般来说,当你想接受用户的输入时,你会想使用gets.chomp. 请记住,无论用户输入什么,Ruby 总是将其解释为字符串。

要将其转换为整数,您需要调用to_i, 或to_f用于浮点数。chomp在这些情况下您不需要,因为to_iorto_f会自动删除“\n”。正如您将看到的那样,有很多微妙的事情正在隐含地发生,而弄清楚它们只是一个实践问题。

于 2014-09-21T19:08:26.843 回答
2

“刷新”输出确保它在等待您的输入之前显示打印的消息;这可能只是某人不必要地确定,或者可能是在某些操作系统上您需要它。或者,您可以在每次输出后使用STDOUT.sync = true强制刷新。(您可能想知道,“为什么我不总是使用它?”好吧,如果您的代码输出大量内容,反复刷新它可能会减慢它的速度。)

chomp从输入末尾删除换行符。如果您想要换行符(用户在输入姓名后按“Enter”的结果),那就不要chomp了。

于 2014-09-21T18:22:33.970 回答
1

除了多线程之外,我很少看到有人使用 STDOUT.flush。它也使事情变得混乱,违背了编写优雅代码的整个目的。

于 2014-09-22T01:33:14.100 回答