gpt4 book ai didi

ruby - ruby 中 `nil` 私有(private)方法的目的是什么?

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

使用 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]

看起来那些私有(private)方法链接到加载的模块:

methods = nil.private_methods.dup
require "json"
nil.private_methods - methods
# [:j, :JSON, :jj]

我想知道这些私有(private)方法的用途,但在互联网上没有找到任何相关信息。

最佳答案

NilClass 本身不声明任何私有(private)实例方法。它们来自 KernelBasicObject:

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接受 bool 参数,当设置为 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]

关于ruby - ruby 中 `nil` 私有(private)方法的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51610709/

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