Пример кода на Ruby. Как это абстрагируется? - PullRequest
0 голосов
/ 27 января 2011

Посмотрев это видео от Иегуды, он дал этот фрагмент о том, как Ruby помогает вам создавать лучшие абстракции.

class FOWA
    def self.is_fun
        def fun?
            true
        end
    end


    is_fun
end

Он говорил о том, как в ruby ​​повторять код в своем классе нади снова, вы можете абстрагировать это без необходимости думать о вещах с точки зрения методов и т. д. И он сказал, что это было использование метода метапрограммирования.

Может кто-нибудь объяснить, что это такое?Это метод класса в FOWA (поэтому он похож на статический метод, вам не нужен экземпляр для его вызова), и этот метод класса на самом деле просто оборачивает другой метод, который возвращает true.

И это is_funметод класса сейчас выполняется или как?не уверен, что делает последняя строка "is_fun"?

http://vimeo.com/11679138

1 Ответ

2 голосов
/ 27 января 2011

Вызов is_fun в конце класса вызывает статический метод. Статический метод затем определяет метод fun? внутри класса FOWA. Затем вы можете сделать это:

f = FOWA.new
f.fun?

Если вы выполните вызов is_fun в конце класса, метод fun? не будет определен.

Он упомянул, что вы не будете использовать его таким образом, но дело в том, насколько легко динамически добавлять метод в класс. Вы можете использовать его следующим образом, если хотите, чтобы метод был доступен в подклассах, и вы бы не вызывали is_fun в FOWA, но вы могли бы использовать его в подклассе. Будет немного интереснее, если у вас есть параметр для is_fun и определение fun? меняется в зависимости от этого параметра.

Это также ведет прямо к modules, поскольку вы можете определить module с помощью того же метода is_fun, а затем просто иметь свой класс extend module и методы в module доступны в класс. Вы бы использовали эту технику, если хотите, чтобы ваш метод был доступен не только подклассам FOWA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...