D
David Walker
The behavior of this snippet doesn't make sense to me:
class A
def A.class_method
puts "Class method worked in #{self}"
end
end
class B < A; end
aklass = (class << A; self; end)
bklass = (class << B; self; end)
p RUBY_VERSION
A.class_method
B.class_method
p A.methodclass_method)
p B.methodclass_method)
p aklass.instance_methodclass_method)
p bklass.instance_methodclass_method)
p A.methodclass_method).unbind
p B.methodclass_method).unbind
p A.methodclass_method).unbind.bind(A)
p B.methodclass_method).unbind.bind(B)
The output (for me) is:
"1.8.4"
Class method worked in A
Class method worked in B
#<Method: A.class_method>
#<Method: B(A).class_method>
#<UnboundMethod: #<Class:A>#class_method>
#<UnboundMethod: #<Class:A>#class_method>
#<UnboundMethod: #<Class:A>#class_method>
#<UnboundMethod: #<Class:A>#class_method>
#<Method: A.class_method>
/workplace2/test.rb:24:in `bind': singleton method called for a
different object (TypeError)
from /workplace2/test.rb:24
In my mind, the last call should succeed, instead of raising an error.
Is it just plain impossible to re-bind the method to yield a #<Method:
B(A).class_method>?
class A
def A.class_method
puts "Class method worked in #{self}"
end
end
class B < A; end
aklass = (class << A; self; end)
bklass = (class << B; self; end)
p RUBY_VERSION
A.class_method
B.class_method
p A.methodclass_method)
p B.methodclass_method)
p aklass.instance_methodclass_method)
p bklass.instance_methodclass_method)
p A.methodclass_method).unbind
p B.methodclass_method).unbind
p A.methodclass_method).unbind.bind(A)
p B.methodclass_method).unbind.bind(B)
The output (for me) is:
"1.8.4"
Class method worked in A
Class method worked in B
#<Method: A.class_method>
#<Method: B(A).class_method>
#<UnboundMethod: #<Class:A>#class_method>
#<UnboundMethod: #<Class:A>#class_method>
#<UnboundMethod: #<Class:A>#class_method>
#<UnboundMethod: #<Class:A>#class_method>
#<Method: A.class_method>
/workplace2/test.rb:24:in `bind': singleton method called for a
different object (TypeError)
from /workplace2/test.rb:24
In my mind, the last call should succeed, instead of raising an error.
Is it just plain impossible to re-bind the method to yield a #<Method:
B(A).class_method>?