方法定义于对象,用来进行与该对象的相关操作。Ruby中所有的操作都以方法的形式来实现
一般情况下,我们通过(对象.方法名)的方式来调用方法。其中对象被称为是接收者。
根据接收者的不同,我们将方法区分为3种:
- 实例方法
当对象(实例)存在的时候,把该对象作为接收者的方法叫做实例方法。
- 类方法
当接收者不是实例而是类的时候,这个方法称为类方法。调用的时候不光可以用’.’还可以使用’::’。
定义类方法:
class Test
class << self
def a
puts "static method"
end
end
end
或是
class Test
def self.a
puts "static method"
end
end
第一种方法对于同时定义多个类方法很方便,因为不需要写多个self,第二种比较简单。
- 函数性方法
没有接收者的方法称为函数性方法。比如:sin(3.14)、print “Hello”。
方法在定义的时候可以预设值,当参数不止一个时,预设值需要从右端的参数开始设置。
一些高级方法
动态方法(Dynamic Methods)
1)动态调用方法
我们一般通过’.’和具体的方法名来调用一个方法,但是我们也可以通过另一种方式来调用一个方法:
class TuesDay_study
def my_method my_arg
my_arg*2
end
end
study = TuesDay_study.new
p study.my_method(3)
p study.send(:my_method, 3)
p study.send('my_method', 3)
通过send方法我们可以使用一个方法名作为参数,这样我们可以在代码运行的期间,知道最后一刻才决定调用哪个方法。这种技术称为 动态派发(Dynamic Dispatch)。
send方法可以调用任何方法,甚至包含私有方法。
2)动态定义方法
可以利用Module#define_method()方法定义一个方法,只需要为其提供一个方法名和一个充当方法主体的块即可。如:
class MyClass
define_method :my_method do |my_arg|
my_arg*3
end
end
obj = MyClass.new
p obj.my_method(4)
这种在运行时定义方法的技术称为动态方法(Dynamic Method)。
method_missing()方法
在Kernel中有一个实例方法,method_missing(),当调用找不到的方法使就会关联到这个方法上。
我们在覆写 method_missing()方法的时候,一个幽灵方法通过respond_to?()返回为false,但是我们希望返回的是true,这样就需要同时覆写respond_to?()方法,以保证幽灵方法也可以返回true。
1)幽灵方法
当需要定义很多相似的方法时,可以通过 method_missing()方法来避免手工定义这些方法的工作。被 method_missing()处理的方法,从调用者的角度看和其他方法没有任何不同,但实际上接收者并没有对应的方法,这就被称为幽灵方法。
2)动态代理
一个捕获幽灵方法调用并把它们转发给另外一个对象的对象,称为动态代理(Dynamic Proxy)。