Ruby BasicObject 方法

Posted

技术标签:

【中文标题】Ruby BasicObject 方法【英文标题】:Ruby BasicObject methods 【发布时间】:2018-08-07 02:36:20 【问题描述】:

在浏览 Ruby 时,我发现 BasicObject 是 Class 的最***超类。当我尝试 BasicObject.methods,我得到了这些方法的列表

[:method_missing, :singleton_method_added, :singleton_method_undefined, :singleton_method_removed, :new, :become_java!, :allocate, :superclass, :java_class, :class_variables, :<=, :public_instance_methods, :prepend, :class_variable_get, :public_constant, :singleton_class?, :instance_methods, :freeze, :instance_method, :const_defined?, :to_s, :constants, :ancestors, :private_instance_methods, :===, :included_modules, :==, :using, :class_eval, :const_get, :refine, :protected_instance_methods, :public_instance_method, :class_variable_defined?, :inspect, :name, :private_constant, :<, :hash, :>, :>=, :module_exec, :protected_method_defined?, :module_eval, :const_missing, :class_exec, :const_set, :private_method_defined?, :public_class_method, :autoload, :<=>, :include, :public_method_defined?, :autoload?, :class_variable_set, :include?, :remove_class_variable, :deprecate_constant, :private_class_method, :method_defined?, :include_class, :handle_different_imports, :java_kind_of?, :public_send, :frozen?, :protected_methods, :java_implements, :public_method, :java, :singleton_methods, :untaint, :javafx, :enum_for, :private_methods, :method, :instance_variables, :object_id, :extend, :itself, :instance_variable_set, :respond_to?, :java_name, :methods, :to_java, :java_package, :singleton_class, :public_methods, :to_enum, :display, :tainted?, :instance_variable_defined?, :untrusted?, :define_singleton_method, :!~, :nil?, :com, :instance_of?, :java_require, :javax, :java_signature, :tap, :java_annotation, :send, :trust, :instance_variable_get, :is_a?, :eql?, :java_field, :remove_instance_variable, :untrust, :class, :=~, :org, :taint, :kind_of?, :clone, :dup, :!, :equal?, :instance_exec, :__id__, :instance_eval, :__send__, :!=]

(我也有 Jruby,所以有一些额外的方法)

但是当我调用BasicObject.methods(false)(用于显示同一类本身的方法的错误参数)时,我得到了

=> [:method_missing, :singleton_method_added, :singleton_method_undefined, :singleton_method_removed]

我有一个查询,理想情况下,带有 false 参数的 class.methods 应该只返回它的方法,而 BasicObject.superclass 返回 nil。还有其他层次结构吗?这些方法从何而来。

如果我遗漏了什么,我正在学习 Ruby Apologozies。 谢谢

【问题讨论】:

我认为这些方法是特定于 JRuby 的,可能会在 BasicObject 类上添加一些方法。我有: BasicObject.methods(false) => [] 【参考方案1】:

这些方法确实是在 BasicObject 上定义的,尽管它们大多只是空定义(method_missing 实际上做了一些工作)。检查source。

我不能确切地说出原因,但在 cmets 中可能会有提示:

已经采取了一些措施以使实现具有单态性 尽可能让Java Hotspot引擎提高性能 其中。这就是一些看起来很奇怪的模式的原因 这个类。

这些方法都是为元编程目的而重新定义的常见钩子。通过在 BasicObject 上定义它们,这可能是通过简化继承链来实现更快的方法解析。

【讨论】:

【参考方案2】:

您不是在问BasicObject 上定义了哪些实例方法,而是BasicObject.instance_methods。您在问,您可以在BasicObject 上调用哪些方法。好吧,BasicObject 和任何其他对象一样是一个对象,因此您可以调用在其类中定义的任何方法(在本例中为 Class)或在其类的超类中(在本例中为分别是ModuleObjectKernelBasicObject)。

【讨论】:

以上是关于Ruby BasicObject 方法的主要内容,如果未能解决你的问题,请参考以下文章

Ruby的`BasicObject.new`没有文档吗?

Ruby 中 BasicObject 的单例类的单例类

Ruby元编程

「译」懂点那啥编译

类和模块(类部分)

ruby 类方法,实例方法内省ruby / rails