0

例えば

class C1
     class Hash
       def ok?
          return 'nested hash ok'
       end
      end
     def m1
        return Hash.new.ok?
     end
     def m2
        return {}.ok?
     end
end

C1.new.m1は機能しますが、C1.new.m2は機能しません。ネーミングスペースの違いは何ですか?

4

2 に答える 2

3

Hashの中にネストされた、という新しいクラスを作成しただけですC1

Hash期待どおりにRubyのクラスにメソッドを追加しませんでした。class Hash必要に応じて、外側に移動してC1再実行します。コードは期待どおりに実行されます。

現在のコードがそうであるように、ネストされたクラスに。という名前を付けたと仮定しますMyThing。今、あなたは働く{}.ok?ために働かないでしょう?

要約すると:

これはうまくいくでしょう:

class Hash
   def ok?
    return 'non-nested hash ok'
   end
end
class C1
     def m1
        return Hash.new.ok? #WORKS
     end
     def m2
        return {}.ok? #WORKS
     end
end

これは失敗します:

class C1
    class MyThing
      def ok?
       return 'nested hash ok'
       end
    end
     def m1
        return MyThing.new.ok? #WORKS
     end
     def m2
        return {}.ok? #FAILS
     end
end
于 2013-03-07T01:06:03.950 に答える
0
class C1
  class Hash # defines C1::Hash
    def ok?
      return 'nested hash ok'
    end
  end

  def m1
    return Hash.new.ok? # refers to C1::Hash
  end

  def m2
    return {}.ok? # refers to Hash
  end
end

名前空間に基づくクラスの混合はありません。それらは別々です。

于 2013-03-07T01:08:10.640 に答える