[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>

In This Thread

Prev Next