加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby self.class.class_eval或singleton_class.class_eval

发布时间:2020-12-16 21:48:30 所属栏目:百科 来源:网络整理
导读:当我做什么有什么不同 class Tdef initialize self.class.class_eval do def test return self.class.object_id end endendend 和 class Tdef initialize singleton_class.class_eval do def test return self.class.object_id end endendend 谢谢 PS. Tass
当我做什么有什么不同
class T

def initialize
 self.class.class_eval do
      def test
        return self.class.object_id
     end
 end
end

end

class T

def initialize
 singleton_class.class_eval do
      def test
        return self.class.object_id
     end
 end
end

end

谢谢

PS.
Tass回答说,在这个例子中,singleton_class将为每个新对象返回一个不同的object_id,因为singleton_class只属于一个Object.但IRB显示

1.9.2p180 :001 > class T
1.9.2p180 :002?>   
1.9.2p180 :003 >     def initialize
1.9.2p180 :004?>      singleton_class.class_eval do
1.9.2p180 :005 >               def test
1.9.2p180 :006?>                 return self.class.object_id
1.9.2p180 :007?>              end
1.9.2p180 :008?>        end
1.9.2p180 :009?>     end
1.9.2p180 :010?>   
1.9.2p180 :011 >     end
 => nil 
1.9.2p180 :012 > t = T.new
 => #<T:0x00000100ae9cb8> 
1.9.2p180 :013 > t1 = T.new
 => #<T:0x00000100ad7ef0> 
1.9.2p180 :014 > t1.test == t.test
 => true 
1.9.2p180 :015 > t1.test
 => 2153233300 
1.9.2p180 :016 > t.test
 => 2153233300 
1.9.2p180 :017 >

解决方法

这些T类的实例之间的区别在于方法查找算法:方法始终在单例类(及其模块)中搜索,只有在此处找不到,则在类中进行搜索.

这意味着如果我们在初始化之后添加方法测试到T类的第一个实现,我们将得到不同于第二个实现类T的相同的结果:

# First example
class T
  def initialize
    self.class.class_eval do
      def test
        return self.class.object_id
      end
    end
  end
end

t = T.new

class T
  def test
    'overriden'
  end
end

puts t.test # => 'overriden'
class T
  def initialize
    singleton_class.class_eval do
      def test
        return self.class.object_id
      end
    end
  end
end

t = T.new

class T
  def test
    'overriden'
  end
end

puts t.test # => 77697390

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读