Ruby 循环倒计时方法不断返回"nil"



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

问题是:

创建将整数参数传递给单个参数的方法。如果整数大于 0,则将整数之间的数字打印为 0。如果数字小于 0,只需打印整数。使用 for 循环、while 循环或 除非循环打印从整数到 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)

方法返回执行的最后一个语句的结果。您的循环返回 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" 
没有必要在

函数内部和函数外部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(", ")

试试这个:

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 循环或除非循环......",但 Ruby 主要设计为使用迭代器和块。这个,或者类似的东西,是要走的路。我只是有一个想法:把它当作一个建议,而不是一个要求。

顺便说一下,在循环中,没有提到内核#循环,这很奇怪,因为它非常有用。至于"for loops",谁使用它们?我从来没有,甚至一次都没有。

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

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

你可以试试这个...

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

希望这对你有用

最新更新