如本回答所述,在Ruby 2.1或更高版本中,此代码:
class SimpleTest
private
define_method :foo do
42
end
end
Run Code Online (Sandbox Code Playgroud)
将定义foo为私有的SimpleTest实例方法.(在Ruby 2.0和更早版本中它不会是私有的.)但是,我希望做一些不那么微不足道的事情.我想定义类可以扩展的DSL,并希望DSL内部定义的方法尊重调用上下文的私有/受保护可见性.这可能不太清楚,所以这是一个例子:
module Dsl
def has_a(name)
define_method name do
42
end
end
end
class Test
extend Dsl
private
has_a :thing
end
Run Code Online (Sandbox Code Playgroud)
如上所述,该代码将在实例上定义公共 thing方法Test.相反,我希望has_a能够反映调用它的方法可见性(private在本例中),并thing在同一方法可见性下定义.
我不熟悉Ruby的C源代码,但我快速浏览了一下,发现这个函数似乎可以做我想要的,但我不认为它可以从Ruby访问.(这似乎只能用在这里.)我也查阅了文档define_method(因为第一个示例根据需要),在这里,它似乎像noex声明,这里设置变量:
int noex = NOEX_PUBLIC;
const NODE *cref = rb_vm_cref_in_context(mod, mod);
if (cref) {
noex = (int)cref->nd_visi;
}
Run Code Online (Sandbox Code Playgroud)
可能是我想要的价值,但我不知道如何在Ruby中获得它,或者即使它能够反映出调用范围(in Test …
ruby ×1