`
singleant
  • 浏览: 375317 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【ruby】ruby 动态方法总结

    博客分类:
  • ruby
阅读更多

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

结合以下例子:

 

#dynamic methods
class Dynamic
   def a
     puts "this is method a"
   end
   def b(bob)
     puts "this is method b:#{bob}"
   end
   def c
     puts "this is method c"
   end
   def self.define_component(name)
     define_method(name) do
        puts "my name is #{name}"
        end
   end
  
   define_component :computer
   define_component :car
  
   def method_missing(name,*args)
     methodname=name.to_s
     super if !%w[andy sky fly].include? methodname
     puts "mehtod name is:#{name}.  args:#{args}"
   end
  
   end

d=Dynamic.new
d.a
d.send(:b,"bob")
d.send("c")
d.car()
d.computer()
d.fly("in the sky")
d.bob()

 运行结果:


 

解释:


1.send方法

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

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

    d.car() #调用方法car
    d.computer()#调用方法computer

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

 def self.define_component(name)
     define_method(name) do
        puts "my name is #{name}"
        end
   end

   define_component :computer  #定义方法computer
   define_component :car        #定义方法car
 
3.幽灵方法和method_missing方法
幽灵方法:一个在类中没有定义的方法,但是可以运行。
method_missing:ruby定义里,如果层层都找不到方法定义,就会调用这个方法。每个类默认都继承了method_missing,且默认的实现是打印NoSushMethodErro消息。这个机制使得幽灵方法得以实现。

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

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

总结:

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

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

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

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

  • 大小: 28.2 KB
1
0
分享到:
评论

相关推荐

    ruby初学的总结

    此时我对初学者一些总结

    ruby初始使用过程总结

    本文章主要介绍了ruby的使用流程,便于新手入门使用相关的软件。

    ruby on rails 3.1.0数据库查询方法汇总

    本人学习总结的ruby on rails 3.1.0数据库类查询方法,比较全了

    ruby教程.rar

    1.6.8到1.8.0的变更点(总结) ruby 1.9 特性 obsolete 对应DOSISH 附录 疑似BNF的Ruby语法 Ruby术语集 Ruby的运行平台 pack模板字符串 sprintf格式 Marshal格式 Ruby FAQ Ruby的陷阱 Ruby/Tk FAQ Ruby...

    Ruby自学笔记

    Ruby自学笔记,这是我在学习Ruby时的小结笔记,若对你有所帮助请给满星,谢谢!!!

    Ruby创建数组方法总结

    如果要从键盘或文件中读取内容列表,这是创建变量的一种常见方法。 在下面的示例程序中,使用array命令和赋值运算符创建一个空数组。从键盘上读取三个字符串(字符的有序序列)并“pushed”或添加到数组的末尾。 #!/...

    本书是由华中科技大学出版社于2017年3月出版的程序设计类图书,书中总结了三十余条Ruby程序开发经验,有助于读者理解学习。

    《优雅的Ruby》总结了32条Ruby编程技巧,帮助读者写出清晰、优雅、稳定的Ruby代码。作者Avdi Grimm主张Ruby方法应该像故事一样易于阅读。他将Ruby方法分成输入处理(Collecting Input)、功能实现(Performing Work...

    ruby 知识总结

    ruby 知识总结 对加强ruby编程有很大帮助

    ruby语法基础教程

    §12.3 动态方法调用 86 §12.3.1 使用send方法 86 §12.3.2 使用Method类和UnboundMethod类 86 §12.3.3 使用eval方法 88 §12.3.4 性能 88 §12.4 Hook和回调方法 89 §12.4.1 什么是Hook 89 §12.4.2 Ruby中的...

    Ruby中的方法(函数)学习总结

    1、Ruby中方法名和变量名的命名规则一样(以小写字母开头,单词之间的分隔使用“_”,),不过可以在方法名后边带上!(重磅方法)或者?(布尔类型返回值)。 2、方法的参数请使用(),参数都是局部变量,可以为...

    Ruby中处理时间和日期

    文章总结了绝大部分Ruby中处理时间和日期的方法,很实用。

    Ruby生成随机数的方法总结

    数字实际上不是随机的 没有一台计算机能纯粹通过计算产生真正的随机数。它们能做的最好的事情就是生成伪随机数,伪随机...请记住,没有一种方法是神奇的——这些看似随机的数字是用相对简单的算法和相对简单的算术生成

    Windows下ruby语言安装教程

    第一步:下载安装文件 ...第二步: 双击安装 在安装的时候,请勾选... 您可能感兴趣的文章:Windows下Ruby on Rails开发环境安装配置图文教程windows和linux下Ruby的下载与安装windows下安装ruby与rails时遇到的问题总结

    学习ruby一些重点总结,以及部门代码实例,个人认为还是比较细致的

    个人作为软件测试自动化编写脚本需要学习的ruby,这是在学习过程中,所做的一些总结和归纳,有时候忘记了,看看,也很容易记起来。

    ruby 自动化测试

    自动化测试的一些简单总结及介绍,纯属于个人的一点心血之作,总结了单元测试

    Ruby中的block、proc、lambda区别总结

    在规则引擎中,Ruby 的闭包使用特别...Ruby 的哲学之一:同一个问题现实中有多种解决方法,所以 Ruby 中也有多种解法,所以闭包的使用也有多种方法。 先看一个代码的例子: Example 1: 代码如下: def foo1  yield end

    GitHub倡导的Ruby代码编写风格总结

    GitHub网站服务器端主要就是使用的Ruby作为编程语言,因而GitHub所提倡采用的Ruby书写规范也就显得更有些说服力XD 下面我们就整理除了这份GitHub倡导的Ruby代码编写风格总结,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics