`
机器人
  • 浏览: 85099 次
  • 性别: Icon_minigender_2
  • 来自: Google
社区版块
存档分类
最新评论

Ruby中的Proc,Block的应用说明

阅读更多
存放代码片断
Proc可以将要执行的一些代码片断放在一起,却不立即执行,而是在后来我们想要执行它的时候来调用。
say_hello = Proc.new { puts "Hello!" } # 代码不会立即执行

say_hello.call # 现在我们来调用运行Proc的存放的代码
# => "Hello!"


用Proc来组织我们的代码
Proc是组织代码的好工具,比如现在我们要测试一下某些代码的执行花费时间,通过Proc可以很灵活地做到这一点:
def time(a_proc)
  start = Time.now
  a_proc.call
  puts Time.now - start
end

time(Proc.new { code_here })
time(Proc.new { more_code_here })


Blocks!
用Block来实现上面说的更方便,而且看起来漂亮一些:
def time
  start = Time.now
  yield
  puts Time.now - start
end

time { code_here }
time { more_code_here }

那个yield就和a_proc.call类似,是作用block的一个点位符。

向Proc和Block中传递参数
向Proc和Block中传递参数的方式是一样的:
def dumb_hello_world_test
  yield(5)
end

dumb_hello_world_test {|i| puts i * 2 }
# => 10

my_silly_proc = Proc.new {|name| puts name.upcase }
my_silly_proc.call("August Lilleaas")
# => "AUGUST LILLEAAS"

看一下这个例子
[1, 2, 3].map {|i| puts i * 2 }
# => 2
# => 4
# => 6


我们自己再来实现Array中的each方法
class Array
  def each
    i = 0
    while(i < self.length) do
      yield(self[i])
      i += 1
    end
  end
end

my_array = ["a", "b", "c"]
my_array.each {|letter| puts letter }
# => "a"
# => "b"
# => "c"


另外对于block,有两种形式
{}和do end 前者优先级高。
分享到:
评论
2 楼 机器人 2009-07-03  
要不要都可以的,你觉得爽了就行。
1 楼 yuyue 2009-06-26  
看了你写的关于Proc.思路比较清晰了.谢谢
def dumb_hello_world_test  
  yield(5) 
end 
 
dumb_hello_world_test {|i| puts i * 2 }  
# => 10  
 
my_silly_proc = Proc.new {|name| puts name.upcase }  
my_silly_proc.call("August Lilleaas")  
# => "AUGUST LILLEAAS" 
红色部分是不要括号的吧

相关推荐

    Ruby中的block、proc、lambda区别总结

    主要介绍了Ruby中的block、proc、lambda区别总结,本文讲解了yield 和 block call 的区别、block 和 proc、lambda 的区别、proc 和 lambda 的区别,需要的朋友可以参考下

    Ruby中的Proc类及Proc的类方法Proc.new的使用解析

    Ruby中的Proc类是用于封装代码块(block)的对象,它允许你像操作对象一样操作代码。Proc类提供了创建和管理代码块的能力,特别是在需要在不同的上下文中调用或传递代码块时非常有用。 Proc可以通过`Proc.new`类...

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

    Ruby中的闭包实现有:Block,Proc,Lambada。 首先,我们来看Block。 代码如下: ary = [1,2,3,4] ary.collect! do |a|  a*a end ary.each do |a|  puts a end 这段代码,我们使用了Array对象的block方法,将ary中...

    深入理解Ruby中的代码块block特性

    本文深入探讨了Ruby中的代码块(block)特性,从Block的基础定义出发,介绍了其与Lambda的关系、作为方法参数的应用、`yield`关键字的使用、Block与方法之间的转换,以及Block作为对象的本质。通过这些知识点的学习...

    深入理解Ruby中的block概念

    此外,Ruby提供了`lambda`和`proc`来将block转换为Proc对象,Proc是Ruby中的一个类,代表可调用的代码块,这样就能够在需要的时候将block当作函数处理。与block相比,`lambda`更接近于JavaScript中的函数,因为它更...

    ruby 中文文档 必备资料

    块(block)和 Proc 对象是Ruby的独特之处,它们可以用来实现迭代和回调功能。 Ruby的元编程能力非常强大,可以动态修改类和对象的行为。反射API(Reflection API)允许在运行时检查和操作对象、类和模块的内部结构...

    ruby中文文档.chm

    Ruby中的块(Block)、 Proc 和 Lambda 是其元编程能力的重要体现。它们允许你在运行时创建和修改代码,这在编写高度定制和自适应的程序时非常有用。文档会详细介绍这些概念及其在实际编程中的应用。 此外,Ruby...

    深入讲解Ruby中Block代码快的用法

    #### Block中的变量 Block内的变量可以分为两种:局部变量和外部变量。 1. **局部变量**:这些变量仅在Block内部可见,不能在Block外部访问。例如: ```ruby [1, 2, 3, 4].each do |value| square = value * ...

    ruby中文教程,从基础到深入的让你学习ruby

    Ruby的块(block)、 Proc 和 Lambda 是实现回调和高阶函数的关键。 元编程是Ruby的一大特色,它允许你在运行时修改代码。Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`...

    ruby中文 文档

    文档会介绍如何定义、调用方法,以及块(block)和 Proc 对象。 4. **异常处理**:Ruby提供了异常处理机制,通过`begin-rescue-end`块来捕获和处理错误。 5. **字符串和数组**:这两种数据结构在Ruby中非常常用,...

    Ruby入门教程中文PDF 附实例

    此外,Ruby的块(Block)和 Proc 对象让函数式编程变得简单,例如使用`each`方法遍历数组: ```ruby fruits = ["Apple", "Banana", "Cherry"] fruits.each { |fruit| puts fruit } ``` 元编程是Ruby的另一个强大特性...

    ruby中文教程(源代码)

    - 函数与方法:Ruby中的函数被称为方法,可以定义在类或模块中,支持块(block)和 Proc 对象。 2. **面向对象编程(OOP)** - 类与对象:Ruby是纯面向对象的语言,一切皆对象。你可以创建自定义类来封装数据和...

    ruby语言帮助文档(简体中文)

    方法调用可以用点操作符(`.`)或者下划线操作符(`_`),并且支持块(block)和 Proc 对象,这对于迭代和回调非常有用。 4. **控制结构**:Ruby有各种控制结构,包括条件语句(if/else/unless)、循环(for、while、...

    Ruby API 帮助文档.zip

    3. **块、 Proc 和 Lambda**: Ruby支持块(block)、Proc和Lambda,它们都是代码的封装形式。块是通过花括号 `{}` 或 `do..end` 定义的一段代码;Proc是可存储的代码块,可以赋值给变量;Lambda更接近函数,关注参数...

    Ruby中的block代码块学习教程

    Ruby中的代码块(block)是语言的核心特性之一,它允许开发者定义可执行的代码段,并在需要的时候通过`yield`关键字调用。代码块通常由`{}`或`do...end`包围,它们不是独立的类,但可以转换为`Proc`类的对象。对于初学...

    ruby基础教程(第四版)第21章 Proc类1

    在Ruby编程语言中,Proc对象是用来封装代码块的类,它允许我们将块(block)作为对象来处理。Proc与块密切相关,可以通过两种方式创建Proc对象:直接使用Proc.new或者通过在方法定义中包含一个块。Proc对象可以调用`...

    在Ruby中设计Callback机制

    Proc(Procedure)是Ruby中的一种匿名函数,它可以捕获并存储代码块。Proc对象可以在稍后的时间点被调用执行,这就为回调提供了可能。下面是一个简单的例子: ```ruby def call_back(proc) proc.call end cb = ...

    详解Ruby中的代码块对象Proc

    在Ruby编程语言中,代码块(block)是一种非常重要的特性,它允许程序员定义一段可执行的代码,并在需要时调用。然而,由于代码块本身不是对象,有时我们需要将其转换为对象以便于存储、传递或作为参数使用。这就是...

    Ruby语言中文教程

    5. 高级语法:Ruby拥有丰富的语法结构,如块(block)、 Proc 和 Lambda,这些使得代码可读性和可维护性更高。 6. 标准库丰富:Ruby的标准库包含了大量预定义的类和模块,涵盖了网络通信、文件操作、日期和时间处理...

Global site tag (gtag.js) - Google Analytics