ruby self.class.class_eval 或 singleton_class.class_eval

标签 ruby metaprogramming ruby-1.9

我这样做有什么区别

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

谢谢

附言。 塔斯回答说在这个例子中,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类在方法查找算法中:总是在单例类(及其模块)中搜索方法,只有在这里找不到它,才会在中搜索.

这意味着如果我们添加方法 test到类的第一个实现 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

关于ruby self.class.class_eval 或 singleton_class.class_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9066979/

相关文章:

javascript - 在 emberJS 中运行时生成方法

ruby-on-rails - 在 ruby​​ 中如何将 self 传递给 class_eval ?

ruby-on-rails - 不兼容的字符编码 : ASCII-8BIT and UTF-8 in Ruby 1. 9

ruby - 我如何在 Ruby 中引用函数?

ruby-on-rails - Rails javascript_include_tag 和 stylesheet_link_tag 上的错误 URI

ruby-on-rails - 尝试通过 ubuntu WSL 终端在 rails 上安装 ruby​​ 时出现多个错误

ruby-on-rails - Mongoid:按嵌套子值排序

css - 局部 View 中的实例变量

c++ - 在 C++ 中实现原始递归组合器

ruby-on-rails - 不将 nil 值分配给哈希