首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby - Ampersand方法

Ruby - Ampersand方法
EN

Stack Overflow用户
提问于 2011-01-02 15:13:52
回答 4查看 610关注 0票数 1

有没有一种方法可以覆盖对象上的&方法,以便在调用时返回一个数组,如下所示:

代码语言:javascript
复制
class MyObject
end

o1, o2, o3 = MyObject.new, MyObject.new, MyObject.new

o1 # => #<MyObject0x01>
o1 & o2 # => [#<MyObject0x01>, #<MyObject0x02>]
o1 & o2 & o3 # => [#<MyObject0x01>, #<MyObject0x02>, #<MyObject0x03>]
EN

回答 4

Stack Overflow用户

发布于 2011-01-02 15:45:50

试图让你自己的语法看起来很愚蠢。为什么不直接使用Ruby的数组表示法呢?

代码语言:javascript
复制
[o1, o2, o3] # => [#<MyObject0x01>, #<MyObject0x02>, #<MyObject0x03>]

我是不是忽略了什么显而易见的东西?

票数 7
EN

Stack Overflow用户

发布于 2011-01-02 18:08:01

答案很简单,不是。冗长的答案是,如果你返回一个数组,你将打破MyObject的引用链,然后开始调用数组上的方法。基于The Principal of least surprise的最优排序解决方案

阵列使用[] << o1 << o2 << o3或表现得像阵列

  1. 创建一个类,如下所示

class MyObjectCollection <数组定义&#做我想说的end

  • Monky patch

引用链的解释

代码语言:javascript
复制
class MyObject
end

o1, o2, o3 = MyObject.new, MyObject.new, MyObject.new

o1 # => #<MyObject0x01>              # <-- works
o1 & o2 # => [#<MyObject0x01>, #<MyObject0x02>] # <-- could work with def & because the LHS is a MyObject
o1 & o2 & o3 # => [#<MyObject0x01>, #<MyObject0x02>, #<MyObject0x03>] # <--- CANNOT work because o1 & o2 return an object of type Array and not of type MyObject
票数 4
EN

Stack Overflow用户

发布于 2011-01-03 01:47:21

阅读所有其他答案,了解重要细节。但这里有一个解决方案:

代码语言:javascript
复制
    class MyObject  
      def initialize(x)
        @x = x
      end

      def &(arg)
        return [self, arg]
      end

      def to_s
        @x
      end
    end

    class Array  
      def &(arg)
        if arg.is_a? MyObject
          return self << arg
        else
          # do what Array.& would normally do
        end
      end  
    end

    a = MyObject.new('a')
    b = MyObject.new('b')
    c = MyObject.new('c')
    x = a & b & c
    puts x.class
    puts "[#{x.join(', ')}]"

这是另一个更安全的解决方案(即不使用monkeypatching):

代码语言:javascript
复制
    class MyObject  
      def initialize(x)
        @x = x
      end

      def &(arg)
        a = MyObjectArray.new
        a << self << arg
      end

      def to_s
        @x
      end
    end

    class MyObjectArray < Array
        def &(arg)
          return self << arg
        end
    end

    a = MyObject.new('a')
    b = MyObject.new('b')
    c = MyObject.new('c')
    x = a & b & c
    puts x.class
    puts "[#{x.join(', ')}]"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4577535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档