为什么学习Ruby中的元编程和特征类很重要?

时间:2011-08-23 07:17:30

标签: ruby-on-rails ruby metaprogramming eigenclass

我目前正在尝试使用Ruby和Rails,我在关于元编程的教程和书籍中有几个部分。许多人提到它是Ruby的重要组成部分,但它们并没有真正详细说明。这就好像元编程是Ruby程序员的最后边界。来自.NET背景我很难理解它为什么会如此有用。

  • 使用元编程有什么好处?
  • 什么是特征类,它与单例有什么不同?
  • 在什么情况下使用元编程常见?
  • 使用代码修改其他代码的行为有什么道德含义,特别是不属于您自己的代码?

2 个答案:

答案 0 :(得分:17)

  • 使用元编程有什么好处?

    您可以创建比没有它更具表现力的API(例如,ActiveRecord使用元编程来根据表的列名定义访问器方法,因此您可以编写person.age之类的内容而不是person.read_attribute("age")之类的内容,其中person是一个活动记录对象,而people表有一个名为age的列,你可以用比其他方式少得多的代码完成一些事情。

  • 什么是特征类,它与单例有什么不同?

    术语“eigenclass”和“singleton class”在ruby的上下文中可互换使用。

  • 在什么情况下使用元编程常见?

    在你有其他方法有大量锅炉板代码或创建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编写这么短的代码,它会根据您提供的参数自动定义带有名称的getter和setter方法:

    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
    

  • 使用代码修改其他代码的行为有什么道德含义,特别是不属于您自己的代码?

    无。

答案 1 :(得分:5)

元编程有时间和地点。我认为它在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-rubyRuby metaprogramming online tutorial以及Metaprogramming how much is too much?

我真的推荐“Metaprogramming Ruby”这本书,因为它不仅教你元编程,而且教你如何工作。