Поведение и назначение кода переопределения класса в другом классе - PullRequest
0 голосов
/ 21 декабря 2011

Наблюдали некоторое неожиданное поведение, когда область class появляется в другом определении класса:

Такая область переопределяет все определение класса.

Однако тот же код просто добавит новый метод в этот класс, как показано в кодах ниже.

Почему Ruby сконструирован таким образом, если он не выходит за рамки интуиции?

require 'pp'

def pp_methods obj
  pp obj.methods - nil.methods
end

#first definition of A
class A
  def method1
  end
end

#add method3 to A
class A
  def method3
  end
end

class B
  #class A got overridden within class B
  class A
    def method2
    end
  end
  def initialize
    a=A.new
    pp_methods a  # => [:method2]
  end
end

a1=A.new
pp_methods a1     # => [:method1,:method3]

b=B.new

a2=A.new
pp_methods a1     # => [:method1,:method3]


pp_methods a2     # => [:method1,:method3] 

1 Ответ

3 голосов
/ 21 декабря 2011

Возможность «открыть» классы на самом деле очень полезна.Имея эту возможность, мы можем легко добавлять функциональные возможности в существующие библиотеки или исправлять проблемы («monkey-patch»), не изменяя реальный код библиотеки.Придуманный пример:

class String
  def foo
    "bar!"
  end
end

"hello".foo # => "bar!"

Что касается второго случая, то A на самом деле B::A, что полностью отличается от A, и, таким образом, не открывает заново исходное значение A.Мы можем видеть это здесь:

class A
end

A # => A

class B
end

B    # => B
B::A # warning: toplevel constant A referenced by B::A
     # => A

class B
  class A
  end
end

B::A           # => B::A
A.object_id    # => 70359576062780
B::A.object_id # => 70359575976320
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...