【ruby】ruby 动态方法总结

本文对ruby动态方法特性进行探讨。

结合以下例子:

 

Ruby代码   收藏代码
  1. #dynamic methods  
  2. class Dynamic  
  3.    def a  
  4.      puts "this is method a"  
  5.    end  
  6.    def b(bob)  
  7.      puts "this is method b:#{bob}"  
  8.    end  
  9.    def c  
  10.      puts "this is method c"  
  11.    end  
  12.    def self.define_component(name)  
  13.      define_method(name) do  
  14.         puts "my name is #{name}"  
  15.         end  
  16.    end  
  17.     
  18.    define_component :computer  
  19.    define_component :car  
  20.     
  21.    def method_missing(name,*args)  
  22.      methodname=name.to_s  
  23.      super if !%w[andy sky fly].include? methodname  
  24.      puts "mehtod name is:#{name}.  args:#{args}"  
  25.    end  
  26.     
  27.    end  
  28.   
  29. d=Dynamic.new  
  30. d.a  
  31. d.send(:b,"bob")  
  32. d.send("c")  
  33. d.car()  
  34. d.computer()  
  35. d.fly("in the sky")  
  36. d.bob()  

 运行结果:


 

解释:


1.send方法

Ruby代码   收藏代码
  1. d.send(:b,"bob")  #调用对象d的方法b,参数是“bob”  
  2. d.send("c")  #调用对象d的方法c。  
 
send可以理解为向对象传递一个消息,消息是调用方法。是直接调用方法的另外一种方式。
优势是方法名字可以作为变量的方式传递进来,增加了很大的灵活性,如基于这个可以把方法调用组合定义到配置文件,根据配置文件里的定义调用方法。机制有点类似java的反射。

2.define_method方法
define_method提供了一个强大的功能,定义方法。可以认为是元编程,编写代码的代码。假设有很多类似的方法,方法的结构基本是一样的,只是名字或参数不一样,这时候定义这样多个的方法就可以通过define_method来动态生成。

Ruby代码   收藏代码
  1. d.car() #调用方法car  
  2. d.computer()#调用方法computer  

虽然类Dynamic没显式定义car和computer方法,但是能调用者两个方法是因为通过define_method元编程定义了这个两个方法。如下:
##定义了一个类方法,方法的功能就是根据入参,定义方法  

Ruby代码   收藏代码
  1. def self.define_component(name)  
  2.     define_method(name) do  
  3.        puts "my name is #{name}"  
  4.        end  
  5.   end  
  6.   
  7.   define_component :computer  #定义方法computer  
  8.   define_component :car        #定义方法car  
 
3.幽灵方法和method_missing方法
幽灵方法:一个在类中没有定义的方法,但是可以运行。
method_missing:ruby定义里,如果层层都找不到方法定义,就会调用这个方法。每个类默认都继承了method_missing,且默认的实现是打印NoSushMethodErro消息。这个机制使得幽灵方法得以实现。

以上例子:
d.fly("in the sky")能够调用通过 而d.bob()不能调用通过,正式因为Dynamic类的method_missing是这样定义的:

Ruby代码   收藏代码
  1. def method_missing(name,*args)  
  2.   methodname=name.to_s  
  3.   super if !%w[andy sky fly].include? methodname   ###如果方法名不在 and sky fly里面就调用继承父方法,在这里的才继续执行。  
  4.   puts "mehtod name is:#{name}.  args:#{args}"  
  5. end  
 

总结:

从动态方法的这个几个特性来看,ruby 方法定义确实是非常灵活的,也是动态语言的一大特性和优势。而在java这种静态语言里似乎很难有这种灵活性。

静态使得方法很规范,且不容易犯错(在编译期就会检查出很多错误,不会带到运行期)

动态增加了很大的灵活性,但也可能带来不规范,容易犯错,错误不好定位等问题。

各有优势,适用不同场景。


转自:http://singleant.iteye.com/blog/1680382

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值