2013-03-07 5 views
0

, напримеррубин внутренний класс Hash

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 нет. какое значение имеет смысл в именовании пространства?

+0

Если я хочу добавить метод «хорошо?» в хэш, но применимы только к классу C1 и его подклассу. Как это сделать? – Yehudi

ответ

3

Вы просто создали новый класс под названием Hash, вложенный внутри C1.

Вы не добавили метод в класс Ruby's Hash, как вы ожидали. Если вы этого хотите, переместите 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 
+0

Вы можете редактировать встроенный класс 'Hash' изнутри' C1', указав глобальное пространство имен, например. 'class :: Hash' – Max

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 

Там нет смешение классов на основе пространств имен. Они отделены друг от друга.

Смежные вопросы