[ruby-list:48791] ::Foo:Bar 以外の記法で、常に特定の定数を参照する方法
From:
Kenichi Kamiya <kachick1@...>
Date:
2012-06-05 13:58:28 UTC
List:
ruby-list #48791
こんばんは、かみやと申します。
「自分は同じような状況をこう解消している」
といった内容も嬉しく思いますので、是非御意見下さい。
# 質問
次のコードのコンテキスト #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 <kachick1@gmail.com>