blu*_*blu 2 ruby macros ruby-on-rails
我正在阅读Rails文档,遇到过这个词macros
。我找不到该术语的定义(在Rails的上下文中)。有人可以指出定义该词的地方吗?
我在不同的上下文中熟悉该术语,它是一种用于“记录”动作(例如,鼠标,OS中的键盘动作)的软件。该术语的不同用法之间有联系吗?
在这种情况下,宏是生成其他代码的一段代码。例如:
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
“记录”了它应该扩展的内容。
宏是创建新实例方法的类方法。如果在超类中创建宏,则其所有子类都可以调用该方法,传递参数,并快速拥有一个或多个自定义实例方法。
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中编写“宏”