【问题标题】:Keyword for exclusive or in ruby?独家或红宝石的关键字?
【发布时间】:2010-10-09 18:28:22
【问题描述】:

Ruby 是否有一个纯英文关键字来表示异或,就像它们有“and”和“or”一样?如果不是,这是因为独占还是不允许评估捷径?

【问题讨论】:

    标签: ruby boolean xor


    【解决方案1】:

    不行,你只能使用^

    不知道为什么没有特别的,可能是因为不常用。

    【讨论】:

    • ^ 遇到了真实值的问题。我定义了自己的函数:
    • 我刚刚被这个击中了。我正在使用 ruby​​-prof 来改进算法,并且我认为使用 XOR 简化某些条件会使其更快。但情况恰恰相反。
    【解决方案2】:

    我遇到了一个问题,因为 '^' 运算符按位作用于数字,

    true ^ 1
    => false
    
    1 ^ true
    TypeError: can't convert true into Integer
    true ^ 1
    

    所以我的解决方法是:

    ( !!a ^ !!b ) 双键将它们强制转换为布尔值。

    !!1 ^ !!true
    => false
    
    !!1 ^ !!false
    => true
    

    【讨论】:

    • 有趣,但与问题没有太大关系。
    • ++ 有用。我来这里是为了寻找异或,但知道如何做相反的事情,即强制一个 bool to_i?我的另一个操作数已经是一个 int,我需要结果是 int。
    • @Macha +1ing 因为我刚刚遇到了同样的问题,并且没有其他关于 Ruby 布尔异或的问题与字符串无关。
    • 因为基本上您正在检查值是否不同,您实际上可以保存 ! 并执行以下操作:!foo ^ !bar。或!foo != !bar
    • 事实上你只需要第一个值是一个布尔值。 !!var1 ^ var2。此外,nil^ 运算符用作布尔异或。
    【解决方案3】:

    首先,我认为短路不适用于 XOR:无论第一个操作数的值如何,都需要检查第二个操作数。

    其次,and, &&, or and ||在所有情况下都使用短路; “单词”和“符号”版本之间的唯一区别是优先级。我相信 andor 的存在是为了提供与 perl 在类似

    process_without_error or die
    

    我认为没有 xor 命名函数的原因可能是在这种情况下低优先级运算符没有意义,而且这已经是一个足够令人困惑的情况了!

    【讨论】:

    • 我认为“低优先级xor函数没有意义”是不对的。在 Perl 中,我习惯于用 param1 xor param2 之类的东西检查两个专有的 CGI 参数。可惜我需要在 Ruby 中以更复杂的方式做到这一点。
    • 现在,我同意 andor 是控制流。 Avdi 在devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby 上写得很好(事实上,我在那篇博文的 cmets 部分链接到了这个问题)
    【解决方案4】:

    试试^

    true  ^ false #=> true
    true  ^ true  #=> false
    false ^ false #=> false
    

    虽然没有简单的英语等效运算符。

    【讨论】:

    • 我的问题是true ^ true ^ true => true
    • @MrYoshiji 如果操作顺序为 (true ^ true) ^ true,则有意义。括号计算为假,给你假^真,最终为真。
    【解决方案5】:

    作为对任意类型使用 XOR 的 Matt Van Horn 的双重否定技巧的替代方法,您可以链接另一个 XOR 测试,从 nil 开始。即:

    !!foo ^ !!bar
    

    等价于

    nil ^ foo ^ bar
    

    在我看来这看起来更整洁,我想需要更少的逻辑操作

    【讨论】:

      【解决方案6】:

      xor 的任何实现都不允许短路。无论如何,这两个表达式都需要计算。

      Ruby 确实提供了^ 运算符,但这会阻塞真实值。我已经实现了一个函数来处理我想要一个行为更像andorxor 的情况:

      def xor(a,b)
        (a and (not b)) or ((not a) and b)
      end
      

      ^不同,该函数可用于类似以下情况:

      xor("hello".match(/llo/), false) # => true
      xor(nil, 1239)                   # => true
      xor("cupcake", false)            # => false
      

      【讨论】:

      • Chris Phoenix 关于 xor("cupcake", false) 返回 true 的回答/评论是正确的。
      【解决方案7】:

      约翰的回答似乎不正确。在 irb 1.9.3 中,xor("cupcake", false) 返回 true,正如您所期望的那样。

      1.9.3-p429 :104 > def xor(a,b)
      1.9.3-p429 :105?>     (a and (not b)) or ((not a) and b)
      1.9.3-p429 :106?>   end
       => nil 
      1.9.3-p429 :107 > xor(false, true)
       => true 
      1.9.3-p429 :108 > xor("cupcake", false)
       => true 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        • 1970-01-01
        • 2010-09-25
        相关资源
        最近更新 更多