ruby - block 中定义的方法属于哪个类?

标签 ruby ruby-2.3

这是一个类

class Foo
  def test_method(&c)
    puts "inside test method"
    c.call
  end
end 

现在,如果我在 block 中定义一个方法

f = Foo.new
f.test_method do 
  def m1
    puts "inside the method m1 defined inside the block"
  end
  puts m1.class
end

block 的输出是NilClass

如果一个方法是在类外定义的,它就成为类 Object 内的私有(private)方法。为什么 block 内定义的方法会成为 NilClass 的一部分,而不是 Foo 类的一部分?

最佳答案

首先,m1返回puts的结果,即nil

其次,在您当前的代码中,m1 方法是为 Object 类定义的,因为默认情况下 block 保留其上下文,而不仅仅是局部变量(它始终如此) ),但也适用于“当前对象”和“当前类”。如果您希望您的定义按预期工作,您可以使用 class_eval,它会更改 block 内的当前类(在不同的上下文中执行此 block :

class Foo
  def test_method(&c)
    puts 'inside test method'
    self.class.class_eval(&c)
  end
end
f = Foo.new
f.test_method do
  def m1
    # anything
  end
end

Foo.instance_methods.grep(/m1/)
# => [:m1]
f.m1
# => not an error
Object.new.m1
# => NoMethodError: undefined method `m1' for #<Object:0x00000001c9b4f8>

关于ruby - block 中定义的方法属于哪个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51497766/

相关文章:

ruby-on-rails - Ruby 2.3.3 : Weird Tempfile. new([name, prefix]) basename converted to hash

ruby - 使用 RVM 在 OSX 10.15.2 Catalina 中安装 Ruby 2.3.8 时出错;未找到 OpenSSL

ruby - 收集 Ruby Parallel Gem 的结果

ruby - 如何在 Ruby 中用数组替换字符串参数?

ruby - 当前的 Ruby 方法是通过 super 调用的吗?

Ruby 2.3.8 在 mint 中使用 rbenv 安装错误 |不常见.mk :203: recipe for target 'build-ext' failed

ruby-on-rails - rails : How to access current controller in an Observer?

ruby-on-rails - 单击链接不会触发操作

ruby-on-rails - 即使记录也存在,如何返回 .save() 的成功? -- rails 3.1

ruby-on-rails - 使用 ActiveResource 和 session token 验证请求