やりたいこと
インスタンスのクラス名の名前空間の部分だけ抽出したい。
(例えば A::B::C::D
の A::B::C
の部分)
方法
String#deconstantize と String#constantize を使って実現できます。 (Special thanks to @jkr_2255)
module Puella
module Magi
class HolyQuintet
def initialize(name)
@name = name
end
end
end
end
instance = Puella::Magi::HolyQuintet.new("美樹さやか")
#=> #<Puella::Magi::HolyQuintet @name="美樹さやか">
class_name = instance.class.name
#=> "Puella::Magi::HolyQuintet"
class_name.deconstantize
#=> "Puella::Magi"
class_name.deconstantize.constantize
#=> Puella::Magi
以前 (2014/09/11 (木)) 紹介していた方法
String#demodulize と String#gsub を使えば簡単にできるよ!
module Puella
module Magi
class HolyQuintet
def initialize(name)
@name = name
end
end
end
end
# Active Support Core Extensions が提供している String#demodulize を利用するため。
require 'active_support/core_ext'
instance = Puella::Magi::HolyQuintet.new("美樹さやか")
#=> #<Puella::Magi::HolyQuintet @name="美樹さやか">
class_name = instance.class.name
#=> "Puella::Magi::HolyQuintet"
class_name.demodulize
#=> "HolyQuintet"
# 名前空間の文字列を取得する。
class_name.gsub("::#{class_name.demodulize}", "")
#=> "Puella::Magi"
# 名前空間の Module (or Class) を取得する。
class_name.gsub("::#{class_name.demodulize}", "").constantize
#=> Puella::Magi