Moduleのprivateインスタンスメソッド, 具体的には
Module::module_function
のふるまいで, 腑に落ちない点があった. 派生先のClassクラス (ひいては一般に定義されたクラス) からなぜ使えないのか? ということで, 実験した. 結論的には 仕様だった, という落ちでした……w#
# Q. Module#module_functionは, なぜかClassに継承されていない?
#
# A. 仕様による =>
# Module のメソッドのうち
# * Module#module_function
# * Module#extend_object
# * Module#append_features
# * Module#prepend_features
# * Module#refine
# は Class では未定義にされています。
# https://docs.ruby-lang.org/ja/2.2.0/class/Class.html
#
class Module
private
def meth_test_private; 1; end
end
#
puts "Moduleにふつうにprivateインスタンスメソッドを定義した場合:"
p Module.private_instance_methods.include? :meth_test_private
p Class.private_instance_methods.include? :meth_test_private
puts
#
puts "ModuleとClassでのprivateインスタンスメソッドの差分:"
pm = Module.private_instance_methods.sort
pc = Class.private_instance_methods.sort
puts "ModuleにあってClassにない: #{pm-pc}"
puts "ClassにあってModuleにない: #{pc-pm}"
puts
#
puts "Moduleに定義したprivateインスタンスメソッドを, 任意のクラス経由でアクセス:"
p Array.method(:meth_test_private).owner
p Array.send :meth_test_private
puts
puts "module_functionをModule, Class, Arrayからアクセス:"
p Module.private_instance_methods.include? :module_function
p Class.private_instance_methods.include? :module_function
begin
p Class.method(:module_function).owner
rescue =>e
p e
end
p Array.private_instance_methods.include? :module_function
begin
p Array.send :module_function
rescue =>e
p e
end
#
0 件のコメント:
コメントを投稿
何かありましたら、どうぞ: