Почему важно узнать о метапрограммировании и собственных классах в Ruby? - PullRequest
8 голосов
/ 23 августа 2011

В настоящее время я экспериментирую с Ruby и Rails, и я попал в несколько разделов учебников и книг о метапрограммировании.Многие упоминают, что это важный компонент Ruby, но они не вдавались в подробности.Как будто метапрограммирование - последний рубеж для программистов на Ruby.Исходя из .NET, я изо всех сил пытаюсь понять, почему это предположительно так полезно.

  • Какие преимущества можно получить при использовании метапрограммирования?
  • Что такое собственный класс и чем он отличается от одиночного?
  • В каких ситуациях обычно используется метапрограммирование?
  • Какие этические последствия существуют вокруг использования кода для изменения поведения другого кода, особенно кода, который не является вашим собственным?

Ответы [ 2 ]

17 голосов
/ 23 августа 2011
  • Какие преимущества вы получаете при использовании метапрограммирования?

    Вы можете создавать более выразительные API, чем без него (например, ActiveRecord использует метапрограммирование для определения методов доступа на основе имен столбцов таблицы, поэтому вы можете писать что-то вроде person.age вместо чего-то вроде person.read_attribute("age"), где person является активным объектом записи, и таблица people имеет столбец с именем age), и вы можете выполнить некоторые задачи с помощью значительно меньшего количества кода, чем вы могли бы сделать в противном случае.

  • Что такое собственный класс и чем он отличается от одноэлементного?

    Термины "собственный класс" и "класс синглтона" используются взаимозаменяемо в контексте рубина.

  • В каких ситуациях обычно используется метапрограммирование?

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

    Пример варианта использования 1:

    Вместо того, чтобы писать что-то наподобие кода, подобного следующему:

    class Foo
      def bar
        @bar
      end
    
      def bar=(b)
        @bar = b
      end
    
      def baz
        @baz
      end
    
      def baz=(b)
        @baz = b
      end
    end
    

    Вы можете написать этот гораздо более короткий код, используя метод метапрограммирования attr_accessor, который автоматически определяет методы получения и установки с именами на основе аргументов, которые вы ему даете:

    class Foo
      attr_accessor :foo, :bar
    end
    

    Если attr_accessor еще не существует в стандартной библиотеке, вы можете определить ее самостоятельно следующим образом (чтобы дать вам представление о том, как выглядит метапрограммирование в ruby):

    class Module
      def attr_accessor(*variable_names)
        variable_names.each do |variable_name|
          define_method( variable_name ) do
            instance_variable_get( "@#{ variable_name }" )
          end
    
          define_method( "#{ variable_name }=" ) do |value|
            instance_variable_set( "@#{ variable_name }", value)
          end
        end
      end
    

    конец

  • Какие этические последствия существуют вокруг использования кода для изменения поведения другого кода, особенно кода, который не принадлежит вам?

    Отсутствует.

5 голосов
/ 24 августа 2011

Есть время и место для метапрограммирования. Я думаю, что это широко упоминается в книгах по Ruby, потому что людям нравится хвастаться тем, что может сделать Ruby, чего не могут делать другие языки.

Метапрограммирование похоже на то, что вы не знаете японское слово «гамбургер» или «суп с лапшой», но знаете японское слово «этот, пожалуйста» («kore o kudasai») и уметь указывать на пункт меню , Это обеспечивает большую гибкость, но вам нужно больше контекста, чтобы точно знать, что делается.

Если вы создаете ActiveRecord, который позволяет вам делать find_by_foo, тогда имеет смысл метапрограммирование.

Если вы пишете библиотеку тестирования мутаций, такую ​​как zombie-chaser , или приложение тестирования характеристик, которое тестирует различные реализации Ruby, такие как Small Eigen Collider , тогда метапрограммирование имеет смысл.

Однако, если вы пишете приложение, то, как правило, вы должны заниматься не метапрограммированием, а простым программированием. Например, если вы используете instance_variable_set в своем приложении, это скорее запах кода, чем показатель того, насколько вы опытны.

Смежные вопросы, которые вы, возможно, захотите прочитать, включают https://stackoverflow.com/questions/1236191/what-will-i-learn-from-metaprogramming-ruby и Онлайн-учебник по метапрограммированию Ruby и Метапрограммирование, сколько это слишком много? .

Я действительно рекомендую книгу "Метапрограммирование Ruby", потому что она не просто учит вас метапрограммированию, но и тому, как работает Ruby.

...