Ruby方法

方法定义于对象,用来进行与该对象的相关操作。Ruby中所有的操作都以方法的形式来实现

一般情况下,我们通过(对象.方法名)的方式来调用方法。其中对象被称为是接收者。

根据接收者的不同,我们将方法区分为3种:

  1. 实例方法

当对象(实例)存在的时候,把该对象作为接收者的方法叫做实例方法。

  1. 类方法

当接收者不是实例而是类的时候,这个方法称为类方法。调用的时候不光可以用’.’还可以使用’::’。

定义类方法:

	class Test  
		   class << self  
		     def a  
		       puts "static method"  
		     end  
		   end  
		end

或是

		class Test  
		     def self.a  
		       puts "static method"  
		     end  
		end

第一种方法对于同时定义多个类方法很方便,因为不需要写多个self,第二种比较简单。

  1. 函数性方法

没有接收者的方法称为函数性方法。比如: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)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值