Send 允许访问私有变量

发布于 2024-07-29 16:34:04 字数 572 浏览 9 评论 0原文

考虑下面的代码:

def create_class(class_name, superclass, &block)
    klass = Class.new superclass, &block
    Object.const_set class_name, klass
end

在我这样做之后:

create_class('User', ActiveRecord::Base)

以下是可以的:

Object.send(:remove_const, :User)

但是这个:

Object.remove_const :User

结果是这样的:

NoMethodError: private method `remove_const' called for Object:Class

? 对我来说没有意义...“发送”可以覆盖 Ruby 的访问检查吗? 请帮忙!

Consider the following code:

def create_class(class_name, superclass, &block)
    klass = Class.new superclass, &block
    Object.const_set class_name, klass
end

After I do:

create_class('User', ActiveRecord::Base)

the following is ok:

Object.send(:remove_const, :User)

but this:

Object.remove_const :User

results in this:

NoMethodError: private method `remove_const' called for Object:Class

? Does not make sense for me... can 'send' override Ruby's access checks? Please help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

兔小萌 2024-08-05 16:34:05

看起来它确实覆盖了 Ruby 的访问检查。

http://joshstaiger.org/archives/2006/12/the_ruby_send_h.html

我的猜测是,您想很好地处理其他人设为私有的内容。 如果您需要使用 send 来调用您未创建的类的方法,您可能应该调用

It looks like it does override Ruby's access checks.

http://joshstaiger.org/archives/2006/12/the_ruby_send_h.html

My guess is that you would like to play nicely with things other people have made private. If you need to use send to call methods of a class you did not create, you should probably call obj.respond_to on it first.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文