`
pingfeng
  • 浏览: 59276 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ruby强大的 define_method,有闭包的能力!

阅读更多

闭包的例子一般是在说ruby的块,特片是:访问本地变量和绑定运行上下文(很强大的两点)

 

nums = [10,3,22,34,17]
sum = 0
nums.each{|n| sum += n}
print sum

 

近来看mongoid的代码,发现define_method也能绑定运行上下文!

 

 def getter(name, metadata)
     tap do
       define_method(name) do |*args|
         reload, variable = args.first, "@#{name}"
         options = options(args)
         if instance_variable_defined?(variable) && !reload
           instance_variable_get(variable)
         else
           build(
             name,
             @attributes[metadata.key],
             metadata,
             options.merge(:binding => true, :eager => metadata.embedded?)
           )
         end
       end
     end
   end          

 

定义的getter方法中绑定了当时metadata类实例!这样应用不用再额外做映射表,来维护方法与其它对象的关系,正如有栈系统帮我们存函数出入参数。

 

写了一个简单示意方法:

 

class Metadata
  attr_accessor :relation_name
end

module Accessor           
  def build(name, metadata)
    p name, metadata, metadata.relation_name
  end

  module ClassMethods
    def getter(name, metadata)
      tap do
        define_method(name) do 
          build(
          name,
          metadata
          )
        end
      end
    end
  end        
end   

class Doc
  include Accessor
  extend Accessor::ClassMethods
end

meta = Metadata.new
meta.relation_name = 'embeds_one'

Doc.getter("ss_car", meta)
# p Doc.public_instance_methods
Doc.new.ss_car

meta2 = Metadata.new
meta2.relation_name = 'ref_one'
Doc.getter("ss_bus", meta2)
Doc.new.ss_bus                          

 

输出:

 

"ss_car"
#<Metadata:0x00000100846f38 @relation_name="embeds_one">
"embeds_one"
"ss_bus"
#<Metadata:0x00000100846128 @relation_name="ref_one">
"ref_one"

 

 

 

 

分享到:
评论

相关推荐

    Meta Programming Ruby

    - **动态方法定义**:假设有一个应用程序需要动态地根据用户的输入来定义新方法,可以使用`define_method`轻松实现这一点。 ```ruby class Calculator def self.define_operation(operation_name, &block) ...

    Ruby语言入门教程&代码示例.zip

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本教程将带你深入理解Ruby的基础知识,并通过代码示例帮助你快速上手。 一、Ruby语言基础 1. 变量:Ruby中的变量分为...

    Understanding Ruby's Object Model

    元编程能力允许我们编写代码来操纵代码本身,例如`define_method`可以动态定义方法。 9. **常量(Constants)** 常量以大写字母开头,一旦被赋值,其值在整个作用域内是不可变的。然而,常量的引用路径可能改变,...

    Ruby从入门到精通pdf

    - Ruby的元编程能力强大,可以在运行时修改类和对象的行为。 - eval()函数可以执行字符串形式的代码,define_method动态定义方法。 7. **Rails框架**: - Ruby on Rails是Ruby最著名的Web开发框架,它遵循MVC...

    Ruby元编程 源代码 Metaprogramming Ruby source code

    1. **方法定义**:Ruby允许在运行时定义新方法,如`define_method`。这个方法接受一个符号作为方法名和一个代码块,然后在指定的对象或类上创建一个新方法。 2. **类和模块的开放性**:Ruby的类和模块在运行时可以...

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

    综上所述,Ruby的元编程特性提供了强大的代码动态性,使得我们可以更灵活地编写和调整程序。通过`eval`, `send`, `instance_eval`, `class_eval`, 动态方法定义,以及`Proc`和`Lambda`等工具,开发者能够创建出更具...

    ruby基础教程中文第四版

    Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)创立,因其简洁优雅的语法和强大的元编程能力而备受开发者喜爱。《Ruby基础教程(中文第四版)》是深入学习Ruby语言的重要参考资料...

    Ruby In a Nutshell

    Ruby是一种动态、面向对象的脚本语言,以其简洁、优雅的代码风格和强大的元编程能力而闻名。这本书旨在帮助读者迅速掌握Ruby的关键元素,以便在实际项目中高效运用。 1. **变量和数据类型** - Ruby支持多种变量...

    ruby-2.5.8.tar.gz

    Ruby以其简洁、优雅的语法和强大的元编程能力而闻名,它强调程序员的生产力和代码的可读性。在Ruby-2.5.8版本中,我们可以探讨以下几个关键知识点: 1. **版本号的意义**:Ruby的版本号通常由主版本号、次版本号和...

    ruby使用文档

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本使用文档详尽地介绍了Ruby的API类库,是学习和掌握Ruby编程的重要资源。以下是一些关键知识点的概述: 1. **变量与...

    ruby源代码7

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。源代码是任何编程语言的核心,它包含了程序的逻辑和实现细节。在Ruby的世界里,源代码通常是`.rb`文件,它们由一系列的...

    teaching ruby

    3. **块、迭代器和闭包**:Ruby的块、迭代器和闭包是其强大之处,它们使得代码更简洁且可读性更强。比如,`each`迭代器和`yield`关键字在处理集合时非常实用。 4. **元编程**:Ruby的元编程能力使其可以在运行时...

    ruby开发文档

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本开发文档将深入探讨Ruby的核心概念、语法特性、类与对象、方法、模块和混合、数组、哈希、控制结构、异常处理、文件与...

    ruby-main.zip

    Ruby是一种面向对象的脚本语言,以其简洁、优雅的语法和强大的元编程能力著称。在"Ruby学习指南"这个压缩包中,很显然,它包含了一系列关于Ruby编程的资源,可能包括教程、代码示例或者项目实践。下面,我们将深入...

    the ruby way

    5. **元编程**:Ruby提供了`class`, `module`, `define_method`, `method_missing`等工具,允许在运行时创建和修改类和模块,实现自省和自定义行为。 6. **Gem生态系统**:Ruby拥有庞大的Gem库,这是一个开源软件包...

    Ruby语言中文教程

    将学习到`eval`、`send`、`define_method`等元编程技巧。 8. **块、 Proc 和 Lambda**:Ruby中的块、Proc和Lambda是函数式编程的重要元素,它们用于定义匿名函数和闭包。 在提供的源代码文件(E9-1.rb、E3.10-5.rb...

    ruby 中文文档 入门必学

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。这份"ruby中文文档"是为初学者量身定制的资源,旨在帮助新手快速入门并深入理解Ruby的核心概念。 文档可能涵盖以下知识...

    Metaprogramming ruby

    7. **Closures和Blocks**:Ruby的块(Blocks)和闭包(Closures)是强大的功能,它们允许函数式编程风格和匿名函数。在元编程中,块常用于构建可定制的行为。 8. **类对象和类方法**:Ruby中的类本身也是对象,因此...

    Pragmatic.rogramming.Ruby.1.9.and.2.0.4th.Edition.pdf

    Ruby是一种动态、面向对象的脚本语言,以其简洁、优雅的语法和强大的元编程能力著称。 在Ruby 1.9和2.0这两个版本中,语言有许多关键性的改进和优化。例如,1.9版本引入了Unicode字符串处理,提高了对字符串编码的...

    Metaprogramming Ruby(Second Edition)

    这本书详细介绍了如何利用Ruby的强大元编程特性来提升代码的灵活性、可扩展性和简洁性。元编程允许程序员在运行时修改或创建程序结构,使得代码能够自我描述和自我修改,极大地增强了编程的动态性和创造性。 Ruby元...

Global site tag (gtag.js) - Google Analytics