对这个问题的递归性质表示歉意,但 选择的答案 关于SO的问题让我质疑我对反思的理解。

我认为反射主要是查询程序运行时的内部发生的情况。此响应中给出的示例修补了 Ruby 的内置 Integer 类。

  • 这不是更像函数重载/继承而不是运行时修改吗?
  • 重新开课真的是反思的例子吗?
有帮助吗?

解决方案

反射可用于实现后期绑定。

后期绑定可用于实现猴子修补。

猴子修补可用于实现该答案中所示的编码风格。

但是还有其他方法可以实现此类功能,不需要猴子修补或反射。哎呀,一个好的宏预编译器可以让你接近。

所以,技术上是正确的,但不是(恕我直言)最好的例子。

其他提示

冒着增加递归级别的风险,尽管您在该链接中引用了我的答案,但我还是想做出回应。

这种误解很容易产生,因为我们对反思的直觉理解是指向内看。这当然也是编程中反射的一个重要方面 - 例如,在 Ruby 中,我们有像 instance_of 这样的方法,允许对象在运行时询问有关自身的问题。

但看看 维基百科对反射的定义:

反射是计算机程序可以观察到的过程 并修改 它自己的结构和行为。

正如您所看到的,反射不仅仅是运行时自我检查。它还具有更改运行时行为的能力。重新打开一个类也称为“猴子修补”。您可以阅读更多相关内容 这里.

猴子补丁是一种方法 扩展或修改运行时代码 动态语言的无需更改原始源代码。

此过程也称为:- 游击补丁 - 延长先前声明的课程 - 重新开放类 - 动态放克 - 劫持 - 鸭子打 - 方法swizzling

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top