From: Kenichi Kamiya Date: 2012-06-05T22:58:28+09:00 Subject: [ruby-list:48791] ::Foo:Bar 以外の記法で、常に特定の定数を参照する方法 こんばんは、かみやと申します。 「自分は同じような状況をこう解消している」 といった内容も嬉しく思いますので、是非御意見下さい。 # 質問 次のコードのコンテキスト #1〜#4全て(特に# 2, # 4 内)に於いて、 :Sub をベタ書き(::Sub::CONS 等)せずに同じ記法で得る手段はありますでしょうか # コード $VERBOSE = true class Super class << self CONS = :Singleton end CONS = :Super end class Sub < Super CONS = :Sub end class Sub class << self # 1 p CONS #=> :Sub p const_get(:CONS) #=> :Singleton end end class << Sub # 2 p CONS #=> :Singleton p const_get(:CONS) #=> :Singleton end class Sub class Nested < Super # 3 p CONS #=> :Sub p const_get(:CONS) #=> :Super end end class Sub::Nested # 4 p CONS #=> :Super p const_get(:CONS) #=> :Super end # 背景 ネストしたクラスやモジュールを書く際、自分の場合は別ファイルに分割した上で、 インデント数削減の為次のような書き方をすることが良くあります。 * 方法1 module A; module B; module C end; end; end * 方法2 module A::B::C end 方法1は改行文字を";"に変えただけなので普通に動くのですが、 見た目に対して個人的に違和感を感じていました。 その為方法2を最近使っているのですが、この場合継承元の定数しか 参照しない事に気づいておらず、少しハマったことがあります。 1.8.7と1.9.3共に同じ結果ですので、この動作は仕様通りだと思うのですが、 「#1〜#4全てで、(const_getのような)メソッドへ:CONSというSymbolを渡す等して::Sub::CONSを得る手段」 があれば、是非使いたいと思った次第です。 -- Kenichi Kamiya