ruby - instance_eval 和 class << self 之间的区别?

标签 ruby

我似乎无法理解这两个“构造”之间的确切区别。在我看来,以下小脚本应该输出相同的内容三次:

class Example
  puts self

  class << self
    puts self
  end

  instance_eval do
    puts self
  end
end

但是,输出是:

Example
#<Class:Example>
Example

这是我的理由:

  • ExampleClass 的实例, 所以 self在类主体中指的是;
  • class << objself随便什么obj在给定的 block 中,在我的例子中是 Class 的实例那是 Example (这是我可能错的地方);
  • instance_eval在给定实例中运行 block ,因此,在我的例子中,这与将代码直接放入类主体中的 block 几乎相同。

我目前的猜测是 class << selfExample 之间插入一个幽灵类和 Class并将 self 设置为那个,但是 #<Class:Example> 的输出根本没有确认这一点。

那么我的理由有什么问题呢?

最佳答案

class << obj sets self to whatever obj is in the given block, which in my case is the instance of Class that is Example (this is where I'm probably wrong);

不,class << obj打开 obj单例类 .正如您正确指出的那样,在类声明中,self指的是类本身,因此,在这种情况下,“内部”self (即传递给 puts 的那个)指的是 Example单例类 .

关于ruby - instance_eval 和 class << self 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5805315/

相关文章:

ruby - Rails 4 will_paginate;不换页

ruby-on-rails - 通过 Rails 中的迁移添加自动增量

ruby - Ruby 方法如何发回不同数量的变量?

ruby - 元编程:method_missing 和 __send__

mysql - Rails 测试数据库比开发数据库快 10 倍

ruby-on-rails - Heroku:未找到 Rakefile(但在本地工作)

ruby - 在 block 内使用yield时出现错误 no block

javascript - 为什么 Settimeout 不拉取更新后的图片 URL?

html - 如何从 HTML 中提取有意义的文本

ruby-on-rails - rvm 默认 ruby​​ 版本工作其他版本不工作