Ruby中的gets/puts只适用于字符串吗?

18

我刚接触Ruby,目前正在练习一些代码,看起来像下面这样:

puts 'Hello there, Can you tell me your favourite number?'
num = gets.chomp
puts 'Your favourite number is ' + num + '?'
puts 'Well its not bad but  ' + num * 10 + ' is literally 10 times better!'

然而,这段代码只是将变量 "num" 复制十次,并没有实际乘以该数字,因此我认为需要将 "num" 变量设置为整数类型?但我尝试了很多方法都不成功,有人能告诉我哪里出错了吗?


num = gets.chomp.to_i 或 num.to_i * 10(在您的代码中较低) - omninonsense
4个回答

31

如果您使用to_i,那么在这之前使用chomp是多余的。因此,您可以这样做:

puts 'Hello there, Can you tell me your favourite number?'
num = gets.to_i
puts 'Your favourite number is ' + num.to_s + '?'
puts 'Well its not bad but  ' + (num * 10).to_s + ' is literally 10 times better!'

但是一般来说,使用 "#{}" 更好,因为你不需要关心 to_s,它运行更快,也更易于阅读。方法String#+特别慢。

puts 'Hello there, Can you tell me your favourite number?'
num = gets.to_i
puts "Your favourite number is #{num}?"
puts "Well its not bad but  #{num * 10} is literally 10 times better!"

6
使用to_i方法将其转换为整数。换句话说,修改如下内容:
num = gets.chomp

变成这样:

num = gets.chomp.to_i

我尝试过了,但是我得到了相同的错误:'RubyTest.rb:3:in `+': can't convert Fixnum into String (TypeError) from RubyTest.rb:3 - AndyNico
1
@AppSlap:哎呀,我以为Ruby在连接字符串和整数时会隐式转换。当你需要使用+操作符连接一个字符串和一个整数时,首先要用to_s将整数转换为字符串。例如:puts "你的数字是 " + num.to_s + "。" - icktoofay
@icktoofay 谢谢你,但我仍然遇到相同的错误。我的代码现在看起来像这样:puts '嗨,你能告诉我你最喜欢的数字吗?' num = gets.chomp.to_i puts '你最喜欢的数字是 ' + num.to_s + '?' + ' 好吧,它不错,但是 ' + num * 10 + ' 简直是好了十倍!' - AndyNico
@AppSlap: ...' + (num * 10).to_s + '... @AppSlap:...' + (num * 10).to_s + '... - icktoofay
1
@AppSlap:请注意,如果您使用#{}而不是+,则无需使用to_s,这在Ruby中通常更受欢迎。 - sepp2k

0
我写了一个类似你的程序。这里是我最终让它正常工作的方法!我必须把喜爱的数字分配为整数。然后,在下一行中,我将new_fav_num设置为fav_num +1的值,然后将其转换为字符串。之后,您只需将您的代码插入到您想对用户说的返回语句中,只需将第一个fav_num转换为字符串即可。

puts "What is your favorite number?"

fav_num = gets.chomp.to_i

new_fav_num = (fav_num + 1).to_s

puts "Your favorite number is " + fav_num.to_s + ". That's not bad, but " +
new_fav_num + " is bigger and better!"

希望这能帮到你。

0

你也可以通过以下方式确保用户使用的数字是整数:

num = Integer(gets.chomp)

但是你必须创建一种方法来捕获错误,以防用户输入其他内容,例如字符或字符串,因此最好使用:

num = gets.chomp.to_i

如果用户输入了其他类型的数据,num会等于0,就像在这个测试例子中所看到的一样:

puts "give me a number:"
num = gets.chomp.to_i
if num >3
 puts "#{num} es mayor a 3 "
else 
 puts "#{num} es menor a 3 o 3"
end

这是与该脚本交互的示例:

give me a number:
 sggd
0 es menor a 3 o 3
nil

我希望这能更好地阐明你的观点。


使用Integer(gets.chomp)确保你真的得到了一个整数是个好主意,这点说得很好。实际上,这是一种绝佳的方法。 begin; print "输入一个数字 "; num = Integer(gets.chomp); rescue ArgumentError; puts "那不是一个数字,请重试"; retry; end; puts num > 3 ? "#{num} 大于 3" : "#{num} 小于 3 或等于 3" - SteveTurczyn

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