ruby - ruby 中“nil”私有方法的目的是什么?
问题描述
使用 ruby 2.3 和 pry REPL,我得到了一个我无法理解的有趣结果:
nil.private_methods
# [:DelegateClass, :Digest, :sprintf, :format, :Integer, :Float, :String, :Array, :Hash, :throw, :iterator?, :block_given?, :catch, :loop, :Rational, :trace_var, :untrace_var, :Complex, :at_exit, :gem_original_require, :URI, :set_trace_func, :select, :caller, :caller_locations, :test, :fork, :`, :exit, :sleep, :respond_to_missing?, :load, :exec, :exit!, :syscall, :open, :printf, :print, :putc, :puts, :readline, :readlines, :p, :abort, :gets, :system, :spawn, :proc, :lambda, :srand, :pp, :rand, :initialize_copy, :initialize_clone, :initialize_dup, :Pathname, :trap, :gem, :BigDecimal, :require, :require_relative, :autoload, :autoload?, :binding, :local_variables, :warn, :raise, :fail, :global_variables, :__method__, :__callee__, :__dir__, :eval, :method_missing, :singleton_method_added, :singleton_method_removed, :singleton_method_undefined, :initialize]
看起来这些私有方法链接到加载的模块:
methods = nil.private_methods.dup
require "json"
nil.private_methods - methods
# [:j, :JSON, :jj]
我想知道这些私有方法的目的,并没有在互联网上找到任何相关的东西。
解决方案
NilClass
它自己不声明任何私有实例方法。他们来自Kernel
和BasicObject
:
NilClass.ancestors
#⇒ [NilClass, Object, PP::ObjectMixin, Kernel, BasicObject]
NilClass.private_instance_methods -
(NilClass.ancestors - [NilClass]).flat_map(&:private_instance_methods)
#⇒ []
任何 ruby 类都派生自BasicObject
并包含Kernel
.
此外,Module#private_instance_methods
接受布尔参数,当设置为时抑制继承方法的输出false
:
NilClass.private_instance_methods false
#⇒ []
JSON
另一方面NilClass
,所有其他类中的猴子补丁:
require 'json'
NilClass.ancestors
#⇓ [NilClass, JSON::Ext::Generator::GeneratorMethods::NilClass,
# Object, JSON::Ext::Generator::GeneratorMethods::Object,
# PP::ObjectMixin, Kernel, BasicObject]
推荐阅读
- macos - macOS 终端,User 文件夹的目录
- flutter - 在 dart 中读取 UTF-16 LE 文件
- java - Android Google Map如何检查用户是否在标记矩形区域
- android - 如何在 android 中使用 style.xml 设置填充和文本类型面
- ios - 为什么我不能在@IBAction func 之外调用函数 StartTime?
- java - 如何在 Prometheus 中持续轮询 JSON 数据?
- python - 如何在熊猫中执行条件分组计算并前向填充零值
- database - 在 Docker 创建 MongoDB 上创建用户
- python - Django Oscar 仪表板的自定义图标
- net-snmp - 发送陷阱时出现 pysnmp.smi.error.SmiError