Ruby将您的代码解释为两个单独的语句。
puts "#{n} must be odd and positive" if n % 2 == 0 || n < 0
else (n + 1).times { |i| puts chars * i }
else
与if
没有关联。我猜,Ruby是在绝望中将其解释为begin/rescue/else
condition的一部分。为什么它不是一个语法错误,我不知道,但它解释为没有begin
块,这在技术上是“成功”的,所以else
总是运行。
像do this if that
这样的条件语句仅用于覆盖简单语句的简单条件。尝试在其他条件下楔入是正确的。相反,使用正常条件。
def triangle(n, chars)
if n % 2 == 0 || n < 0
puts "#{n} must be odd and positive"
else
(n + 1).times { |i| puts chars * i }
end
end
在一般情况下,完全由立即采取错误条件的护理避免else
。它避免了在else
块中嵌套大部分功能。这对于更长的功能更重要,但这是一个很好的习惯。
def triangle(n, chars)
if n % 2 == 0 || n < 0
puts "#{n} must be odd and positive"
return nil
end
(n + 1).times { |i| puts chars * i }
end
最后,错误应该用异常处理,而不是打印错误消息。打电话者可以捕获和处理例外情况,打印的错误消息很难捕捉并冒泡给用户。如果不加以处理,例外情况会中止该计划;如果用户忘记处理错误,程序将停止,他们会知道修复它。打印的错误消息只是让程序向前推进,可以忽略,导致进一步的问题。
也可以对异常进行分类,以便调用者弄清楚发生了什么样的错误并采取适当的行动。
def triangle(n, chars)
if n % 2 == 0 || n < 0
raise ArgumentError, "#{n} must be odd and positive"
end
(n + 1).times { |i| puts chars * i }
end
如果您需要使用尾部'if'或'unless'子句,请尽量保持简单。例如:'next if(...)'很好,但是更长的值得使用块类型。 – tadman