Определите метод, который работает с массивами объекта определенного типа. - PullRequest
0 голосов
/ 23 марта 2011

В C # вы можете написать метод расширения следующим образом:

public static Debt[] Foo(this Debt[] arr, int num)
{
    // Do something
}

Это позволит вам использовать Foo() для массива долгов: debts.Foo(3)

Можете ли вы сделать это в Ruby? Я знаю, что вы можете написать метод, который будет работать с массивами:

class Array
  def foo
    # blah
  end
end

но это работает на всех типах массивов, а не только на массиве Debt s

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 23 марта 2011

метод extend добавляет методы экземпляра к определенному объекту. так что в вашем случае это будет:

class YourClass
  def foo
    # blah
  end
end

debts.extend(YourClass)
debts.foo # now foo method is instance method of debts object

На самом деле он создает синглтон-класс для debts объекта и затем добавляет к нему метод. Но вы не можете использовать этот класс, поэтому он называется "призрачный" класс

1 голос
/ 23 марта 2011

Это было бы немного сложно, потому что массивы Ruby не являются однородными.То есть вы можете хранить различные типы объектов внутри массива.Это привело бы меня к решению, в котором мне нужно было бы сначала проверить, что все объекты в массиве имеют тип Debt, и если это так, я могу воздействовать на массив, используя foo.

Вы можете продолжить открывать Array и добавить метод foo, но, возможно, вам следует вместо этого создать FooArray и расширить Array.Таким образом, вы можете переопределить некоторые методы, такие как << и push, чтобы гарантировать, что вы берете только Debt s.Поскольку вы знаете, что в ваш массив можно добавить только Debt s, вы можете без проблем вызвать foo().

0 голосов
/ 23 марта 2011

Я полагаю, что вы можете сделать это, расширив класс Ruby Array или, что еще лучше, определив свой собственный Array-подобный класс и делегировав выбранные методы массива собственному объекту.

Stack = Array.extract([
  :last,
  :push,
  :pop,
  :size,
  :clear,
  :inspect,
  :to_s
])

Почему это лучше, чем альтернативные методы, объяснено здесь .

...