Ruby中yield实现数值翻倍时出现字符串重复而非翻倍的问题求助
问题原因
你遇到的问题根源是gets.chomp返回的是字符串类型,而非整数。Ruby中不同类型的乘法逻辑完全不同:
- 字符串与数字相乘:会将字符串重复对应次数,比如
"3" * 2结果是"33" - 整数与数字相乘:才会执行数值运算,比如
3 * 2结果是6
你用整数替换gets.chomp时能正常工作,就是因为此时传入的是整数类型,触发了数值乘法逻辑。
解决方案
有两种简单的修复方式,推荐第一种(输入阶段转换类型,逻辑更清晰):
方式1:获取输入时转换为整数
把gets.chomp改成gets.chomp.to_i,这样传给double方法的就是整数了:
def double(i) puts "Type a number!" yield(i) puts "Look at that! It's doubled!" end double(gets.chomp.to_i) {|i| puts i*2}
方式2:在代码块内转换类型
如果不想修改输入获取的部分,也可以在块里把参数转为整数再计算:
def double(i) puts "Type a number!" yield(i) puts "Look at that! It's doubled!" end double(gets.chomp) {|i| puts i.to_i * 2}
如果需要处理非数字输入(比如用户输入字母),可以额外加个判断,但作为新手阶段,先搞定类型转换就能解决当前问题。
内容的提问来源于stack exchange,提问作者John Stowers
相关产品推荐
相关产品推荐

