当你说Ruby是反思的时候,这主要是指“鸭子打字”吗?

我正在阅读描述Ruby的文本,它说:

Ruby被认为是一种“反思”语言,因为Ruby程序可以分析自身(就其构成而言),调整其工作方式,甚至用其他代码覆盖自己的代码。

我对这个术语“反思”感到困惑 – 这主要是谈论Ruby可以查看变量并弄清楚它是Integer还是String(duck typing)的方式,例如:

x = 3 x = "three" # Ruby reassigns x to a String type 

课程重新开放就是一个很好的例子。 这是一个简单的例子:

 class Integer def moxy if self.zero? self - 2 elsif self.nonzero? self + 2 end end end puts 10.moxy 

通过重新打开标准Ruby类 – Integer – 并在其中定义一个名为’moxy’的新方法,我们可以直接对一个数字执行新定义的操作。 在这种情况下,我已经定义了这个组成’moxy’的方法,如果它是零则从Integer中减去2,如果它是非零,则加2。 这使得moxy方法可用于Ruby中的Integer类的所有对象。 (这里我们使用’self’关键字来获取整数对象的内容)。

如您所见,它是Ruby的一个非常强大的function。

编辑:一些评论者质疑这是否真的反映 。 在英语中,“反思”一词指的是查看自己的想法。 这当然也是编程反思的一个重要方面 – 使用像is_a,kind_of,instance_of这样的Ruby方法来执行运行时自检。 但reflection也指程序在运行时修改自身行为的能力。 重新开放课程就是其中一个重要的例子。 它也被称为猴子补丁 。 它并非没有风险,但我所做的只是在反思的背景下描述它,这是一个例子。

要说Ruby是“反思的”意味着你可以在运行时找出一个类有哪些方法:

 >> Array.methods => ["inspect", "private_class_method", "const_missing", [ ... and many more ... ] 

(你可以用类的对象做同样的事情。)

或者你可以找出给定对象是什么类…

 >> arr = Array.new => [] >> arr.class => Array 

并找出它在类层次结构中的含义……

 >> arr.kind_of? >> arr.kind_of? Array => true >> arr.kind_of? String => false 

在引用中,他们说“Ruby程序可以自我分析”,这就是他们所说的。

其他语言(如Java)也可以这样做,但使用Ruby它更容易,更方便,更多的是使用该语言的日常部分。 因此,Ruby是“反思性的”。

不,这意味着您可以发出ruby命令来获取有关任何内容的信息。 例如,您可以键入命令File.methods()以获取属于File模块的所有方法的列表。 你可以用类和对象做类似的事情 – 列出方法,变量等。

它主要指的是在Ruby程序中运行时检查和修改内部表示是多么容易,例如类,常量,方法等。

大多数现代语言都提供某种reflectionfunction(甚至是静态类型的Java,如Java),但在Ruby中,使用这些function非常容易和自然,它确实在您需要时真正发挥作用。

它只是使元编程,例如,一项几乎无足轻重的任务,在其他语言中根本不是真的,甚至是动态的。