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)
要说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是"反思的".
重新开课就是一个很好的例子。这是一个简单的例子:
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 方法来执行运行时自检。但反射也指程序在运行时修改其自身行为的能力。重新开放课程是这方面的关键例子之一。它也称为猴子修补。这并非没有风险,但我所做的只是在反思的背景下描述它,这只是一个例子。
| 归档时间: |
|
| 查看次数: |
1155 次 |
| 最近记录: |