我正在为工作做一个 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
希望这对你有用