スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

はまった。

多分名前空間関連。

class A
  def foo
  end
end

module B
  module C
    class A
    end
  end
end

↑んな感じで下の名が同じ「A」なクラスがあるわけです。
下の人は「B::C::A」さんです。
上の人はただの「A」さん。

で、B::D::E の中で A.foo を呼ぼうとしたところ
「B::C::Aにはそんなメソッドないよ」と例外返されました。
まさかお前近いとこから下の名前がAな人勝手に拾ってきやがった?!

どこかで似たようなケースを見たような気がする。
が、解決法を見つけないとちょっと進められないんです、これが。

グーグル様、なんとかしてくだせぇ。


割とすぐ解決方法が見つかった。グーグル様、ありがとう。

参照URL:プログラム(II)/定数のネスト

Const == ::Const

頭に::が付くと「トップレベルで定義された定数である」ことを示す。ファイ ルシステムのパスに例えてみるといい。ルートディレクトリにvmunixというファ イルがあったとしよう。/にいるときは単にvmunixと書けばアクセスできる。 またフルパスで/vmunixと指定することもできる。Constと::Constもその関係 と同じである。トップレベルにいる間は単にConstと書いてもいいし、フルパ スで::Constと書いてもいい。

ではファイルシステムのディレクトリにあたるものはRubyではなんだろうか。 それはクラス定義文とモジュール定義文である。しかし二つあると長くて面倒 なので以後はまとめてクラス定義文で代表することにしておこう。そのクラス 定義文中では定数レベルが上がる(ディレクトリの中に入る)。

class SomeClass
  Const = 3
end

p(::SomeClass::Const) # 3と表示する
p( SomeClass::Const) # 同じ。3と表示する

SomeClassはトップレベルで定義されたクラス即ち定数なので単にSomeClassと 書いても::SomeClassと書いても参照できる。そしてそのクラス定義にネスト している定数Constは「SomeClassの中にある」Constということで、 ::SomeClass::Constになる。


とのこと。
わーい、解決。よかったよかった。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

ヒキコモラー

Author:ヒキコモラー
FC2ブログへようこそ!

最新記事
月別アーカイブ
カテゴリ
FC2プロフ
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。