红宝石单行和警告:'其他没有救援是没用的'

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.为什么以及如何解决这个问题?

Sch*_*ern 5

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)

  • "为什么它不是语法错误,我不知道" - 好吧,因为它是完全合法的语法.Method,block和lambda body形成一个隐式的`begin`块.`def foo()bar如果baz else quux end`相当于`def foo()开始吧,如果baz救援StandardError else quux end end`. (2认同)