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

4 ruby reflection duck-typing ruby-on-rails

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

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

我对这个术语"反思"感到困惑 - 这主要是谈论Ruby可以查看变量的方式,并弄清楚它是一个整数还是一个字符串(鸭子打字),例如:

x = 3
x = "three" # Ruby reassigns x to a String type
Run Code Online (Sandbox Code Playgroud)

Eth*_*han 9

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

>> Array.methods
=> ["inspect", "private_class_method", "const_missing",
[ ... and many more ... ]
Run Code Online (Sandbox Code Playgroud)

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

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

>> arr = Array.new
=> []
>> arr.class
=> Array
Run Code Online (Sandbox Code Playgroud)

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

>> arr.kind_of?
>> arr.kind_of? Array
=> true
>> arr.kind_of? String
=> false
Run Code Online (Sandbox Code Playgroud)

在引用中,他们说"Ruby程序可以分析自己"这就是他们所说的.

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


Ser*_*erx 1

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

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

puts 10.moxy
Run Code Online (Sandbox Code Playgroud)

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

正如您所看到的,这是 Ruby 的一个非常强大的功能。

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