Написание метода в ruby, который действует только на коллекцию класса - PullRequest
0 голосов
/ 27 июля 2010

Можно ли написать метод экземпляра, который работает только с коллекцией класса?

Например, скажем, у меня есть что-то вроде этого:

class Foo
    def collection_method
      puts "I only work on a collection of Foo!"
    end
end

@foos = []

5.times {@foos << Foo.new}

@foo = Foo.new

@foos.collection_method  #=> I only work on a collection of Foo!
@foo.collection_method #=> Some sort of expection or error

Ответы [ 2 ]

0 голосов
/ 27 июля 2010

В вашем коде @foos является массивом. Так что вы можете:

  • Добавить метод в массив

    class Array
      def collection_method
        ...
      end
    end
    
  • Создайте свой собственный класс "Массив"

    class MyArray < Array
      def collection_method
        ...
      end
    end
    
    @foos = MyArray.new
    ...
    

Я думаю, что это первое решение не лучшее ...

0 голосов
/ 27 июля 2010

В Ruby нет понятия «коллекции определенного объекта», но вы можете легко выполнить обезьяньё-исправление в методе на Array, который работает, только когда все элементы в массиве относятся к вашему типу.

irb(main):001:0> class Foo
irb(main):002:1>  def bar
irb(main):003:2>   puts "bar"
irb(main):004:2>  end
irb(main):005:1> end
=> nil
irb(main):006:0>
irb(main):007:0* class Array
irb(main):008:1>  def collection_method
irb(main):009:2>   raise "Not all Foo objects" unless self.all? { |x| x.instance_of? Foo }
irb(main):010:2>   self[0].bar
irb(main):011:2>  end
irb(main):012:1> end
=> nil
irb(main):013:0> [1,2,3].collection_method
RuntimeError: Not all Foo objects
        from (irb):9:in `collection_method'
        from (irb):13
        from ♥:0
irb(main):014:0> [Foo.new, Foo.new].collection_method
bar
=> nil

Но это действительно идет вразрез с динамическим языком. Было бы более естественно просто опробовать его (что бы вы ни делали) и по мере возникновения исправлять ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...