Какова цель "ноль" частных методов в рубине?
Используя 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]
Я задаюсь вопросом о целях этих частных методов и не нашел ничего интересного в Интернете.
Ответы
Ответ 1
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]
Ответ 2
Вот частные методы NilClass
организованные владельцем. Обратите внимание, что ни один из этих методов не принадлежит NilClass
, модулю JSON
или любому вложенному модулю в JSON
.
require 'json'
nil.private_methods.sort.group_by { |m| NilClass.method(m).owner }
#=> {Kernel=>[:Array, :Complex, :Float, :Hash, :Integer, :JSON, :Rational,
# :String, :__callee__, :__dir__, :__method__, :', :abort,
# :at_exit, :binding, :block_given?, :caller, :caller_locations,
# :catch, :eval, :exec, :exit, :exit!, :fail, :fork, :format,
# :gem, :gem_original_require, :gets, :global_variables,
# :initialize_dup, :iterator?, :j, :jj, :lambda, :load,
# :local_variables, :loop, :open, :p, :print, :printf, :proc,
# :putc, :puts, :raise, :rand, :readline, :readlines, :require,
# :require_relative, :respond_to_missing?, :select, :set_trace_func,
# :sleep, :spawn, :sprintf, :srand, :syscall, :system, :test,
# :throw, :trace_var, :trap, :untrace_var, :warn],
# Object=>[:DelegateClass, :default_src_encoding, :irb_binding],
# Module=>[:autoload, :autoload?, :initialize_clone, :initialize_copy],
# Class =>[:initialize], BasicObject=>[:method_missing, :singleton_method_added,
# :singleton_method_removed, :singleton_method_undefined]}
Вместо этого можно было написать
NilClass.private_instance_methods.sort.group_by { |m| NilClass.method(m).owner }
Вторая часть вопроса задает цель каждого из этих методов. Я возьму их по очереди.
:Array
Например, nil.send(:Array, 2) #=> [2]
. Я не совсем уверен, как это можно использовать.
:Complex
Например, nil.send(:Complex, 2,3) #=> (2+3i)
. Я не совсем уверен, как это можно использовать.
:Float
Должен быть завершен...