Рубиновые драгоценные камни когда-либо конфликтуют? - PullRequest
1 голос
/ 27 июля 2010

Как рубиновый новичок, мне было интересно, будут ли драгоценные камни когда-нибудь конфликтовать друг с другом?Например, если 2 драгоценных камня превысили метод << в массиве, который победил бы, или есть что-то, чтобы остановить это? </p>

Спасибо

Ответы [ 3 ]

4 голосов
/ 27 июля 2010

Полагаю, вы говорите о переопределении методов, а не об их переопределении, верно? Если две библиотеки перекрывают один и тот же метод в двух разных подклассах, проблем не будет.

Если две или более библиотек переопределяют один и тот же метод, то какая из них загружается в последнюю очередь. Фактически, это на самом деле ничем не отличается от простой одной библиотеки , переопределяющей метод: интерпретатор Ruby предоставляет реализацию Array#<< для вас, и если вы переопределите ее, ваше определение выиграет просто потому, что оно появилось позже .

Лучший способ остановить это очень просто: не пытайтесь использовать существующие методы. И не используйте библиотеки, которые делают. Флаг командной строки -w для включения предупреждений очень полезен, поскольку, по крайней мере, в Ruby 1.9.2 он выводит предупреждение, если методы переопределены.

В Ruby 2.0, вероятно, будет какой-то механизм для выделения (пере) определений методов в какое-то пространство имен. Я бы не стал затаить дыхание: об этих так называемых пространствах имен селекторов говорят в сообществе Ruby уже почти 10 лет, а в сообществе Smalltalk даже дольше, чем это, и AFAIK никто никогда не производил рабочую реализацию или даже рабочий дизайн для Ruby. Более новой идеей является идея Classboxes .

1 голос
/ 28 июля 2010

Насколько я могу судить, вы говорите об обезьяньей ловушке (также известной как утка в сообществе рубинов).

В этой статье есть еще один пример обезьяноподготовки (и других приемов), который испортился.

0 голосов
/ 27 июля 2010

На практике нет, хотя вы, вероятно, могли бы построить такую ​​ситуацию, если бы действительно пытались. Вот интересная статья (хотя и старая), которая объясняет, как это могло произойти.

Если два гема "переопределят метод << в массиве", им нужно будет создать подкласс Array, и эти классы будут иметь разные имена или находиться в разных модулях. </p>

...