存放代码片断
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 前者优先级高。
分享到:
相关推荐
主要介绍了Ruby中的block、proc、lambda区别总结,本文讲解了yield 和 block call 的区别、block 和 proc、lambda 的区别、proc 和 lambda 的区别,需要的朋友可以参考下
Ruby中的Proc类是用于封装代码块(block)的对象,它允许你像操作对象一样操作代码。Proc类提供了创建和管理代码块的能力,特别是在需要在不同的上下文中调用或传递代码块时非常有用。 Proc可以通过`Proc.new`类...
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)特性,从Block的基础定义出发,介绍了其与Lambda的关系、作为方法参数的应用、`yield`关键字的使用、Block与方法之间的转换,以及Block作为对象的本质。通过这些知识点的学习...
此外,Ruby提供了`lambda`和`proc`来将block转换为Proc对象,Proc是Ruby中的一个类,代表可调用的代码块,这样就能够在需要的时候将block当作函数处理。与block相比,`lambda`更接近于JavaScript中的函数,因为它更...
块(block)和 Proc 对象是Ruby的独特之处,它们可以用来实现迭代和回调功能。 Ruby的元编程能力非常强大,可以动态修改类和对象的行为。反射API(Reflection API)允许在运行时检查和操作对象、类和模块的内部结构...
Ruby中的块(Block)、 Proc 和 Lambda 是其元编程能力的重要体现。它们允许你在运行时创建和修改代码,这在编写高度定制和自适应的程序时非常有用。文档会详细介绍这些概念及其在实际编程中的应用。 此外,Ruby...
#### Block中的变量 Block内的变量可以分为两种:局部变量和外部变量。 1. **局部变量**:这些变量仅在Block内部可见,不能在Block外部访问。例如: ```ruby [1, 2, 3, 4].each do |value| square = value * ...
Ruby的块(block)、 Proc 和 Lambda 是实现回调和高阶函数的关键。 元编程是Ruby的一大特色,它允许你在运行时修改代码。Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`...
文档会介绍如何定义、调用方法,以及块(block)和 Proc 对象。 4. **异常处理**:Ruby提供了异常处理机制,通过`begin-rescue-end`块来捕获和处理错误。 5. **字符串和数组**:这两种数据结构在Ruby中非常常用,...
此外,Ruby的块(Block)和 Proc 对象让函数式编程变得简单,例如使用`each`方法遍历数组: ```ruby fruits = ["Apple", "Banana", "Cherry"] fruits.each { |fruit| puts fruit } ``` 元编程是Ruby的另一个强大特性...
- 函数与方法:Ruby中的函数被称为方法,可以定义在类或模块中,支持块(block)和 Proc 对象。 2. **面向对象编程(OOP)** - 类与对象:Ruby是纯面向对象的语言,一切皆对象。你可以创建自定义类来封装数据和...
方法调用可以用点操作符(`.`)或者下划线操作符(`_`),并且支持块(block)和 Proc 对象,这对于迭代和回调非常有用。 4. **控制结构**:Ruby有各种控制结构,包括条件语句(if/else/unless)、循环(for、while、...
3. **块、 Proc 和 Lambda**: Ruby支持块(block)、Proc和Lambda,它们都是代码的封装形式。块是通过花括号 `{}` 或 `do..end` 定义的一段代码;Proc是可存储的代码块,可以赋值给变量;Lambda更接近函数,关注参数...
Ruby中的代码块(block)是语言的核心特性之一,它允许开发者定义可执行的代码段,并在需要的时候通过`yield`关键字调用。代码块通常由`{}`或`do...end`包围,它们不是独立的类,但可以转换为`Proc`类的对象。对于初学...
在Ruby编程语言中,Proc对象是用来封装代码块的类,它允许我们将块(block)作为对象来处理。Proc与块密切相关,可以通过两种方式创建Proc对象:直接使用Proc.new或者通过在方法定义中包含一个块。Proc对象可以调用`...
Proc(Procedure)是Ruby中的一种匿名函数,它可以捕获并存储代码块。Proc对象可以在稍后的时间点被调用执行,这就为回调提供了可能。下面是一个简单的例子: ```ruby def call_back(proc) proc.call end cb = ...
在Ruby编程语言中,代码块(block)是一种非常重要的特性,它允许程序员定义一段可执行的代码,并在需要时调用。然而,由于代码块本身不是对象,有时我们需要将其转换为对象以便于存储、传递或作为参数使用。这就是...
5. 高级语法:Ruby拥有丰富的语法结构,如块(block)、 Proc 和 Lambda,这些使得代码可读性和可维护性更高。 6. 标准库丰富:Ruby的标准库包含了大量预定义的类和模块,涵盖了网络通信、文件操作、日期和时间处理...