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

ruby 闭包能力的小例

 
阅读更多

C++的宏大家用得很开心,但可读性不太好。

宏就是代码级动态,非运行时,是非常有需求的!

 

Ruby的define_method和class_eval都有闭包能力。但有时可读性也不那么好,class_eval更是。

 

例子:

class Class
  def plugin 
    class_eval do
      def self.print
        p 'inspect me!'
      end
    end
  end 
end

module Core
  def plugin_d klass 
      define_singleton_method("printx") do 
        p klass.name
      end       
  end 
  def plugin_dd klass 
    class_eval <<-RUBY 
      def self.printy
        p #{klass}.name
      end
    RUBY
  end             
  def plugin_ddd klass 
      define_singleton_method("printz") do 
        p klass.superclass.name
      end       
    end           
  def plugin_dddd klass 
    class_eval <<-RUBY 
      def self.printzz
        p #{klass}.superclass.name
      end
    RUBY
  end           
    
end

class A
  extend Core
  plugin 
  plugin_d String
  plugin_dd Integer
  plugin_ddd Integer  
  plugin_dddd Integer
end

A.print           
A.printx
A.printy
A.printz     
A.printzz

 输出

 

"inspect me!"
"String"
"Integer"
"Numeric"
"Numeric"

 

显然print方法能力闭包求值外部变量的能力。

define_singleton_method和class_eval都有,显然后者的可读性差一些,但效率要高。原因是class_eval是用语法解析后,直接变成了一个方法。而define_method生成了一个proc。proc再调用性能就差一点了。

 

 

0
1
分享到:
评论

相关推荐

    求闭包和最小依赖集

    "闭包和最小依赖集" 在关系数据库中,闭包和最小依赖集是两个重要的概念,它们都是函数依赖关系的基础。 闭包 在关系数据库中,闭包是指一个或多个属性的集合,它们之间存在函数依赖关系。给定一个属性集U={A,B,C...

    关系闭包的计算

    ### 关系闭包的计算 #### 实验背景与目的 在计算机科学与数学领域中,关系闭包是一种重要的概念,特别是在图论与数据库理论中有着广泛的应用。本实验旨在通过编程实践的方式帮助学习者深入理解关系闭包的概念,并...

    C语言实现三种闭包算法(传递,自反,对称闭包)

    在计算机科学中,闭包是一种重要的概念,尤其在函数式编程和逻辑编程中。闭包在C语言中可能不如在一些动态类型的语言中那么常见,但依然可以通过巧妙的技巧实现。这里我们将详细讨论如何用C语言实现传递闭包、自反...

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...

    ruby小程序

    5. 元编程:Ruby的元编程能力强大,允许在运行时修改和创建类、方法等,为解决复杂问题提供了额外的工具。 6. 社区和库:Ruby拥有活跃的开发者社区,提供了丰富的开源库和框架,如Rails、Sinatra等,用于构建Web...

    Java闭包 Java闭包

    JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...

    计算NFA中ε闭包

    ### 计算NFA中的ε闭包 #### 一、NFA与ε闭包概念介绍 **非确定有限自动机(NFA)**是一种理论计算模型,它扩展了确定有限自动机(DFA)的概念,允许在某些情况下从一个状态出发到达多个状态。在NFA中,存在一种特殊的...

    Mastering Ruby Closures

    《精通Ruby闭包》是Benjamin Tan Wei Hao撰写的一本指导书,旨在帮助读者深入了解Ruby编程语言中的闭包概念,包括块(Blocks)、Proc对象以及lambda表达式。本书着重介绍这些Ruby闭包的具体用途和行为,通过示例和...

    求闭包 属性集闭包 函数依赖的闭包

    3. 用户输入完毕所有的依赖后,显示“请输入属性集求闭包”的提示,当用户输入1个或者多个属性时,求出对应的闭包。(如,用户输入A,则显示A+的值, 用户输入AB则求出AB+的值。显示完毕后,再次显示“请输入属性集...

    数据库求属性集闭包&函数依赖闭包

    3) 计算属性集闭包的算法,在课件里有详细说明。方法很简单,但用文字描述很抽象。。。。不解释。。。 4) 计算函数依赖的闭包。此步骤不作要求,但要会方法。个人总结:将所有属性元素组成一个集合(域)记为R;...

    Swift之闭包ClosureDemo

    Swift中的闭包是一种强大的编程概念,它允许我们定义一段可移动和可重用的代码块,可以在函数中作为参数传递,也可以作为返回值。闭包在很多编程语言中都有类似的概念,但在Swift中,它们的设计既简洁又灵活,使得...

    最符合菜鸟的闭包

    闭包是编程语言中的一个重要概念,特别是在JavaScript等函数式编程语言中。对于初学者来说,它可能显得有些抽象,但理解闭包对于提升编程技能至关重要。闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的...

    用矩阵求自反闭包自反闭包

    在计算机科学和图论中,自反闭包是与关系理论相关的概念,特别是在布尔代数和图的子结构分析中。自反闭包是指给定一个关系R,将其扩展为包含所有起点到自身的元素对,即对于每一个元素a,都有(a, a)属于自反闭包。这...

    Javascript 闭包完整解释

    **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体来说,闭包是由函数及与其相关的引用环境组合而成的一个...

    原子闭包系统, 原子闭包算子和原子全蕴含系统

    原子闭包系统、原子闭包算子以及原子全蕴含系统是数理逻辑、抽象代数以及数学基础理论中的概念。在本篇文章中,作者杨海建、李庆国和何霞辉对这些概念进行了深入探讨,同时也研究了它们之间的相互关系,并且提出了...

    内存泄露,闭包 内存泄露,闭包 内存泄露,闭包

    内存泄露和闭包是两个关键概念,它们紧密关联并可能对程序性能产生重大影响。 内存泄露是指程序在不再需要某些数据时,未能释放这些数据所占用的内存。在JavaScript中,由于其自动垃圾回收(Garbage Collection, GC...

    二元关系的闭包运算

    常见的闭包有传递闭包、自反闭包和对称闭包。 1. **传递闭包**:如果关系R满足这样的性质:对于所有a, b, c属于A,若aRb且bRc,则aRc,我们就说R是传递的。传递闭包是包含R及其所有可能通过传递性推导出的元素对的...

    ruby语法基础教程

    4. **块和闭包**:Ruby中的块和闭包是其独特特性,它们允许灵活的代码组织和函数式编程风格。 5. **元编程**:Ruby提供了强大的元编程能力,允许在运行时修改和创建代码。 #### 第二章:Ruby编程环境 安装Ruby是...

    js闭包详细讲解

    ### JavaScript闭包详解 #### 一、闭包概念与特性 **闭包**是JavaScript语言的一个重要特性,它使得函数可以访问并操作其外部作用域内的变量,即使该函数在其外部作用域之外被调用。要理解闭包,首先需要了解...

    ios-闭包传值.zip

    在iOS开发中,闭包(Closure)是一种强大的编程工具,它允许我们定义代码块并可以在程序的不同地方作为值传递。闭包可以捕获和存储它所在上下文中的常量和变量,这使得它们非常适合用于异步操作、回调函数或者封装一...

Global site tag (gtag.js) - Google Analytics