2014-02-13 2 views
2

Как я понимаю, классы ruby, они почти такие же, как и модули, кроме как с добавленной функциональностью возможности его создания. Поскольку Class наследует от Module, я предположил, что тогда каждый класс (объекты класса Class) будет иметь доступ к module_function, но, похоже, это не так. Когда я сделал разницу модуля и private_instance_methods класса, я обнаружил, что Module имеет 3 метод более Class - [:append_features, :extend_object, :module_function]module_function для Ruby Class

Как были эти функции удалены из цепочки вызовов для объектов класса и, что более важно, почему?

+1

В Ruby 2.0+ есть еще два: [: prepend_features] (http://ruby-doc.org/core-2.1.0/Module.html#method-i-prepend_features) и [: уточнить] (http://ruby-doc.org/core-2.1.0/Module.html#method-i-refine). –

ответ

3

Эти основные функции реализованы на C, поэтому обсуждение этого вопроса не имеет общности и не является полезным. В Ruby вы можете определить неопределенный метод, не отменяя метод в суперклассе, используя undef.

class Foo 
    def foo; end 
end 
class Bar < Foo 
    undef :foo 
end 
Foo.new.foo 
# => nil 
Bar.new.foo 
# => NoMethodError: undefined method `foo' for #<Bar:0x007f85c3ce3330> 
  • append_features является крюк, чтобы назвать прямо перед тем, как модуль include -d, который может быть модулем, но не класс.
  • extend_object - это крючок, который будет называться прямо перед тем, как модуль будет extend -ed, которым может быть модуль, но не класс.
  • Цель module_function состоит в том, чтобы удвоить метод как метод класса и метод частного экземпляра, последний из которых полезен, когда вы включаете этот модуль, который может выполняться с помощью модуля, но не с классом.
+1

, но я все еще вижу метод «включено» как в классе, так и в модулях. как это может быть полезно для класса? Я все еще не понимаю необходимость удаления «module_function». Если бы он был там, мы можем использовать его для написания некоторых общих методов, которые должны быть как на уровне класса, так и на уровне экземпляра !! Может быть, это было дизайнерское решение? !! –

+0

Я не понимаю, почему module_function не будет полезен в классе. Классы тоже могут иметь как методы экземпляра, так и класс. Или, если не module_function, чем альтернатива для классов, называемых class_function ... – odigity

Смежные вопросы