为这个问题的递归性质道歉,但对 SO 问题的选择答案让我质疑我对反射的理解。
我认为反射主要是关于在程序运行时查询程序的内部事件。此响应中给出的示例修补了 Ruby 的内置 Integer 类。
- 这不是更像函数重载/继承而不是运行时修改吗?
- 重新开课真的是反思的一个例子吗?
为这个问题的递归性质道歉,但对 SO 问题的选择答案让我质疑我对反射的理解。
我认为反射主要是关于在程序运行时查询程序的内部事件。此响应中给出的示例修补了 Ruby 的内置 Integer 类。
反射可用于实现后期绑定。
后期绑定可用于实现猴子补丁。
猴子补丁可用于实现该答案中显示的那种编码风格。
但是还有其他方法可以实现不需要猴子修补或反射的此类功能。哎呀,一个好的宏预编译器可以让你接近。
所以,技术上是正确的,但不是(恕我直言)最好的例子。
冒着增加递归级别的风险,尽管您在该链接上引用了我的答案,但我想做出回应。
这种误解很容易产生,因为我们对反射的直观理解是指向内看。这当然也是编程中反射的一个重要方面——例如,在 Ruby 中,我们有像 instance_of 这样的方法来允许对象在运行时询问关于自己的问题。
但是请看一下反射的维基百科定义:
反射是计算机程序可以观察和修改其自身结构和行为的过程。
如您所见,反射不仅仅是运行时自检。它也是改变运行时行为的能力。重新打开一个类也称为“猴子补丁”。你可以在这里阅读更多关于它的信息。
猴子补丁是一种在 不改变原始源代码的情况下扩展或修改动态语言的运行时代码的方法。
这个过程也被称为: - Guerrilla patching - 扩展先前声明的类 - 重新打开类 - Dynamic Funk - Hijacking - Duck Punching - Method Swizzling