【问题标题】:Ruby Loop Countdown Method keeps returning "nil"Ruby 循环倒计时方法不断返回“nil”
【发布时间】:2016-10-08 05:58:32
【问题描述】:

我正在为工作做一个 Ruby 挑战,但我无法创建一个工作方法。我尝试的每种方法都返回“nil”。

问题来了:

创建一个将整数参数传递给单个参数的方法。如果整数大于 0,则打印从整数到 0 的数字。如果数字小于 0,则只需打印整数。使用 for 循环、while 循环或 unless 循环打印从整数到 0 的数字范围。

例如:

sample(4)    
output = 3, 2, 1 

sample(-1)    
output  = -1    

这是我尝试使用的代码

def countdown(n)   
    loop do  
    n -= 1  
    print "#{n}"  
    break if n <= 0   
end  
countdown(4)

【问题讨论】:

  • 您没有在代码中使用forwhileunless 循环。

标签: ruby-on-rails ruby methods rubygems class-method


【解决方案1】:

试试这个:

def countdown(n)   
  n.downto(n > 0 ? 0 : n) { |i| puts i }
end  

countdown(4)
# 4
# 3
# 2
# 1
# 0
countdown(-4)
# -4
countdown(0)
# 0

如果参数为零,您没有提到要做什么。我假设它被视为正数或负数。

诚然,这是作弊,因为它没有“使用 for 循环、while 循环或 unless 循环……”,但 Ruby 主要设计用于使用迭代器和块。这或类似的东西,是要走的路。我只是有一个想法:将其视为建议,而不是要求。

顺便说一句,在循环中,Kernel#loop 没有被提及,这很奇怪,因为它非常有用。至于“for 循环”,谁使用它们?我从来没有,一次也没有。

如果必须使用循环,可以执行以下操作。

def countdown(n)
  while n > 0
    puts n
    n-= 1
  end
  puts n
end

countdown(4)
# 4
# 3
# 2
# 1
# 0
countdown(-4)
# -4    
countdown(0)
# 0

【讨论】:

  • 关于 for 循环,我想它简化了 JS/Java 人员的过渡。他们可以从熟悉的for item in items 开始。
  • @Sergio,我说,喂他们cold turkey!"。
  • 你将如何使用 while 循环来解决这个问题? def countdown(n) while n -= 1 puts "#{n}" break if n &lt;= 1 end end countdown(4) 这有效,但每当我输入负数时,让我们说 countdown(-1) 它返回 -2。如何将其写入 countdown(-1) 返回 -1。
【解决方案2】:

方法返回执行的最后一条语句的结果。您的循环返回 nil:

def countdown(n)   
  x = loop do  
    n -= 1  
    puts "#{n}"  
    break if n <= 0   
  end

  x
end  

countdown(4)
3
2
1
0
=> nil 

现在让我们返回一些东西:

def countdown(n)   
  loop do  
    puts "#{n}"  
    break if n <= 0   
    n -= 1  
  end

  "okay we're done"
end  

countdown(4)
4
3
2
1
0
=> "okay we're done" 

【讨论】:

  • 然而,每当我尝试在编辑器中输入负数时,这都有效。可以说倒计时(-1)它返回-2。如何编辑代码以便在我输入 countdown(-1) 时返回 -1?
  • @VictorMora - 您只需将递减步骤移至末尾。请参阅编辑。
【解决方案3】:

在函数内部和外部都不需要print - 这会导致重复打印。此外,您在正数上调用print,但如果它们是负数或零,则不调用print。此外,您使用的 print "#{n}"print n 相同。

就你的问题的标题而言——“保持返回 nil”——你可以稍微改变你的方法,在函数外调用 print

def countdown(n)
  n <= 1 ? [n] : (n-1).downto(1).to_a
end
print countdown(n).join(", ")

【讨论】:

    【解决方案4】:

    你可以试试这个……

    def sample (a)
     if a > 0
        (1..a).to_a.reverse
      else
        a
      end
    end
    

    希望这对你有用

    【讨论】:

      猜你喜欢
      • 2012-08-09
      • 1970-01-01
      • 2016-11-06
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多