English 中文(简体)
当你说Ruby是反射性的时候,这主要是指“鸭子类型”吗?
原标题:
  • 时间:2009-02-13 17:53:45
  •  标签:

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

Ruby is considered a “reflective” language because it’s possible for a Ruby program to analyze itself (in terms of its make-up), make adjustments to the way it works, and even overwrite its own code with other code.

我对“反射”这个术语感到困惑 - 这主要是指Ruby如何查看一个变量并确定它是整数还是字符串(鸭子类型),例如:

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 方法,如果整数为零,则从整数中减去 2,如果整数为非零,则加上 2。这使得 moxy 方法在 Ruby 的 Integer 类的所有对象中都可用。(在这里,我们使用 self 关键字来获取整数对象的内容)。

正如你所看到的,这是 Ruby 的一个非常强大的特性。

一些评论者质疑这是否真的是反射。在英语中,反映一词指的是审视自己的思想。在编程中,这肯定也是反射的重要方面——使用Ruby方法(如is_a、kind_of、instance_of)进行运行时自我检查。但是反射还指程序在运行时修改自身行为的能力。重新打开类就是其中一个关键例子。它也被称为猴子补丁。它并非没有风险,但我在这里只是描述它作为反射的一个例子。

问题回答

说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 程序中运行时如何轻松地检查和修改内部表示,例如类、常量、方法等。

大多数现代语言都提供某种反射能力(甚至包括 Java 这样的静态类型语言),但在 Ruby 中,使用这些能力非常容易和自然,当你需要它们时,真的会产生实际的差异。

它使元编程变得几乎是一项微不足道的任务,这在其他语言中并不是事实,即使是动态语言也是如此。





相关问题
热门标签