字符串不能强制进入Fixnum?

时间:2013-12-24 05:02:09

标签: ruby fixnum

我正在尝试“99瓶装”计划。我试图简化它,但我得到“字符串不能被强制进入Fixnum”:

num_at_start = 99
num_now = num_at_start         
bobo = " bottles of beer on the wall"
bob = " bottles of beer!"
while num_now > 2
  puts num_now.to_s + bobo.to_s    
  puts num_now.to_s + bob.to_s
  puts num_at_start.to_i - 1 + bobo.to_s
  gets
end

2 个答案:

答案 0 :(得分:2)

问题在于:

puts num_at_start.to_i - 1 + bobo.to_s

Ruby建议使用结果表达式的类型,因为args从左到右来到解释器。在这里,您尝试对两个整数求和,使结果为整数。 Fixnum#+需要Fixnum的实例作为操作数,但bobo.to_s String来自。{/ p>

你应该在这里使用inplace eval:

puts "#{num_at_start - 1}#{bobo}"

整个while循环应该实际写为:

while num_now > 2
  puts "#{num_now}#{bobo}"

  puts "#{num_now}#{bob}"
  puts "#{num_at_start - 1}#{bobo}"
  gets
end
顺便说一下,还有另一个问题:无限循环;但是,在您获得现在可以使用的代码之后,您可以自行修复此错误。

答案 1 :(得分:0)

以下是我编写代码的方法:

BOBO = '%d bottles of beer on the wall'
BOB = '%d bottles of beer!'

num_at_start = 2
while num_at_start > 0
  bobo_str ||= BOBO % num_at_start
  puts bobo_str
  puts BOB % num_at_start
  puts 'Take one down and pass it around'
  num_at_start -= 1

  bobo_str = BOBO % num_at_start
  puts bobo_str
  puts
end

哪个输出:

# >> 2 bottles of beer on the wall
# >> 2 bottles of beer!
# >> Take one down and pass it around
# >> 1 bottles of beer on the wall
# >> 
# >> 1 bottles of beer on the wall
# >> 1 bottles of beer!
# >> Take one down and pass it around
# >> 0 bottles of beer on the wall
# >> 

我做了一些不同的事情:

  • BOBOBOB现在是字符串格式。有关说明,请参阅String#%Kernel#sprintf文档。
  • num_now = num_at_start没有意义。只需使用num_at_start
  • 即可
  • 当值大于零时,需要触发循环测试,因此请写入条件以反映该值。否则会使您和之后处理代码的任何其他人感到困惑。
  • 如果尚未设置,则{li> bobo_str ||= BOBO % num_at_start是初始化bobo_str的简便方法。 ||=基本上是“除非已设置”。

我建议使用Ruby的downto,而不是使用while循环。

2.downto(1) do |num_at_start|
  bobo_str ||= BOBO % num_at_start
  puts bobo_str
  puts BOB % num_at_start
  puts 'Take one down and pass it around'

  bobo_str = BOBO % (num_at_start - 1)
  puts bobo_str
  puts
end