Huy*_*ran 0 ruby algorithm if-statement function
我正在尝试使用Ruby函数打印基本三角形图案,该函数仅接受n的正奇数
def triangle(n, chars)
puts "#{n} must be odd and positive" if n % 2 == 0 || n < 0 else (n + 1).times { |i| puts chars * i }
end
Run Code Online (Sandbox Code Playgroud)
问题是这个函数不仅接受奇数而且接受正数n.
triangle(3, '#')会打印
#
##
###
Run Code Online (Sandbox Code Playgroud)
但'三角形(4,'#')'也可以正常工作
#
##
###
####
Run Code Online (Sandbox Code Playgroud)
看来我的if语句工作不正常,我收到了警告else without rescue is useless.为什么以及如何解决这个问题?
Ruby将您的代码解释为两个单独的语句.
puts "#{n} must be odd and positive" if n % 2 == 0 || n < 0
else (n + 1).times { |i| puts chars * i }
Run Code Online (Sandbox Code Playgroud)
在else不与相关if.我猜想,Ruby绝望地将其解释为begin/rescue/else条件的一部分.为什么它不是语法错误,我不知道,但它将它解释为没有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
Run Code Online (Sandbox Code Playgroud)
一般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
Run Code Online (Sandbox Code Playgroud)
最后,应该使用异常处理错误,而不是打印错误消息.调用者可以捕获并处理异常,打印的错误消息很难被捕获并冒泡到用户.如果不处理例外,则停止该计划; 如果用户忘记处理错误,程序将停止,他们将知道修复它.打印的错误消息只是让程序向前推进,可以忽略,导致进一步的问题.
也可以对异常进行分类,允许调用者确定发生了什么类型的错误并采取适当的行动.
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
Run Code Online (Sandbox Code Playgroud)