2012年6月 5日

[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 <kachick1@xxxxx>


投稿者 xml-rpc : 2012年6月 5日 22:58
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/110861
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。