`
singleant
  • 浏览: 378552 次
  • 性别: 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-rubybuild编译和安装Ruby

    Ruby是一种动态、开源的编程语言,以其简洁、优雅的语法和强大的元编程能力著称。在Ruby开发中,为了管理不同版本的Ruby环境,我们常常会使用到`rbenv`和`ruby-build`这两个工具。本文将详细介绍如何使用`ruby-build...

    ruby初学的总结

    此时我对初学者一些总结

    Ruby语言教程知识点详解 ruby重点知识点总结掌握.docx

    安装Ruby:介绍了在不同操作系统(如Windows、macOS、Linux)上安装Ruby的方法,以及使用Ruby版本管理器(如rvm、rbenv)管理多个Ruby版本的技巧。 Ruby环境配置:包括设置环境变量、安装文本编辑器或IDE(如...

    ruby初始使用过程总结

    在Ruby的世界里,初学者可能会感到有些陌生,但掌握其基本使用流程将为你的编程旅程打下坚实的基础。本文将详细解析"ruby初始使用过程",帮助你快速上手。 首先,我们需要设置好开发环境。在Windows系统中,通常会...

    ruby安装包下载 | ruby环境搭建

    Ruby是一种强大的动态编程语言,广泛应用于Web开发,脚本编写,服务器管理等领域。为了在没有外网连接的环境中搭建Ruby环境,你需要提前下载并准备相关的安装包。在提供的压缩包中,包含了三个关键文件:`ruby-2.7.2...

    06Ruby 方法.docx

    Ruby 是一种动态、面向对象的脚本语言,以其简洁、清晰的语法著称。它支持多种编程范式,包括面向对象、命令式和函数式编程,并且拥有强大的元编程能力。Ruby 的设计哲学强调代码的可读性和程序员的生产力,因此被...

    Ruby自学笔记

    Ruby是一种纯面向对象的编程语言,拥有面向对象编程的三大特性:封装、继承和多态。类名在Ruby中必须以大写字母开始,象征着...Ruby语言的这些特性与规则构成了其独特的编程范式,使得它在动态语言领域中占有一席之地。

    Ruby 编程语言的书籍

    2. **元编程**:深入分析Ruby强大的元编程能力,包括动态方法定义、反射、符号处理等内容。这部分是理解Ruby强大之处的关键。 3. **动态编程技巧**:通过具体示例展示如何利用Ruby的动态特性编写自修改程序,提升...

    Ruby语言教程对Ruby语法的总结展示Ruby语法的基本概念和用法.docx

    - **动态类型:** Ruby是一种动态类型的语言,这意味着你无需为变量声明具体的数据类型。 - **变量命名规则:** 变量名必须以小写字母或下划线 `_` 开头,后续可以跟字母、数字或下划线。 **常见数据类型:** 1. *...

    Ruby 教程 The Book of Ruby

    ### Ruby 教程《The Book of Ruby》知识点总结 #### 一、书籍基本信息 - **书名**:《The Book of Ruby》 - **作者**:Huw Collingbourne - **出版年份**:2011年 - **出版社**:No Starch Press - **ISBN-10**:1-...

    Ruby/tk学习资料

    在本文档中,我们将详细探讨Ruby/tk的基础知识、核心概念及其应用方法。Ruby/tk是一种基于Ruby语言的图形用户界面(GUI)库,它基于Tcl/Tk工具包并进行了封装以适应Ruby的语法和习惯。 #### 1. 引入Ruby/tk 在使用...

    Ruby编程.pdf

    根据提供的信息,我们可以总结出以下关于Ruby编程的关键知识点: ### Ruby基本知识 #### 方法定义与调用 在Ruby中,方法定义使用`def`关键字,紧接着是方法名称和圆括号内的参数列表。Ruby并不使用大括号来界定...

    ruby-debug-1.87.rar

    总结来说,`ruby-debug-1.87`是Ruby开发者必备的调试工具之一,通过其依赖的`ruby-debug-base`、`linecache19`和`ruby_core_source`组件,实现了高效的代码调试。掌握它的使用方法,能显著提升开发效率,让代码问题...

    rubyonrails+Ruby+取得指定月日期数方法

    总结来说,在 Ruby on Rails 中,通过使用 Ruby 的 `Date` 类,我们可以方便地获取并处理日期数据。了解 `Date` 类中提供的方法,可以帮助开发者有效地进行日期相关的操作,例如计算月份的天数、获取月份的开始和...

    ruby中文文档中心资料

    总结起来,"ruby中文文档中心资料"是一份全面的学习资源,覆盖了Ruby语言基础、核心概念、元编程、标准库使用以及可能的Web开发实践。对于想要学习或提升Ruby技能的中文用户来说,这是一份宝贵的资料。通过深入学习...

    Ruby 面向对象知识总结

    ### Ruby面向对象知识总结 #### 一、Ruby的面向对象特性 **Ruby**是一种完全面向对象的编程语言,这意味着在Ruby中,一切事物都是对象。无论是字符串、数字、布尔值甚至是`true`和`false`这样的基本数据类型,都是...

Global site tag (gtag.js) - Google Analytics