【问题标题】:Send allows access to private variables发送允许访问私有变量
【发布时间】:2009-07-24 12:56:40
【问题描述】:

考虑以下代码:

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 的访问检查吗?请帮忙!

【问题讨论】:

  • Ruby 中并没有真正意义上的私有变量。他们都是私人的。只有方法有访问控制。

标签: ruby metaprogramming access-specifier


【解决方案1】:

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

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

我的猜测是,您想很好地处理其他人保密的事情。如果你需要使用 send 来调用你没有创建的类的方法,你应该先调用obj.respond_to

【讨论】:

  • 看起来像...谢谢!顺便问一下,'remove_const' 如何合理地被调用,即,哪个其他方法调用它?
  • 快速谷歌搜索显示:java2s.com/Code/Ruby/Reflection/…我没有尝试过,所以它可能是错误的。此外,您可能希望将问题的标题更改为“发送允许访问私有变量”之类的内容,以便更轻松地搜索它。
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2012-05-09
相关资源
最近更新 更多