bar_1

contents_map

2017年11月16日木曜日

Rubyの実験: Moduleのprivateインスタンスメソッド

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 件のコメント:

コメントを投稿

何かありましたら、どうぞ: