2013-05-30 2 views
0
module M 
    def func1_in_M 
    @some_popular_name = 'some data needed for M' 
    end 

    def func2_in_M 
    p @some_popular_name 
    end 
end 

class C 
    include M 

    def initilaize 
    @some_popular_name = "some data needed for C, but this guy didn't know what are used in M" 
    end 

    def func1_in_C 
    p @some_popular_name 
    end 
end 

o = C.new 
o.func1_in_M 
o.func1_in_C# => "some data needed for M" 

Этот результат, очевидно, не соответствует кодеру класса C. Такая проблема может быть легко реализована при многомодульном смешивании/мульти-подклассификации. Есть ли хорошее предложение избежать этого? @var ... все равно может привести к тому же. name-mangling-related-to-module .__ id? как?Как избежать конфликтов имен переменных в подклассах или классах, включая модули в Ruby?

ответ

0

Ваша ситуация приведет к поражению цели включения модуля. Включение модуля означает, что вы предоставляете функциональность включенного модуля классу, который представляет собой методы и переменные экземпляра.

Если вы ожидаете, что программист класса C, чтобы не знать о том, что происходит в M, то вы не должны включать в MC или подкласс C от M. Скорее, вы должны делегировать некоторые функции M от C.

+0

Благодарим вас за комментарий. Но я думаю, что это своего рода недостаток Ruby (меньше инкапсуляции), так как Matz подумал, что введение частных экземпляров vars (но не выпущено, у которого есть эта функция еще). Как вы сказали, да, мы могли бы сказать, что переменные экземпляра в модулях также являются частью протокола/контракта между модулями и классом пользователя. – user1729378

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