Rubyの名前空間を扱う方法とは【メンターが回答】

「Rubyのインスタンスから名前空間を取得する方法を教えてください」という質問にTechAcademyのメンターが回答しています。deconstantizeメソッド と constantizeメソッドの使い方をぜひ理解しておきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

※TechAcademyに実際に寄せられた質問に現役エンジニアのメンターが回答しました。

 

田島悠介

質問に対して現役のエンジニアが回答していくシリーズだね!

大石ゆかり

今回はどういう質問でしょうか?

田島悠介

今回は、Rubyに関する内容だね!実際に回答してもらった内容を紹介するね!

大石ゆかり

お願いします!

質問

該当のソースコードのようなクラスがありインスタンスから、クラスの名前空間を得ています。

> neko = Zoo::Cat.new

> neko.class.to_s.split(""::"")[0]
=> ""Zoo""

以下の書き方以外でもっと簡単に取得できるメソッドはありますか?

 

該当のソースコード

module Zoo

  class Cat 
    def tuna
    ""delicious""
    end
  end

end

 

[PR] Rubyのプログラミングで挫折しない学習方法を動画で公開中

メンターからの回答

もちろんその方法でも取れるのですが、もっと簡単に取れるメソッドがあります。

deconstantizeメソッド と constantizeメソッドを活用しましょう。

neko = Zoo::Cat.new
class_name = neko.class.name
class_name.constantize.deconstantize
=> "Zoo"

 

constantizeメソッド

引数の文字列で指定した名前で定数を探すメソッドです。

'Module'.constantize # => Module

 

deconstantizeメソッド

文字列から右端のセグメントを削除するメソッドです。

'Net::HTTP'.deconstantize
# "Net"

ここで、constantizeを使ってZoo::Catが取得できます。

その後、メソッドチェーンで繋いだdeconstanizeで::Catを削除するので、Zooが取得できるという流れです。

是非トライしてみて下さい。

 

関連情報

Railsドキュメント:constantize
http://railsdoc.com/references/constantize

Railsドキュメント:deconstantize
http://railsdoc.com/references/deconstantize

 

回答してくれたメンター

メンターKN

エンジニアとして案件を受注し会社を経営しています。

Ruby on Railsでの開発を中心に、サーバーの保守運用も行っています。

 

大石ゆかり

回答分かりやすかったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

他にもメンターが回答したRuby on Rails send_dataのリダイレクト発生タイミングとはの記事も合わせてご覧ください。

また、TechAcademyでは初心者でも最短4週間でエンジニアになれるRuby on Railsオンラインブートキャンプを開催しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

独学に限界を感じている場合はご検討ください。