小编rma*_*lin的帖子

是否可以动态检查方法可见范围(私有/公共/受保护)?

本回答所述,在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

6
推荐指数
1
解决办法
80
查看次数

标签 统计

ruby ×1