Edited at

インスタンスから名前空間を取得する

More than 1 year has passed since last update.


やりたいこと

インスタンスのクラス名の名前空間の部分だけ抽出したい。

(例えば A::B::C::DA::B::C の部分)


方法

String#deconstantizeString#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#demodulizeString#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