红宝石墙上的99瓶啤酒

时间:2013-08-27 17:34:26

标签: ruby loops

我正在尝试为“学习计划”一书中的练习为“99瓶啤酒在墙上”编写一个Ruby循环。我究竟做错了什么?我有以下内容:

    def bottles_of_beer 

      i = 99

      while i < 99 and i > 0 

        puts "#{a} bottles of beer on the wall. #{a} bottle of beer."

      i = i - 1

        puts "Take one down, pass it around. #{i} bottle of beer on the wall."

      end

    end

5 个答案:

答案 0 :(得分:3)

您在第一个字符串中引用了未定义的变量a

答案 1 :(得分:2)

我已经简化了你的代码:

i = 99
while i < 99 and (anything else)
  (anything)
end

试试看你现在是否可以搞清楚。

答案 2 :(得分:1)

TL; DR

您的代码存在许多问题,其中 i 的起始值等于99,因此从不评估代码块的其余部分。即使你解决了这个问题, a 总是为零,因为你从不为它分配任何内容。

修复您的条件

有很多方法可以做到这一点,但您可能希望使用>=<=方法进行比较。

更像惯用语

使用Integer#downto和一个块将更加惯用。例如:

12.downto(1) { |count| p "#{count} bottles of beer on the wall..." }
p "You drank the whole case!"

答案 3 :(得分:0)

...也许

99.downto(1) do |i|
  puts "#{i} bottle#{i==1 ? '' : 's'} of beer on the wall, #{i} bottle#{i==1 ? '' : 's'} of beer!"
  puts "Take one down, pass it around, #{i-1} bottle#{i-1==1 ? '' : 's'} of beer on the wall!"
end

答案 4 :(得分:0)

为了给你一个明确的答案,你的代码没有产生输出的原因有三个

  • 您将i设置为99,然后循环while i < 99 and i > 0,因此永远不会执行循环。由于您始终递减 i,因此不需要while i > 0

  • 以外的任何内容
  • 将变量a插入到正在打印的字符串中。由于您尚未声明它,您的程序将拒绝运行,请说undefined local variable or method 'a'

  • 您实际上从未调用您的方法。

解决这三个问题给出了这个(非惯用的,但有效的)程序

def bottles_of_beer
  i = 99
  while i > 0
    puts "#{i} bottles of beer on the wall. #{i} bottle of beer."
    i = i - 1
    puts "Take one down, pass it around. #{i} bottle of beer on the wall."
  end
end

bottles_of_beer