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

时间:2016-06-08 06:09:03

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

我正在开展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)

4 个答案:

答案 0 :(得分:1)

没有必要print在函数内部以及它之外 - 这将导致重复打印。此外,您在正数上调用print,但如果它们为负数或零,则不会调用print。此外,您使用的print "#{n}"print n相同。

就问题的标题而言 - “不断返回零” - 您可以稍微改变一下方法,以便在函数外进行print次调用。

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

答案 1 :(得分:1)

方法返回最后执行的语句的结果。你的循环返回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" 

答案 2 :(得分: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

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

不可否认,这是作弊,因为它没有&#34;使用for循环,while循环,或者除非循环...&#34;,但Ruby主要用于使用迭代器和块。这或类似的东西是要走的路。我只是想一想:把它作为一个建议,而不是一个要求。

顺便说一下,在循环中,没有提到Kernel#loop,这很奇怪,因为它非常有用。至于&#34; for循环&#34;谁使用它们?我从来没有,甚至没有。

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

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

答案 3 :(得分:0)

你可以试试这个......

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

希望这对你有用