我正在尝试“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
答案 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
# >>
我做了一些不同的事情:
BOBO
和BOB
现在是字符串格式。有关说明,请参阅String#%和Kernel#sprintf文档。num_now = num_at_start
没有意义。只需使用num_at_start
。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