gpt4 book ai didi

ruby - 当你重新定义一个方法时它应该什么时候起作用?

转载 作者:数据小太阳 更新时间:2023-10-29 08:22:56 24 4
gpt4 key购买 nike

Ruby Koansabout_open_classes.rb部分,最后的测试是这样的:

class ::Integer
def even?
(self % 2) == 0
end
end

def test_even_existing_built_in_classes_can_be_reopened
assert_equal true, 1.even?
assert_equal false, 2.even?
end

似乎 def even? 什么也没做;如果我改变方法,它似乎不起作用:

class ::Integer
def even?
(self % 2) != 0
end
end

测试仍然成功。

我认为这是因为 even 已经在 Ruby 中定义了。那是对的吗?为什么会这样?

最佳答案

Ruby 核心并不特殊,问题是这里的even? 不是来自Integer,而是来自Fixnum .由于 Fixnum1 的祖先中低于 Integer,因此在 Integer 中重新定义它没有任何效果,因为甚至从未被调用.

Fixnum 中重新定义可以正常工作:

1.even?  #=> false
class Fixnum; def even?; true; end end
1.even? #=> true

并且,作为引用,这里是 1 的祖先:

1.class.ancestors  #=> [Fixnum, Integer, Numeric, Comparable, Object, Kernel, BasicObject]

您可以通过获取 Method 来判断 even? 来自 Fixnum对象,然后是它的 owner :

1.method(:even?).owner  #=> Fixnum
1.method(:ceil).owner #=> Integer

关于ruby - 当你重新定义一个方法时它应该什么时候起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23332237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com