gpt4 book ai didi

ruby - 是否可以动态检查方法可见性范围(私有(private)/公共(public)/ protected )?

转载 作者:数据小太阳 更新时间:2023-10-29 07:08:05 24 4
gpt4 key购买 nike

this answer 中所述,在 Ruby 2.1 或更高版本中,此代码:

class SimpleTest
private

define_method :foo do
42
end
end

将定义 foo作为 SimpleTest 的私有(private)方法实例。 (在 Ruby 2.0 和更早版本中,它不会是私有(private)的。)但是,我希望做一些不那么琐碎的事情。我想定义一个类可以扩展的 DSL,并希望 DSL 在内部定义的方法尊重调用上下文的私有(private)/ protected 可见性。这可能不是很清楚,所以这里有一个例子:

module Dsl
def has_a(name)
define_method name do
42
end
end
end

class Test
extend Dsl

private

has_a :thing
end

如所写,该代码将定义一个public thing Test 上的方法实例。相反,我想要 has_a能够反射(reflect)调用方法的可见性(在本例中为 private),并定义 thing在相同的方法可见性下。

我对Ruby的C源代码不熟悉,但快速浏览了一下,发现this function看起来它可能会做我想做的事,但我不认为它可以从 Ruby 访问。 (它似乎只用于 here 。)我还查找了 define_method 的文档。 (因为第一个示例按预期工作)here看起来像 noex在这里声明和设置的变量:

int noex = NOEX_PUBLIC;
const NODE *cref = rb_vm_cref_in_context(mod, mod);

if (cref) {
noex = (int)cref->nd_visi;
}

可能是我想要的值,但我还是不知道如何在 Ruby 中获得它,或者即使它能够反射(reflect)回调用范围(在 Test 中)。假设我有可见性,那么我可以简单地调用 private name (或 protected name )在 define_method 之后内拨has_a如果它没有在 public 中被调用上下文。

想法?有什么办法可以做到这一点,还是我运气不好?

最佳答案

我认为这个问题的答案与您要查找的内容相似:https://stackoverflow.com/a/28075865/5129208

看起来作者制作了一个自定义模块来获得您想要的行为。

关于ruby - 是否可以动态检查方法可见性范围(私有(private)/公共(public)/ protected )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32259025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com