5

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

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

我对“反射”这个术语感到困惑 - 这主要是在谈论 Ruby 可以查看变量并确定它是整数还是字符串(鸭子类型)的方式,例如:

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

4 回答 4

10

说 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 是“反射性的”。

于 2009-02-13T18:11:27.817 回答
3

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

于 2009-02-13T18:03:33.267 回答
1

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

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

puts 10.moxy

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

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

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

于 2009-02-13T18:23:41.343 回答
0

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

Most modern languages offer some kind of reflective capabilities (even statically typed ones such as Java), but in Ruby, it is so easy and natural to use these capabilities, that it really make a real difference when you need them.

It just makes meta-programming, for example, an almost trivial task, which is not true at all in other languages, even dynamic ones.

于 2009-02-13T18:37:19.533 回答