当 Ruby `Complex` class 的关系运算符 none 除了 `==` 时,它的祖先怎么会有 `Comparable` 呢?
How can Ruby `Complex` class have `Comparable` in its ancestors when it has none of its relational operator except `==`?
确实:
Comparable.instance_methods # => [:clamp, :<=, :>=, :==, :<, :>, :between?]
Complex.ancestors # => [Complex, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]
Complex.instance_methods.select{Comparable.instance_methods.include? _1} # => [:==]
当然,==
也是在BasicObject中定义的,所以即使==
也不算多
这怎么可能?你能删除 Ruby 中的祖先方法吗?
是否可以完全删除方法?
您可以通过两种方式删除方法,undef_method
and remove_method
undef_method
将移除竞争调用该方法的能力,但 remove_method
将仅移除当前方法,让您回退到存在的超级方法。
class Foo
undef_method :bar
end
确实:
Comparable.instance_methods # => [:clamp, :<=, :>=, :==, :<, :>, :between?]
Complex.ancestors # => [Complex, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]
Complex.instance_methods.select{Comparable.instance_methods.include? _1} # => [:==]
当然,==
也是在BasicObject中定义的,所以即使==
也不算多
这怎么可能?你能删除 Ruby 中的祖先方法吗?
是否可以完全删除方法?
您可以通过两种方式删除方法,undef_method
and remove_method
undef_method
将移除竞争调用该方法的能力,但 remove_method
将仅移除当前方法,让您回退到存在的超级方法。
class Foo
undef_method :bar
end