Rails中的宏是什么?

blu*_*blu 2 ruby macros ruby-on-rails

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

我在不同的上下文中熟悉该术语,它是一种用于“记录”动作(例如,鼠标,OS中的键盘动作)的软件。该术语的不同用法之间有联系吗?

Ser*_*sev 5

在这种情况下,宏是生成其他代码的一段代码。例如:

attr_accessor :foo
Run Code Online (Sandbox Code Playgroud)

生成这个:

def foo
  @foo
end

def foo=(val)
  @foo = val
end
Run Code Online (Sandbox Code Playgroud)

该术语的不同用法之间有任何联系吗?

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


May*_*hah 5

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

Rails使用此技术以很少的代码提供了许多功能。例如,has_many和belong__之类的关联方法使用宏来生成实例方法,这些实例方法返回关联的对象。

在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
Run Code Online (Sandbox Code Playgroud)

有关更多说明,请访问此链接如何在Ruby中编写“宏”