`
jy503160
  • 浏览: 20150 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

(转载收藏)ruby元编程 那些书里没有的知识 define_method

    博客分类:
  • ruby
阅读更多

转自:http://www.cnblogs.com/IAmBetter/archive/2013/03/16/2963696.html

你有多少种方式创建一个方法?大多数人想到的可能是def 关键字 

  1. #普通方法   
  2. def tele_you   
  3.     puts "I am Anleb"  
  4. end  
#普通方法
def tele_you
    puts "I am Anleb"
end



 

  1. #定义单件方法   
  2. n="Anleb"  
  3. def n.tell_you   
  4.     puts "I am #{self}"  
  5. end  
  6. n.tell_you  
#定义单件方法
n="Anleb"
def n.tell_you
    puts "I am #{self}"
end
n.tell_you




 

  1. #define_method   
  2. class Project   
  3.     define_method :tell_you do |name|   
  4.         puts name   
  5.     end  
  6. end  
  7.   
  8. a=Project.new  
  9. a.tell_you("Anleb")  
#define_method
class Project
    define_method :tell_you do |name|
        puts name
    end
end

a=Project.new
a.tell_you("Anleb")




具体分析下:define_method方法 

  1. Kernel.private_methods.include?("define_method")  #true  
Kernel.private_methods.include?("define_method")  #true


可以看到define_method是一个私有方法,那么私有方法调用是有规定的: 
1.不能有显式调用,也就是不能有接受者,不能self.define_method这样调用 
2.私有方法是可以被继承的 
3.私有方法可以被send强制调用,如:send(:private_method) 
4.只能在自身中调用私有方法(体会下这句话的意思) 

上面Project类中,当前self是类Project,然后隐式调用define_method方法建立方法 


define_methods动态创建方法,什么是动态创建呢,就是代码运行时就创建定义了方法,利用动态创建和动态派发可以实现ruby的代码重构,这是魔法! 
例子元编程书上有,中文版 46页,英文版69页 

看一个例子: 

  1. class Project1   
  2.     define_method :tell_you do |name|   
  3.         puts name   
  4.     end  
  5. end  
  6.   
  7. class Project2 < Project1   
  8.        
  9. end  
  10.   
  11. a=Project2.new  
  12. a.tell_you("Anleb")   
  13. Project1.instance_methods(false#["tell_you"]  
class Project1
    define_method :tell_you do |name|
        puts name
    end
end

class Project2 < Project1
    
end

a=Project2.new
a.tell_you("Anleb")
Project1.instance_methods(false) #["tell_you"]



1.说明define_method定义的方法和def定义没区别,都可以被继承 
2.define_method的方法是存在于类中的实例方法 


修改代码: 

  1. class Project1   
  2.     define_method :tell_you do |name|   
  3.         puts name   
  4.     end  
  5.   
  6.     def creat_method   
  7.         define_method :new_method do    
  8.             puts "this is a new method"  
  9.         end  
  10.     end  
  11. end  
  12. Project1.new.creat_method   
  13.   
  14.   
  15. Error:test.rb:7:in `creat_method': undefined method `define_method' for #<Project1:0x2bc7008> (NoMethodError)  
class Project1
    define_method :tell_you do |name|
        puts name
    end

    def creat_method
        define_method :new_method do 
            puts "this is a new method"
        end
    end
end
Project1.new.creat_method


Error:test.rb:7:in `creat_method': undefined method `define_method' for #<Project1:0x2bc7008> (NoMethodError)



一拍脑袋,额,忘记说了,define_method是Object Class方法,也就是只有类才可以调用, 
creat_method的当前self肯定是一个对象啊,对象不是类,所以不能调用,修改代码 

  1. def creat_method   
  2.        self.class.define_method :new_method do    
  3.            puts "this is a new method"  
  4.        end  
  5.    end  
 def creat_method
        self.class.define_method :new_method do 
            puts "this is a new method"
        end
    end



调用方法: 

  1. Project1.new.creat_method   
  2. Error:test.rb:7:in `creat_method': private method `define_method' called for Project1:Class (NoMethodError)  
Project1.new.creat_method
Error:test.rb:7:in `creat_method': private method `define_method' called for Project1:Class (NoMethodError)



崩溃了,怎么还不行,看看提示,说这是一个私有方法,额。。。忘记了,private方法不能显式有接受者,我们想到一个办法,对,那就是send方法 

修改代码: 

  1. class Project1   
  2.     define_method :tell_you do |name|   
  3.         puts name   
  4.     end  
  5.   
  6.     def creat_method   
  7.         self.class.send(:define_method,:new_methoddo    
  8.             puts "this is a new method"  
  9.         end  
  10.     end  
  11. end  
  12.   
  13. a=Project1.new  
  14. p Project1.instance_methods(false#["creat_method", "tell_you"]   
  15. a.creat_method   
  16. p Project1.instance_methods(false#["creat_method", "tell_you"]  
class Project1
    define_method :tell_you do |name|
        puts name
    end

    def creat_method
        self.class.send(:define_method,:new_method) do 
            puts "this is a new method"
        end
    end
end

a=Project1.new
p Project1.instance_methods(false) #["creat_method", "tell_you"]
a.creat_method
p Project1.instance_methods(false) #["creat_method", "tell_you"]



终于成功了,这种技术叫做 动态派发技术,常用在Method_messing方法。 

解法2: 

  1. class Project1   
  2.     define_method :tell_you do |name|   
  3.         puts name   
  4.     end   
  5.   
  6.     def self.creat_method   
  7.         define_method :new_method do  #当前self是类,所以可以调用,并且隐式   
  8.             puts "this is a new method"  
  9.         end   
  10.     end   
  11.     creat_method   
  12. end   
  13.   
  14. Project1.new.new_method  
class Project1
    define_method :tell_you do |name|
        puts name
    end

    def self.creat_method
        define_method :new_method do  #当前self是类,所以可以调用,并且隐式
            puts "this is a new method"
        end
    end
    creat_method
end

Project1.new.new_method




解法3: 

  1. class Project1   
  2.     class << self  
  3.         def creat_method   
  4.         define_method :new_method do  #当前self是类   
  5.             puts "this is a new method"  
  6.         end  
  7.     end  
  8.     end  
  9.     creat_method   
  10. end  
  11.   
  12. Project1.new.new_method  
class Project1
    class << self
        def creat_method
        define_method :new_method do  #当前self是类
            puts "this is a new method"
        end
    end
    end
    creat_method
end

Project1.new.new_method



 

分享到:
评论

相关推荐

    Ruby Meta Programming: define_method or class_eval

    在Ruby编程语言中,元编程是一种强大的特性,它允许代码在运行时定义或修改自身的行为。`define_method`和`class_eval`是Ruby元编程中的两个关键方法,它们被广泛用于动态地添加方法到类或者模块中。这篇文章将深入...

    Ruby元编程第二版中文

    Ruby元编程是编程领域中一个深入且强大的主题,它允许程序员在运行时修改或创建代码,极大地提高了灵活性和代码的动态性。这本书“Ruby元编程第二版”专注于讲解Ruby语言的这一独特特性,旨在帮助开发者更好地理解和...

    《Ruby元编程》PDF版本下载.txt

    根据提供的文件信息,本文将对《Ruby元编程》这一主题进行深入探讨,解析其核心概念、应用场景以及为何元编程在Ruby语言中具有重要的地位。 ### 一、Ruby元编程简介 #### 1.1 元编程定义 元编程是指编写能够生成或...

    intro_to_metaprogramming:Ruby元编程简介

    使用send , define_method和method_missing遍历不同的元编程技术 将您的思维扩展到元编程,并让您考虑可以在自己的代码中利用它的地方 设置 要求 该讲习班是使用Ruby 1.9.3创建的,但是在2.1.2版本中有效。 假设您...

    Ruby元编程之梦中情人method_missing方法详解

    Ruby中的`method_missing`是元编程的一个核心特性,它允许你在类或模块中处理未定义的方法调用。当你尝试调用一个不存在的方法时,Ruby会默认抛出`NoMethodError`异常,但如果你定义了`method_missing`方法,它就会...

    元编程 Ruby

    2. 方法拦截:Ruby提供了method_missing方法,它允许我们拦截对当前对象中未定义方法的调用,并进行自定义处理。 3. 模块混入:Ruby中的模块可以被包含(include)到类中,这在本质上是把模块中的方法和类混合,...

    Ruby元编程基础学习笔记整理

    ### Ruby元编程基础学习笔记整理 #### 一、语言构建(Language Constructs) 在Ruby中,诸如变量、类和方法等元素统称为语言构建(Language Constructs)。这些构建块是构成Ruby程序的基础。 ##### 示例代码分析 ```...

    Ruby元编程 源代码 Metaprogramming Ruby source code

    Ruby元编程是编程领域中的一个高级技术,它允许程序员在运行时操纵语言的结构和行为。这本《Metaprogramming Ruby》书籍深入探讨了如何利用Ruby的特性进行元编程,帮助开发者提升代码的灵活性、可扩展性和复用性。源...

    patch_def_ruby_Metaprogramming_Before_

    在Ruby编程语言中,元编程是一种强大的特性,它允许代码在运行时定义或修改自身的行为。"patch_def_ruby_Metaprogramming_Before_" 的标题暗示了我们将在讨论如何利用元编程技术来添加在方法之前的钩子,比如 `def_...

    编程之魂:Ruby中的元编程艺术

    # 编程之魂:Ruby中的元编程艺术 Ruby 是一种设计精良的高级编程语言,自1995年由日本开发者松本行弘(Yukihiro "Matz" Matsumoto)创建以来,就因其优雅简洁的语法、强大的功能以及高度的灵活性而受到众多程序员的...

    ruby metaprograming

    不过,基于您的需求,我将重点围绕“Ruby元编程”这一主题来生成相关的知识点。 ### Ruby元编程 #### 一、引言 Ruby是一种动态类型的面向对象语言,它的灵活性和简洁性使得它非常适合进行元编程。元编程是指编写...

    Meta Programming Ruby

    ### Meta Programming Ruby:深入理解Ruby元编程 #### 核心概念与原理 《Meta Programming Ruby》这本书由Paolo Perrotta编写,旨在帮助读者深入了解Ruby语言的元编程特性及其强大功能。通过本书的学习,读者可以...

    MetaProgramming-Play:重写 Ruby 注入方法以了解元编程

    第 10 周:创客学院在 Ruby 中玩转元编程挑战: 使用method_missing重新定义对象在询问has_unknown_attribute时的Reacthas_unknown_attribute 。 使用define_method创建Ruby 内置attr_accessor方法的布尔版本。代码...

    Ruby是一种强大而优雅的编程语言,以其简洁的语法、动态性、面向对象编程和丰富的类库而著称 以下是对Ruby的500字资源介绍:

    ### Ruby编程语言的核心知识点 #### 一、Ruby的起源与设计理念 **Ruby**是由日本人松本行弘(Yukihiro Matsumoto)于1990年代末期开发的一种编程语言。松本行弘在设计Ruby时融合了多种语言的优点,如**Perl**的...

    label_break_ruby_Metaprogramming_

    在Ruby编程语言中,元编程(Metaprogramming)是一种强大的特性,允许程序在运行时检查、修改甚至创建自身的结构和行为。元编程能够增加代码的灵活性和可扩展性,但同时也需要谨慎使用,以避免过度复杂化和降低代码...

    Ruby元编程技术详解(Ruby Metaprogramming techniques)

    以下是一些关于Ruby元编程的关键知识点: 1. 单例类(Singleton Class): 在Ruby中,每个对象都有一个与之关联的单例类,这个类只包含该对象的实例方法。通过`class ; self; end`可以访问到对象的单例类,这对于...

    metaprogramming_introduction:一篇以源代码形式介绍Ruby元编程基础知识的文章-Form source code

    在这个介绍中,我们将深入探讨Ruby元编程的基础知识,通过源代码的形式来理解其核心概念。 首先,元编程的一个关键组件是`eval`函数。`eval`允许我们执行一个字符串作为Ruby代码。例如: ```ruby code = "puts '...

    ruby书籍2

    书中可能会介绍`class_eval`、`define_method`等动态创建方法的技术,以及符号到方法的转换(`to_proc`)等高级特性。 4. **Ruby与Rails的集成**:Rails是基于Ruby的Web开发框架,书中可能会详细探讨Ruby如何与...

    ruby_1_9_3_core_rdocs.gz

    8. **元编程**:Ruby的元编程能力是其一大特色,通过`class_eval`、`instance_eval`和`define_method`等方法,可以在运行时动态修改类和对象的行为。 9. **线程与并发**:Ruby 1.9.3引入了全局解释器锁(GIL),...

    ruby程序样例

    此外,Ruby的元编程能力也很强,允许在运行时动态修改类和对象。比如,你可以用`define_method`动态定义方法: ```ruby def add_method(name, &block) define_method(name, block) end add_method :greet do ...

Global site tag (gtag.js) - Google Analytics