`
orez88
  • 浏览: 3334 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
最近访客 更多访客>>
社区版块
存档分类
最新评论

Procs and Lambdas(2)

    博客分类:
  • ruby
 
阅读更多

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看成类似方法的东西。

 

分享到:
评论

相关推荐

    named_proc:命名 procs 和 lambdas

    命名过程 当使用大量 proc 时,命名它们可能会很方便。 它使以后更容易识别它们。 有关使用命名过程的示例,请参阅 gem! 安装 添加到 Gemfile: ...&gt;&gt; b = lambda.doubler{ |e| e * 2 } =&gt; # &gt;&gt; b.

    Mastering Ruby Closures

    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 ...

    ruby-main.zip

    4. ** Blocks, Procs 和 Lambdas**:Ruby提供了三种代码块结构:Blocks(匿名函数)、Procs(可存储的代码块)和Lambdas(类似于函数)。它们可以作为参数传递,增强了代码的灵活性。 5. **Gem生态系统**:Ruby的...

    有性能参数输出的check_procs

    解决nagios安装后输出process不能出图,这是重新编译后的check_procs,直接替换原来的就可以出图了

    SkBitmapProcState_procs.rar_Before

    标题“SkBitmapProcState_procs.rar_Before”暗示我们即将探讨的是与Skia图形库相关的代码,特别是关于`SkBitmapProcState_procs`的部分。这个标题可能是某个版本或更新前的代码快照,可能用于版本控制或者回溯代码...

    ruby 知识总结

    在这篇知识总结中,我们将深入探讨Ruby中的线程同步和闭包(包括Blocks、Procs、Lambdas和Methods)。 首先,让我们关注线程同步。在多线程编程中,确保数据安全是非常重要的。Ruby提供了多种机制来实现线程同步,...

    sideband:在单独的边带线程中运行简单的后台作业

    边带 在单独的边带线程中运行简单的作业。 Sideband 可以轻松地将... 要将工作传递给 Sideband,您可以将任何可调用的(procs、lambdas、worker)添加到其队列中: Sideband . queue &lt;&lt; -&gt; { Something . expens

    minigui-procs-dev_2.0.4ubuntu7.10_i386.deb

    基于Ubuntu7.10的minigui开发包

    Find out Stored Procs Which Referenced Specified TableName

    Find out Stored Procs Which Referenced Specified TableName

    SAS-FREQ n’ MEANS.pdf

    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 ...

    解决PNP4nagios无法显示进程PROCS图标问题

    下载替换/USR/LOCAL/NAGIOS/LIBEXEC下的check_procs文件,重启服务即可!!

    Procs-开源

    "Procs-开源"是一个专为记录和管理进程而设计的开源项目,旨在支持发票系统的构建。开源软件意味着它的源代码是公开的,允许用户查看、修改和分发,这促进了社区协作和持续改进。在深入探讨这个项目之前,我们需要...

    procs6安装教程

    pro+cs6安装教程+序列号 .

    系统介绍计算c语言程序运行时间.rar

    2. **Windows系统的`QueryPerformanceCounter()`**: Windows提供了更精确的计时器`QueryPerformanceCounter()`,它返回高精度的系统时钟值。与之配套的还有`QueryPerformanceFrequency()`,用于获取时钟频率。计算...

    procs:用Rust编写的ps的现代替代品

    2. **过滤进程**:可以使用`grep`或正则表达式与其他命令结合,例如`procs | grep nginx`来查找包含“nginx”的进程。 3. **列格式化**:通过`-o`或`--format`参数自定义输出格式,包括进程ID(PID)、命令行(CMD)...

    Ruby on Rails实践之路给PHP和Java开发者的书

    1. **Ruby基础知识**:学习RoR前,了解Ruby的基础语法和特性是必要的,包括元编程、 Blocks、Procs、Lambdas等。 2. **Rails框架结构**:解释RoR的MVC架构,以及每个部分的作用,如Controller负责处理HTTP请求,...

    procs — Rust编写的“ ps”的现代替代品-Rust开发

    procs procs替代了用Rust编写的ps。 文档快速链接功能平台安装使用情况配置功能t procs输出procs替代了用Rust编写的ps。 文档快速链接功能平台安装用法配置功能以彩色和人类可读的格式输出多列上的关键字搜索ps TCP ...

    Python-ProcsKennethReitz尝试提供了一个类似于PythonSubprocess模块功能的高层次抽象API

    2. **流式处理**:`Procs`允许开发者以流的形式处理子进程的输入和输出,使得实时数据处理更为便捷。 3. **错误处理**:`Procs`提供了统一的方式来捕获和处理子进程的错误,使得调试和问题定位更为简单。 4. **...

    ReMESH-2.0_win32

    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.

    comp:一个向函数和方法添加功能组成的Ruby库

    补偿 一个将添加到 (包括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

Global site tag (gtag.js) - Google Analytics