`
wenjixiao
  • 浏览: 193819 次
社区版块
存档分类
最新评论

ruby's block and closure

    博客分类:
  • tech
阅读更多
端午放假的这几天,由于无聊,我又看了看ruby。
但是还是没有搞懂关于其block和closure。
今天,我看到了一篇对ruby创始人的采访,看到了一句很关键的话:real closure。
什么意思呢?不是拷贝而是直接的共享!
于是,我明白了。
下边的程序可以加深理解:
#my ruby play
$a=1
class Cat
  def miao
    a=Dog.new
    yield(a)
    a.hello
    puts "dkdkdkdkdk"
  end
end
class Dog
  def initialize
    @name="snoopy"
  end
  def bark
    puts @name
  end
  
end

def good
  a=2
  mycat=Cat.new

  my=Proc.new do |mm|
    class << mm
      def hello
        puts "hello"
      end
    end
    mm.bark
    #a=a*mm
  end

  mycat.miao(&my)
  puts "first change:#{a}!"
  mycat.miao(&my)
  puts "second change:#{a}!"
  puts "ok!!!!!"
end
#gogo!
good()

于是,事情就很清楚了:
1,block运行在定义它的环境中
2,block可以使用定义它时的环境,包括局部变量,self之类的东西
3,block可以接受参数,就像方法接受参数一样
4,不要对block的参数赋值,那样会产生一个新的在block之中的局部变量
5,你当然可以调用block的参数的方法(every thing is object!)
6,如果是单线程的,对block的定义和使用两个环境是交错执行的,特别的是创建block的环境可能被改变,但是这没有问题,你在这里创建的block,是你要改的,没有问题,只是调用的时机有所改变。
7,如果是多线程,情况略微复杂,比方说,我让两个线程同时运行mycat.miao,那么good中的a就可能被不同线程改变,有可能产生冲突。这种情况我没试,不过,我觉得已经没什么问题。
8,一个重要的思想是,ruby很大程度上仿照lisp,这给我指引了方向,从某些方面上讲,ruby's block有点像scheme的call/cc,只是一点点。

总之,知道了ruby的block和closure是很重要的,我觉得就这一点才是ruby的独特之处,其他的都没什么稀奇的。这好像略微改变得了对象之间的交互方式,当然只是外在的。原因就是closure的存在——一段代码,还有对环境的引用。这就是ruby的独特之处。
分享到:
评论

相关推荐

    Ruby Developer's Guide

    - **块(Block)与闭包(Closure)**:强大的函数式编程特性,可以用来定义匿名函数或作为代码块传递给方法。 ### 核心编程技术 #### 3. **控制结构** - **条件语句**(如`if`, `elsif`, `else`)和循环语句(如`for...

    Ruby教程 脚本语言

    4. **块和闭包**:Ruby中的块(block)是代码段,可以与方法交互,闭包(closure)则允许函数记住其定义时的上下文,增强了代码的复用性。 5. **元编程**:Ruby提供了丰富的元编程能力,允许在运行时修改和创建类、...

    关于ruby学习的资料

    3. 响应式编程:Ruby支持块(block)、闭包(closure)和迭代器,这些特性使得代码更具有表达性,尤其在处理集合数据时。 4. 自动内存管理:Ruby使用垃圾回收机制自动管理内存,程序员无需手动释放内存。 5. 元...

    ruby开发文档

    它支持块(block)、闭包(closure)和 Proc 对象,使得函数式编程风格得以实现。Ruby 1.9以后引入了语法糖,如缩进代替大括号表示代码块,使代码更整洁。 3. **类与对象**:在Ruby中,类是对象的蓝图,用于创建...

    ruby 快速开发web项目的教程

    Ruby语言的核心特性包括动态类型、垃圾回收机制、块(block)、闭包(closure)以及元编程。动态类型意味着变量的类型是在运行时确定的,这使得代码更简洁。Ruby的垃圾回收机制自动管理内存,开发者无需手动释放。块...

    Ruby语言入门教程v1.0_ruby语言入门教程_

    3. **块(Block)和闭包(Closure)**:Ruby中的块是一段可以嵌入到方法调用中的代码,它可以捕获并操作外部作用域的变量,形成闭包。这是Ruby实现函数式编程的重要工具。 4. **元编程(Metaprogramming)**:Ruby...

    Ruby程序设计.rar

    8. **闭包和上下文**:Ruby中的闭包(Closure)是能够记住其被定义时的作用域的函数,这是理解块、Proc和Lambda的关键。 9. **迭代器和集合操作**:Ruby提供了许多方便的集合操作,如map、each、select等,以及枚举...

    Ruby中使用Block、Proc、lambda实现闭包

    闭包(Closure),是指未绑定到任何对象的自由代码,闭包中的代码与任何对象和全局变量无关,只与执行此段代码的上下文相关。 今天我们简要的看一下ruby中的闭包实现。 Ruby中的闭包实现有:Block,Proc,Lambada。 ...

    ruby源代码7

    5. **闭包(Closure)**:Ruby的块和Proc具有闭包特性,即它们能记住定义时的作用域,即使在其他地方调用也能访问到。 6. **元编程**:Ruby的元编程能力强大,允许在运行时修改类和对象。`class用于打开当前对象的...

    Programming Ruby 2nd

    比如,Ruby支持块(block)和闭包(closure),使得处理迭代和回调函数变得简单易懂。此外,Ruby的面向对象机制非常强大,几乎一切皆为对象,类和模块的使用让代码结构清晰。 书中详细介绍了Ruby的基础知识,包括...

    Martin演讲实录:Ruby是非常好的开发工具

    此外,Ruby的块(block)和闭包(closure)功能使得处理迭代和回调变得更加方便,提高了代码的可读性和简洁性。 Martin先生在演讲中提到了他的网站开发经历,他坚持内容与表现分离的原则,最初使用XML和XSL进行数据...

    ruby 中文文档 入门必学

    3. **块、迭代器和闭包**:Ruby中的块(Block)和迭代器是其强大的特性之一,常用于遍历数据结构。闭包(Closure)即lambda或Proc,是能够记住其定义时环境的代码块。 4. **元编程**:Ruby允许在运行时修改自身,这...

    Ruby中文教程,佩戴实例

    Ruby支持块(block)和闭包(closure),这在处理迭代和回调函数时非常有用。 Ruby还引入了模块(module)和类(class),用于组织代码和实现多态性。类是创建对象的蓝图,而模块则可以用来封装方法,实现命名空间...

    Ruby入门培训ppt/pdf及代码

    Ruby也支持块(block)和闭包(closure),通过 `do..end` 或 `{..}` 来定义。 **3. 控制结构** Ruby中的控制结构包括条件语句(如 `if`、`unless`)、循环(如 `for`、`while`、`until` 和 `each`)以及异常处理...

    ruby基础学习资料

    块(block)是Ruby中的一个重要概念,可以配合`do..end`或`{..}`来创建。 4. **类与对象**: - 类是Ruby面向对象编程的核心,通过`class`关键字定义,使用`new`方法创建对象。 - 对象是类的实例,每个对象都有其...

    ruby准备资料ruby准备资料

    在Ruby中,块(block)、 Proc对象和Lambda都是闭包的不同形式。它们在控制流程、数据处理和回调函数等方面有广泛应用。 3. **迭代器(Iterator)** 迭代器是Ruby提供的一种机制,用于遍历集合对象的元素,如数组...

    Ruby

    4. 块和闭包:Ruby支持块(block)和闭包(closure),允许函数捕获和使用其定义范围内的变量,提高了代码的复用性和灵活性。 5. 元编程:Ruby提供了丰富的元对象协议(Meta Object Protocol, MOP),允许在运行时...

    ruby

    - **MRI(Matz's Ruby Interpreter)**:Ruby的参考实现,也是最常用的实现。还有JRuby(Java平台上的实现)和Rubinius等其他实现。 Ruby因其强大和灵活的特性,在Web开发、自动化脚本、测试工具等领域都有广泛应用...

    Launch_School_Intro_to_Programming_with_Ruby

    此外,Ruby的闭包(Closure)和块(Block)为函数式编程提供了便利。 在实际开发中,Ruby常用于Web开发,搭配Ruby on Rails框架构建高效、优雅的网站应用。Rails遵循MVC(模型-视图-控制器)架构模式,提供了一套...

Global site tag (gtag.js) - Google Analytics