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

时间:2015-04-30 23:09:32

标签: ruby scope singleton-methods

我想在String对象code中添加单例方法b = 'text'。它应该能够引用本地范围中定义的哈希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)

我该如何做到这一点?

2 个答案:

答案 0 :(得分:2)

添加一个包含对局部变量的引用的单例方法不是惯用的Ruby,但是你可以这样做。您只需使用块定义方法,闭包将记住a的值。

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

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

b.code # => 200

答案 1 :(得分:1)

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