2017-02-14 7 views
0

Исходя из мира C# Я привык к классам мышления - это неизменные определения объектов и что каждый объект имеет фиксированный класс.Ruby: предоставить примеры реального мира, когда вы открыли объекты eigenclass и изменили его

Я пытаюсь открыть свой разум к возможностям использования

class << some_object 
    def something_unique_to_this_object 
    # code 
    end 
end 

Я не говорю о class << self.
Я говорю об изменении определения одного или нескольких объектов, но не все из них, например, class << self.

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

+0

Кажется, что алгоритм stackoverflow отражает этот субъективный вопрос. Это не. Есть тонны открытых вопросов: http://stackoverflow.com/questions/1605774/real-world-use-of-binding-objects-in-ruby или http://stackoverflow.com/questions/1343619/php -real-world-oop-example –

+0

Благодарим вас за то, что вы нашли те старые вопросы, которые больше не по теме и должны быть закрыты и удалены! –

+0

Есть намного больше. Почему вы думаете, что они не по теме? –

ответ

2

Вы говорите, что "не нравится class << self". Ну, угадайте, какие методы класса/модуля реализованы именно таким образом. Существует причина сходства в синтаксисе. self внутри определения класса относится к самому классу. Любые методы класса/модуля, которые вы определяете, на самом деле являются методами eigenclass этого класса/модуля. Ваш конкретный класс - всего лишь один экземпляр класса Class.


Для других примеров рассмотрим что-то вроде rspec. Как бы вы реализовали double и добавить к нему некоторые методы динамически? Как бы вы заглушили метод существующего объекта? Eingenclasses легко и идеально подходят для этого.


В отличие от других применений meta, я также иногда нахожу это удобным при отладке. Как я могу поставить точку останова, изменить поведение какого-либо объекта и продолжить после точки останова, чтобы увидеть, что происходит. Возможно, вы не захотите повлиять на все объекты этого класса, или объект может быть экземпляром анонимного класса.

+0

Первый абзац - я знаю все это, специально просил не использовать это. :) RSpec - хороший пример. Я бы хотел, чтобы пример отладчика был менее абстрактным, более конкретным, он больше открыл бы мой разум. Активируйте этот ответ, надеясь на большее. –

+0

@ MarkoAvlijaš, я не помню точный вариант использования отладки. Это как-то связано с simple_form и экземпляром анонимного класса, который был подклассом другого анонимного класса (несколько раз). – ndn