微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

红宝石 – Proc.arity vs Lambda.arity

为什么proc和lambda为arity返回不同的值?

例如

proc   { |x = 0| }.arity       #=> 0
lambda { |a = 0| }.arity       #=> -1
proc   { |x=0,y| }.arity      #=> 1
lambda { |x=0,y| }.arity      #=> -2

见:http://www.ruby-doc.org/core-2.0/Proc.html#method-i-arity

解决方法

根据您链接的文档:

Returns the number of arguments that would not be ignored. If the block is declared to take no arguments,returns 0. If the block is kNown to take exactly n arguments,returns n. If the block has optional arguments,return -n-1,where n is the number of mandatory arguments. A proc with no argument declarations is the same a block declaring || as its arguments.

该文档忘记提到的是procs和lambda不以正确的方式处理参数,例如:

>> p = proc { |a = 1,b| b }
=> #<Proc:0x007ff0091ef810@(irb):1>
>> l = lambda { |a = 1,b| b }
=> #<Proc:0x007ff0098099f8@(irb):2 (lambda)>
>> p.call
=> nil
>> l.call
ArgumentError: wrong number of arguments (0 for 1..2)
    from (irb):2:in `block in irb_binding'
    from (irb):4:in `call'
    from (irb):4
    from /usr/local/bin/irb:12:in `<main>'

编辑:来自O’Reilly的Ruby编程语言是具有更多细节的Ruby编程语言:

6.5.3 The Arity of a Proc

The arity of a proc or lambda is the number of arguments it expects.
(The word is derived from the “ary” suffix of unary,binary,ternary,
etc.) Proc objects have an arity method that returns the number of
arguments they expect. For example:

06001

The notion of arity gets confusing when a Proc accepts an arbitrary
number of argu- ments in an *-prefixed final argument. When a Proc
allows optional arguments,the arity method returns a negative number
of the form -n-1. A return value of this form indicates that the Proc
requires n arguments,but it may optionally take additional arguments
as well. -n-1 is kNown as the one’s-complement of n,and you can
invert it with the ~ operator. So if arity returns a negative number
m,then ~m (or -m-1) gives you the number of required arguments:

06002

There is one final wrinkle to the arity method. In Ruby 1.8,a Proc
declared without any argument clause at all (that is,without any ||
characters) may be invoked with any number of arguments (and these
arguments are ignored). The arity method returns –1 to indicate that
there are no required arguments. This has changed in Ruby 1.9: a Proc
declared like this has an arity of 0. If it is a lambda,then it is an
error to invoke it with any arguments:

06003

编辑2:Stefan在评论增加了他们不同的确切原因:

http://www.ruby-doc.org/core-2.0/Proc.html#method-i-call

For procs created using lambda or ->() an error is generated if the wrong number of parameters are passed to a Proc with multiple parameters. For procs created using Proc.new or Kernel.proc,extra parameters are silently discarded.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


validates:conclusion,:presence=>true,:inclusion=>{:in=>[0,1]}validates:email,:presence=>true,:length=>{:minimum=>3,:maximum=>254},:uniqueness=>true,:email=>truevalidates:ending_order,
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各Master的状态,如果Master异常,则会做主从切换,将Slave作为master,将master做为slave。其配置也较复杂,且表现一般。redis3.0以后已经支持集群容错功能,并且非常简单1.1素材准备centos7(集群搭建,至少三个master。需
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow                 不知道大家是否注意到,全新安装ruby之后,无论是在windows或是linux还是macosX下使用rix
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 modify_my_object!,这个方法名是以!结尾,在ruby的对象里边是用于表达修改本身的意思。比如String#gsub,返回的是一个新的字符串对象;而String#gsub!,返回的是自身已经被修改的对象。不止!这样的特殊字符可以命名,ruby
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质。 什么是编程? 编程即程序员根据需求把自己的思想流程按照某种编程语言的语法风格编写下来,产出的结果就是包含一堆字符的文件。二编程语言分
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编程语言的特性包括:数据封装数据抽象多态性继承这些特性将在面向对象的Ruby中进行讨论。一个面向对象的程序,涉及到的类和对象。类是个别对象创建的蓝图。在面向对象的术语中,您
1.ruby的标签<ruby>漢<rp>(<p><rt>han<t><rp>)<p>字<rp>(<p><rt>zi<t><rp>)<p><uby> 
1、软件安装1.安装包是个压缩包-->解压到/homeedis_tar下命令如下: tar-zxvf./../-C/homeedis_tar2.安装c++环境yum-yinstallgcc-c++(注:redis底层源码是c++)3.解压后需要源码编译进入到redis-3.0.0后执行make4.编译完后开始安装需要指定一个安装路径
1.sass基于Ruby语言开发而成,因此安装sass前需要安装Ruby。(注:mac下自带Ruby无需在安装Ruby!)window下安装SASS首先需要安装Ruby,先从官网下载Ruby并安装。安装过程中请注意勾选AddRubyexecutablestoyourPATH添加到系统环境变量。ruby官网:https:/ubyinstaller.org/downloa
本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTfulAPI项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图。课程简介这是一门企业级项目实战课程,目的是从0使用Rails开发一个企业级RESTfulAPI项目;他不能让你年薪30