在Ruby中从控制台读取输入?

133

我想用Ruby编写一个简单的A+B程序,但是我不知道如何在控制台中操作。

5个回答

253

你是在谈论 gets 函数吗?

puts "Enter A"
a = gets.chomp
puts "Enter B"
b = gets.chomp
c = a.to_i + b.to_i
puts c

像这样吗?

更新

Kernel.gets 尝试读取在 ARGV 中找到的参数,如果存在则不会要求输入控制台。如果想强制从控制台读取参数,请使用 STDIN.gets


63
我对这个解决方案有疑议:Kernel.gets尝试读取在ARGV中找到的文件,只有当没有ARGV时才询问控制台。如果想强制从控制台读取,即使ARGV不为空,请使用STDIN.gets - fguillen
3
a.to_ib.to_i 可以改进。to_i 是将对象转换为整数的方法。 - Dorian
gets 是阻塞的吗?如果不是,有没有任何替代品是阻塞的? - noMAD
1
@fguillen 这是一个很好的回答,不应该被隐藏在评论中。你能否把它变成一个答案呢?谢谢! - Dan Rosenstark
2
@Yar 感谢您的建议,我已经在答案本身中添加了一个“更新”。 - fguillen
非常感谢您的帮助,@fguillen,并且知道这一点。我已经在这里使用了它:https://dev59.com/h3I-5IYBdhLWcg3wI0p9#20081966现在我可能会更多地使用它,因为我知道了它。 - Dan Rosenstark

31

您也可以通过命令行传递参数。命令行参数存储在数组ARGV中。因此ARGV[0]是第一个数字,ARGV[1]是第二个数字。

#!/usr/bin/ruby

first_number = ARGV[0].to_i
second_number = ARGV[1].to_i

puts first_number + second_number

你可以这样调用它

% ./plus.rb 5 6
==> 11

11

有许多方法可以从用户那里获取输入。我个人喜欢使用gets方法。当您使用gets时,它会获取您键入的字符串,其中包括您按下的ENTER键以结束您的输入。

name = gets
"mukesh\n"

在irb中可以看到这一点;输入以下内容,您将看到“换行符”(即ENTER键生成的字符):键入name = gets,您将看到类似于"mukesh\n"的东西。使用chomp方法可轻松摆脱烦人的换行符字符。

chomp方法会返回字符串,但不包括结束的换行符。美妙的chomp方法就像救命稻草。

name = gets.chomp
"mukesh"

您还可以使用终端来读取输入。 ARGV 是在Object类中定义的常量。它是Array类的一个实例,并且具有访问所有数组方法的权限。由于它是一个数组,即使它是一个常量,它的元素也可以轻松修改和清除。默认情况下,当调用命令行二进制文件并将其作为字符串存储在ARGV数组中时,Ruby会捕获传递给Ruby程序的所有命令行参数(通过空格分隔)。

当在您的Ruby程序中编写时,ARGV 将接受像这样的命令行命令:

test.rb hi my name is mukesh

并创建一个看起来像这样的数组:

["hi", "my", "name", "is", "mukesh"]

但是,如果我想要通过有限的输入,则可以使用类似以下的方法。

test.rb 12 23

然后在你的程序中这样使用那些输入:

a = ARGV[0]
b = ARGV[1]

5
如果您想从终端窗口中获取参数,请尝试以下代码:
A = ARGV[0].to_i
B = ARGV[1].to_i

puts "#{A} + #{B} = #{A + B}"

1
如果你想制作交互式控制台:
#!/usr/bin/env ruby

require "readline"
addends = []
while addend_string = Readline.readline("> ", true)
  addends << addend_string.to_i
  puts "#{addends.join(' + ')} = #{addends.sum}"
end

使用方法(假设您将上面的代码片段放置在当前目录中的summator文件中):
chmod +x summator
./summator
> 1
1 = 1
> 2
1 + 2 = 3

使用 Ctrl + D 退出


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接