【问题标题】:Differences in Macros and Reflection in Meta-Programming元编程中宏和反射的差异
【发布时间】:2017-06-15 09:16:49
【问题描述】:

我目前正在学习元编程。我猜 Ruby on Rails 大量使用元编程。这是我到目前为止所理解的。

  • 宏:发生在编译时,使用代码生成代码(即 Rails 使用 attr_reader 自动设置 getter)
  • 反射:发生在运行时(我读到反射使用它自己的语言作为元语言,但不确定这是什么意思)
  • 元编程使用程序作为数据类型来生成代码;宏和反射在某种意义上是元编程技术。

我总共有 3 个问题。

  1. 我很难理解反射是什么。有人可以通过可能适用的例子给我一个很好的定义吗?
  2. 宏和反射有什么区别
  3. 我是否可以将宏和反射视为元编程的子集,因为宏和元编程的定义与我几乎相同。

如果您能在使用 Ruby/Rails 时解释这一点,那将对我有很大帮助。谢谢!

【问题讨论】:

  • 第一点不是问题,第二点已经自己回答过了,第三点只能自己回答,一旦你有实际的编程任务(而不是“我想做元编程态度”)…
  • 如前所述,这取决于您要解决的实际任务。对于其中一些人来说,可能很清楚哪种方法更适合,而对于另一些人来说,这可能是主观的,或者取决于个人关注点驱动的权衡。
  • 除了你的问题不清楚,也太宽泛之外,还有一个比较实际的问题是Ruby没有宏,那么你希望我们如何使用Ruby来解释宏?
  • 是的,我假设这个问题非常广泛,但这是唯一的描述方式,因为我刚刚学习了它的概念,不知道如何围绕这个主题提出详细的问题!我将自学更多,以提出更具体的问题。

标签: ruby-on-rails ruby reflection macros


【解决方案1】:

元编程是使用程序来操作程序。这确实是一个非常宽泛的定义,将其推向极致甚至可能包括自动调试和二进制补丁开发。

宏和反射最明显的区别在于,前者使用与对象语言(被操作的语言)不同的元语言,而后者使用对象语言本身作为元语言。此外,宏更多地与生成相关联,例如条件编译和模板扩展;通过检查和操作进行反射,例如成员迭代和绕过隐私限制。但越往下潜越边界越模糊。

就 Ruby on Rails 而言,最流行的元编程模式可能是 ActiveRecord。它使用反射来列出需要映射到数据库表和列的类和类成员。同样,任何 ORM 项目都涉及到相当多的元编程。

Rails 以许多其他方式使用元编程,但我对它还不够熟悉,无法知道。我在研究中偶然发现了这篇博文,它可能会有所帮助:Metaprogramming Ruby and Rails Antipatterns (Part 1 of 2)。您可以使用仅在运行时知道的名称定义方法,并使用元编程按需定义属性。

因为元编程是一个如此重要的概念,我一般将其概括为“自定义编译器/运行时”。最后,如果你试图做一些需要来自编译器或运行时的信息,也就是来自运行代码本身的信息,那可能是元编程。

【讨论】:

  • 反射使用“元语言”;它使用与其他语言相同的语言语法和语义。
  • @Nathan 感谢您澄清在反射中元语言使用与对象语言相同的语法和语义。我忽略了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多