【问题标题】:What's wrong with this ruby code? syntax error, unexpected tIDENTIFIER, expecting keyword_end这个红宝石代码有什么问题?语法错误,意外的 tIDENTIFIER,需要关键字_end
【发布时间】:2012-03-07 12:42:29
【问题描述】:

这段代码来自《Ruby Best Practice》一书:

def respond_to?(message)
  message = message.to_sym
  [:__result__, :inspect].include?(message) ||
    __result__.respond_to? message
end

但我得到一个错误:语法错误,意外的 tIDENTIFIER,期待关键字_end。怎么了?

【问题讨论】:

    标签: ruby syntax syntax-error


    【解决方案1】:

    你需要更多的括号,像这样

    def respond_to?(message)
      message = message.to_sym
      [:__result__, :inspect].include?(message) ||
        __result__.respond_to?(message)
    end
    

    或者(但看起来更丑)

    def respond_to?(message)
      message = message.to_sym
      [:__result__, :inspect].include?(message) ||
        (__result__.respond_to? message)
    end
    

    反正 ruby​​ 理解的是:

    def respond_to?(message)
      message = message.to_sym
      ([:__result__, :inspect].include?(message) ||
        __result__.respond_to?) message
    end
    

    因为运营商优先。

    我喜欢在没有括号的情况下调用函数,但这只有在代码没有歧义的情况下才是一件好事,ruby 不会像 || 函数那样为新行分配任何优先级。

    【讨论】:

    • 我的经验法则是:如果您使用返回值,则永远不要调用没有括号的方法。这避免了解析器和代码的下一个读者的混淆:)
    • 嗯...这非常严格,并且不适用于此语句,因为破坏代码的不是赋值,而是|| 运算符,但它仍然有意义
    • 它会强迫你做respond_to?(message),所以它不会有这个问题。哦,它不适用于带有0 参数的方法,如果这就是你的意思:)
    猜你喜欢
    • 1970-01-01
    • 2015-06-12
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    相关资源
    最近更新 更多