-1

这是一个简单的例子:

def abc
    puts 'abc'
end

class Foo
    def self.bar
        abc
    end
end

Foo.bar

这会中断,因为abc在内部未定义Foo.bar。有没有办法告诉班级“继承”本地绑定以完成上述工作?我基本上是在尝试为“bar”方法创建一个简单的命名空间。

我的第一次尝试是从当前的 eigenclass ( class Foo < (class << self; self; end)) 子类化,但你不能子类化一个虚拟类。另外,虽然我可以显式地传入绑定并在里面使用 eval ,但这不是我想要的。

4

3 回答 3

1

这个怎么样

但我一般不建议自己做

def abc
    puts 'abc'
end

class Foo
    def self.bar
        eval("abc",TOPLEVEL_BINDING)
    end
end

Foo.bar
于 2012-10-25T17:35:25.657 回答
1

如果您只需要一个简单的命名空间,您可以使用模块吗?

def abc
  puts 'abc'
end

module Foo
  def self.bar
    abc
  end
end

Foo.bar #=> abc
于 2012-10-25T17:37:16.213 回答
1

这会中断,因为abc在内部未定义Foo.bar

不,它没有。abc被隐式定义为一个私有实例方法,Object并且由于一个类 IS-A Object,你可以调用它就好了。您发布的代码应该按原样工作,并且确实我有用。

于 2012-10-25T23:05:44.577 回答