在 Ruby 中是否可以使用局部范围内的变量将单例方法添加到现有对象?

Is it possible in Ruby to add singleton methods to an existing object, using variables in the local scope?

我想向 String 对象 b = 'text' 添加一个单例方法 code。它应该能够引用在本地范围内定义的散列 a。但是我的尝试导致错误:

a = {'code'=>200, 'body'=>'text'}
b = a['body']

def b.code
  return a['code']
end

p b.code 

# => 'code': undefined local variable or method `a' for "text":String (NameError)

我怎样才能使这个工作?

a 应作为参数传递给方法范围或在方法中声明从一开始就具有本地方法范围(现在它超出范围,因此在方法中无法识别) .另一种选择是使用 $ 全局声明 a,它应该抑制错误的产生( 但会导致使用 的全局变量的错误示例)。

添加一个保存对局部变量的引用的单例方法不是惯用的 Ruby,但您可以做到。您只需使用块定义方法,闭包就会记住 a.

的值
a = { 'code' => 200, 'body' => 'text' }
b = a['body']

b.send(:define_singleton_method, :code) { a['code'] }

b.code # => 200