【问题标题】:RubyMine: "Expression can be simplified" But how?RubyMine:“表达式可以简化”但是如何?
【发布时间】:2013-04-03 16:02:02
【问题描述】:

如何简化这个表达式?

m.immutable = params[:immutable] || false

RubyMine 建议:“可以简化表达式。此检查会警告布尔函数中的冗余部分”,但没有说明要做什么。

这个想法是如果“不可变”参数没有被传递,则分配 false。

【问题讨论】:

    标签: ruby rubymine


    【解决方案1】:

    只需单击 Alt+Enter 即可显示 RubyMine

    m.immutable = params[:immutable]
    

    在某些情况下,这可以帮助你,但如果你没有传递参数,那么 immutable 将为 nil, 这可能不是你所期望的

    【讨论】:

    • "immutable 将为零,这可能不是您所期望的",是的,我在说。但 RubyMine 更清楚......
    • @Paul,在这种情况下,RubyMine 是错误的。这两个语句不等价。
    • 是的,RubyMine 在这里可能有点激进。 nil 在布尔上下文中计算为 false,但与 == 相比它们并不相同。
    • 回答问题本身,以防其他人因为nilfalse 而来到这里:值得问问自己为什么你想明确地有一个@ 987654327@ 当您可以使用 params[:immutable] 中的任何错误值时
    【解决方案2】:

    这是实现这一目标的更好方法:

    m.immutable = !! params[:immutable]
    

    使用!! 是一个Ruby 技巧,可确保将表达式转换为布尔值。 例如即使params[:immutable] 的计算结果为nil!! 也会将其转换为false——否则它将是true

    【讨论】:

    • 与 RuboCop 相关的风格指南是 avoid the use of !!。因为nil 无论如何都是假的,所以没有必要。
    • 当然,RuboCop 非常固执己见,但这并不意味着它的规则或评估总是正确的。恕我直言,有意识地选择启用哪些 RuboCop 规则非常重要,我发现一些规则非常尴尬 - 有些甚至很烦人(改变逻辑、循环和替换选择/拒绝等......) nil 和 false 之间的区别很重要,在某些情况下您要强调一个值是布尔值。如果你想要 boolean !! 是 Ruby 实现它的方式。这样就可以区分未设置、真、假
    • 当然——如果m.immutable 应该始终是一个布尔值,我最喜欢你的答案,因为它立即清楚地表明了这一点——从 OP 的代码中我假设它应该是false 或某个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多