简单的:
class Object
def gsub(*args, &block)
$_.gsub(*args, &block)
end
end
由于每个对象都是Object
(嗯,几乎每个对象)的一个实例,所以每个对象gsub
现在都有一个方法。所以,你可以打电话
some_object.gsub('foo', 'bar')
在任何物体上,它都会起作用。而且由于调用它的对象并不重要,因为它实际上并没有对该对象执行任何操作,因此您不妨调用它self
:
self.gsub('foo', 'bar')
当然,既然self
是隐式接收者,这就和
gsub('foo', 'bar')
对于诸如此类的方法,它们实际上并不依赖于接收者,并且只是Object
为了方便而添加到类中,这是一种常见的约定,private
以便您不会意外地使用显式接收者调用它们然后以某种方式得到误以为这种方法对接收者有什么作用。
此外,通常将此类方法(实际上旨在用作过程而不是方法,即完全独立于它们的接收者)放入Kernel
混入中,混入Object
而不是直接放入Object
类中,以将它们与那些对每个对象都可用,但实际上确实取决于其内部状态,例如Object#class
等Object#to_s
。
module Kernel
private
def gsub(*args, &block)
$_.gsub(*args, &block)
end
end
以这种方式定义的其他方法,您可能已经遇到过require
,load
, puts
, print
, p
, gets
, loop
, raise
, rand
, throw
, catch
, lambda
, proc
, eval
, Array
, Integer
,Float
等。