【问题标题】:Logic equivalent for string comparison字符串比较的逻辑等价物
【发布时间】:2013-06-23 18:30:36
【问题描述】:

为什么这些表达方式不同:

!x == "string"

x != "string"

至少第一个表达式没有进入我的if,当我改变它时,if代码被执行。

【问题讨论】:

  • 你认为!x == "string" 是做什么的?提示:运算符优先级
  • 我假设你想要if !(x == "string")。考虑改用unless x == "string"

标签: ruby if-statement logic


【解决方案1】:

假设 x 是“foo”

!x == "string"

扩展为

false == "string"

这与您的第二个示例完全不同,后者扩展为:

"foo" != "string"

【讨论】:

  • 可能值得注意的是,这是因为!x == "string" 等价于(!x) == "string" 而不是!(x == "string")
【解决方案2】:

你期望“不是 x”是什么?它会等于“字符串”还是任何字符串?

这只是一个完全不同的说法。

您提到了 if 语句,因此这必须是您用于逻辑语句的条件。由于 not x 永远不会等于字符串,因此 if 语句的条件将始终为 false。

【讨论】:

    【解决方案3】:

    至少第一个表达式没有进入我的 if

    这是我的解释:

    ! 的优先级高于 ==。所以在你的表达式中!x == "string" 将在内部表示为(!x) == "string"

    !x 将被评估为truefalse,它们分别是TrueClassFalseClass 对象。现在让我们检查truefalse对象使用了谁的#==方法。

    true.method(:==).owner
    # => BasicObject
    false.method(:==).owner
    # => BasicObject
    

    Basic#==:平等——在对象级别,== 仅当 obj 和 other 是同一个对象时才返回 true。

    根据上述定义,您的代码 !x == "string" 应始终评估为 false

    【讨论】:

    • @JanDvorak Opps!!对不起..打扰你.. :))请不要介意..告诉我这个答案是否需要进一步改进。
    • 是一个很长的答案,我会标记这个,不希望我的错误惩罚你。
    猜你喜欢
    • 2010-12-25
    • 2010-12-24
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多