proc是block的对象形式,它的行为像是一个block,lambda和proc之间有些细小的差别,lambda更像一个方法,而不是一个block,调用一个proc就像yield一个block,调用一个lambda就像在调用一个方法(当然还是有区别的),在ruby1.9里,你可以使用lambda?来查看这个对象究竟是一个lambda还是一个proc。下面,是proc和lambda的一些区别:
1,Return in blocks,procs,and lambdas
在一个block或proc中执行return,程序将从包含这个block或proc的方法中返回
def test
puts "entering method"
p = Proc.new { puts "entering proc"; return }
p.call # Invoking the proc makes method return
puts "exiting method" # This line is never executed
end
test
#=》
# entering method
# entering block
在一个lambda中执行return,只是从该lambda中返回,在这也可以看出lambda像个方法
def test
puts "entering method"
p = lambda { puts "entering lambda"; return }
p.call # Invoking the lambda does not make the method return
puts "exiting method" # This line *is* executed now
end
test
#=》
# entering method
# entering lambda
# exiting method
2,break in blocks,procs,and lambdas
在一个block或proc中调用break,会使用程序从block或proc中返回到它的iterator,再从它的iterator返回到调用它的方法中,当我们使用Proc.new创建一个proc时,Proc.new是一个iterator,我们使用break,程序将会从这个iterator中返回。这时我们调用这个proc对象,程序已经从它的iterator已经返回了,在一个Proc.new中调用break是没有什么意义的
irb(main):048:0> proc = Proc.new { puts "entering proc"; break }
=> #<Proc:0x8a83984@(irb):48>
irb(main):049:0> proc.call
entering proc
LocalJumpError: break from proc-closure
from (irb):48:in `block in irb_binding'
from (irb):49:in `call'
from (irb):49
from /usr/local/bin/irb:12:in `<main>'
#有点难理解
下一个例子,比较好理解:
def iterator(&proc)
puts "entering iterator"
proc.call # invoke the proc
puts "exiting iterator" # Never executed if the proc breaks
end
def test
iterator { puts "entering proc"; break }
end
test
#=》
# entering iterator
# entering proc
在lambda中调用break效果和return是一样的
3,Other control-flow statements
next: 在block,proc,lambda中表现是一样的,都是从本个yield或都是call中返回到iterator,如果next 后面跟一个表达式,该表达式的值将被作为返回值返回
irb(main):052:0> proc = Proc.new { puts "entering proc"; next }
=> #<Proc:0x89bf070@(irb):52>
irb(main):053:0> proc.call
entering proc
=> nil
irb(main):054:0> proc = Proc.new { next;puts "entering proc" }
=> #<Proc:0x89b58f4@(irb):54>
irb(main):055:0> proc.call
=> nil
irb(main):056:0> a=[1,2,3]
=> [1, 2, 3]
irb(main):057:0> a.each{|x|next if x == 2;puts x }
1
3
=> [1, 2, 3]
redo:一样
retry:不能用在porcs和lambdas中,会产生LocalJumpError
raise:如果在block,proc,lambda中raise一个exception,并且不在该 block,proc和lambda中捕捉异常,异常会传播到调用该block,proc,lambda的方法中。
procs和lambdas的参数传递:这是一个意外收获~
使用yield调用一个block(使用call()调用proc)和调用一个方法非常相似,但是它们是不一样的,
yield语句使用 yield
semantics,它的语法和并行赋值一样,
方法调用使用
invocation semantics
.它没并行赋值那么强大,lambda类似方法,所以它也是采用这个方法调用。
p = Proc.new {|x,y| print x,y }
p.call(1) # x,y=1: nil used for missing rvalue: Prints 1nil
p.call(1,2) # x,y=1,2: 2 lvalues, 2 rvalues: Prints 12
p.call(1,2,3) # x,y=1,2,3: extra rvalue discarded: Prints 12
p.call([1,2]) # x,y=[1,2]: array automatically unpacked: Prints 12
#yield semantics 一切都是自动的,抛弃多余的实参,为没有值的形参赋
#nil,甚至自动打散数组,这在方法(或lambda)中都是需要显示的调用*才行的
l = lambda {|x,y| print x,y }
l.call(1,2) # This works
l.call(1) # Wrong number of arguments
l.call(1,2,3) # Wrong number of arguments
l.call([1,2]) # Wrong number of arguments
l.call(*[1,2]) # Works: explicit splat to unpack the array
总结:proc和lambda在大部分情况下表现是一样的,当遇到return ,break等涉及到控制权变更时才会有些许的不一样,一个简便的方法就是把proc看成类似block的东西,而lambda看成类似方法的东西。
分享到:
相关推荐
命名过程 当使用大量 proc 时,命名它们可能会很方便。 它使以后更容易识别它们。 有关使用命名过程的示例,请参阅 gem! 安装 添加到 Gemfile: ...>> b = lambda.doubler{ |e| e * 2 } => # >> b.
The road to Ruby mastery is paved with blocks, procs, and lambdas. To be a truly effective Ruby programmer, it’s not enough just to understand these features—you need to know how to use them in ...
4. ** Blocks, Procs 和 Lambdas**:Ruby提供了三种代码块结构:Blocks(匿名函数)、Procs(可存储的代码块)和Lambdas(类似于函数)。它们可以作为参数传递,增强了代码的灵活性。 5. **Gem生态系统**:Ruby的...
解决nagios安装后输出process不能出图,这是重新编译后的check_procs,直接替换原来的就可以出图了
标题“SkBitmapProcState_procs.rar_Before”暗示我们即将探讨的是与Skia图形库相关的代码,特别是关于`SkBitmapProcState_procs`的部分。这个标题可能是某个版本或更新前的代码快照,可能用于版本控制或者回溯代码...
在这篇知识总结中,我们将深入探讨Ruby中的线程同步和闭包(包括Blocks、Procs、Lambdas和Methods)。 首先,让我们关注线程同步。在多线程编程中,确保数据安全是非常重要的。Ruby提供了多种机制来实现线程同步,...
边带 在单独的边带线程中运行简单的作业。 Sideband 可以轻松地将... 要将工作传递给 Sideband,您可以将任何可调用的(procs、lambdas、worker)添加到其队列中: Sideband . queue << -> { Something . expens
基于Ubuntu7.10的minigui开发包
Find out Stored Procs Which Referenced Specified TableName
Procs FREQ and MEANS have been part of SAS® for over 30 years and are probably some of the most used and loved procedures. They provide useful information directly and as input to other routines and ...
下载替换/USR/LOCAL/NAGIOS/LIBEXEC下的check_procs文件,重启服务即可!!
"Procs-开源"是一个专为记录和管理进程而设计的开源项目,旨在支持发票系统的构建。开源软件意味着它的源代码是公开的,允许用户查看、修改和分发,这促进了社区协作和持续改进。在深入探讨这个项目之前,我们需要...
pro+cs6安装教程+序列号 .
2. **Windows系统的`QueryPerformanceCounter()`**: Windows提供了更精确的计时器`QueryPerformanceCounter()`,它返回高精度的系统时钟值。与之配套的还有`QueryPerformanceFrequency()`,用于获取时钟频率。计算...
2. **过滤进程**:可以使用`grep`或正则表达式与其他命令结合,例如`procs | grep nginx`来查找包含“nginx”的进程。 3. **列格式化**:通过`-o`或`--format`参数自定义输出格式,包括进程ID(PID)、命令行(CMD)...
1. **Ruby基础知识**:学习RoR前,了解Ruby的基础语法和特性是必要的,包括元编程、 Blocks、Procs、Lambdas等。 2. **Rails框架结构**:解释RoR的MVC架构,以及每个部分的作用,如Controller负责处理HTTP请求,...
procs procs替代了用Rust编写的ps。 文档快速链接功能平台安装使用情况配置功能t procs输出procs替代了用Rust编写的ps。 文档快速链接功能平台安装用法配置功能以彩色和人类可读的格式输出多列上的关键字搜索ps TCP ...
2. **流式处理**:`Procs`允许开发者以流的形式处理子进程的输入和输出,使得实时数据处理更为便捷。 3. **错误处理**:`Procs`提供了统一的方式来捕获和处理子进程的错误,使得调试和问题定位更为简单。 4. **...
ReMesh是一个流形三角网格... Falcidieno "ReMESH: An Interactive Environment to Edit and Repair Triangle Meshes" In Procs of Shape Modeling Internationl (SMI'06), IEEE C.S. Press, pp. 271-276, 2006.
补偿 一个将添加到 (包括lambda )和Ruby库。 当前版本: 1.0.0 支持的Ruby版本: 1.9.2、1.9.3、2.0、2.1、2.2 ...# Composing Procs and other callables class Parser def call ( json ) JSON . l