Rails中的宏是什么?

时间:2017-06-02 05:26:42

标签: ruby-on-rails ruby macros

我正在阅读Rails docs,我遇到了macros这个词。 我找不到该术语的定义(在Rails的上下文中)。 有人能指出我定义这个词的地方吗?

我熟悉不同语境中的术语,作为“录制”动作的软件(例如,鼠标,操作系统中的键盘动作)。 这个术语的不同用法之间是否有任何联系?

3 个答案:

答案 0 :(得分:4)

宏是创建新实例方法的类方法。如果在超类中创建一个宏,它的所有子类都可以调用该方法,传入参数,并快速拥有一个或多个自定义实例方法。

Rails使用这种技术以非常少的代码提供许多功能。例如,诸如has_many和belongs_to之类的关联方法使用宏来生成返回关联对象的实例方法。

在Ruby中,宏依赖于使用define_method方法,该方法在调用时将在当前范围内定义方法。它接受一个参数,它成为新方法的名称,以及一个块,它是新方法内部的代码。传递给块的任何参数都是新方法可以采用的参数。

例如,以下是如何创建一个宏来创建允许您在类的属性哈希中访问或设置值的方法:

def make_columns(columms)
  columns.each do |col|
    define_method("#{col}") do
      attributes[col]
    end
  end


columns.each do |col|
    define_method("#{col}=") do |value|
      attributes(col) = value
    end
  end
end

有关详细说明,请浏览此链接How To Write "Macros" in Ruby

答案 1 :(得分:2)

在此上下文中,宏是一段生成其他代码的代码。例如:

attr_accessor :foo

生成这个:

def foo
  @foo
end

def foo=(val)
  @foo = val
end
  

该术语的不同用途之间是否有任何联系?

有点儿。你可以说attr_accessor的作者“记录了它应该扩展到的内容。

答案 2 :(得分:0)

在 Ruby 中,宏就像一个方法,只是一些代码,而不是返回 Ruby 数据类型,而是返回更多的 Ruby 代码!此代码将与您在运行程序时编写的所有其他代码一起执行。