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

Posted

技术标签:

【中文标题】为啥学习 Ruby 中的元编程和特征类很重要?【英文标题】:Why is it important to learn about metaprogramming and eigenclasses in Ruby?为什么学习 Ruby 中的元编程和特征类很重要? 【发布时间】:2011-11-01 17:13:37 【问题描述】:

我目前正在尝试使用 Ruby 和 Rails,并且我已经阅读了有关元编程的教程和书籍中的一些部分。许多人提到它是 Ruby 的重要组成部分,但他们并没有真正深入细节。就好像元编程是 Ruby 程序员的最后一道防线。来自 .NET 背景的我很难理解为什么它如此有用。

使用元编程有什么好处? 什么是特征类,它与单例有何不同? 在哪些情况下使用元编程很常见? 使用代码修改其他代码(尤其是不属于您自己的代码)的行为有哪些道德影响?

【问题讨论】:

【参考方案1】:

使用元编程有什么好处?

与没有它相比,您可以创建更具表现力的 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 我真的很喜欢attr_accessor 的例子,因为它展示了强大的元编程能力的重要好处:元编程使语言本身保持简单。 attr_accessor 很容易成为另一种语言的单独语言构造(相关:C# 中的属性等)。在 Ruby 中,它只是另一种方法。 好答案。虽然 eigenclass 和 singleton class 在 Ruby 中的含义是一样的,但后者现在是首选术语,正如 singleton_classsingleton_methodsdefine_singleton_method 方法的存在所表明的那样。【参考方案2】:

元编程有时间和地点。我认为它在 Ruby 书籍中被大量提及,因为人们喜欢炫耀 Ruby 可以做其他语言做不到的事情。

元编程就像不知道“汉堡”或“面条汤”的日语单词,但知道“请这个”(“kore o kudasai”)的日语,并且能够指向菜单上的项目.它提供了更大的灵活性,但您需要更多的上下文才能准确了解正在执行的操作。

如果您正在创建 ActiveRecord,它允许您执行 find_by_foo,那么元编程是有意义的。

如果您正在编写诸如zombie-chaser 之类的变异测试库,或者编写测试不同Ruby 实现的特征测试应用程序(例如Small Eigen Collider),那么元编程就很有意义。

但是,如果您正在编写一个应用程序,那么您通常不应该是元编程,而只是编程。例如,如果您在应用程序中使用 instance_variable_set,这更像是代码异味,而不是您的熟练程度。

您可能想阅读的相关问题包括 https://***.com/questions/1236191/what-will-i-learn-from-metaprogramming-ruby 和 Ruby metaprogramming online tutorial 和 Metaprogramming how much is too much?。

我真的推荐“元编程 Ruby”这本书,因为它不仅教你元编程,还教你 Ruby 的工作原理。

【讨论】:

以上是关于为啥学习 Ruby 中的元编程和特征类很重要?的主要内容,如果未能解决你的问题,请参考以下文章

Python 的元类设计起源自哪里?

Python 的元类设计起源自哪里?

从特征类确定类

Ruby元编程

ruby 将AWS堆栈中的元数据加载到Puppet的Facter中。包括所有导出,输出,参数,资源和标签。

理解Ruby中的作用域