Returns true
for a Proc object for
which argument handling is rigid. Such procs are typically generated by
lambda
.
A Proc object generated by proc
ignores extra arguments.
1 | proc {|a,b| [a,b] }.call( 1 , 2 , 3 ) #=> [1,2] |
It provides nil
for missing arguments.
1 | proc {|a,b| [a,b] }.call( 1 ) #=> [1,nil] |
It expands a single array argument.
1 | proc {|a,b| [a,b] }.call([ 1 , 2 ]) #=> [1,2] |
A Proc object generated by lambda
doesn't have such tricks.
1 2 3 | lambda {|a,b| [a,b] }.call( 1 , 2 , 3 ) #=> ArgumentError lambda {|a,b| [a,b] }.call( 1 ) #=> ArgumentError lambda {|a,b| [a,b] }.call([ 1 , 2 ]) #=> ArgumentError |
#lambda? is a predicate for the
tricks. It returns true
if no tricks apply.
1 2 | lambda {}.lambda? #=> true proc {}.lambda? #=> false |
::new is the same as
proc
.
1 | Proc . new {}.lambda? #=> false |
lambda
, proc
and ::new preserve the tricks of a Proc object given by &
argument.
1 2 3 4 5 6 7 | lambda(&lambda {}).lambda? #=> true proc(&lambda {}).lambda? #=> true Proc . new (&lambda {}).lambda? #=> true lambda(&proc {}).lambda? #=> false proc(&proc {}).lambda? #=> false Proc . new (&proc {}).lambda? #=> false |
A Proc object generated by &
argument has the tricks
1 2 | def n(&b) b.lambda? end n {} #=> false |
The &
argument preserves the tricks if a Proc object is given by &
argument.
1 2 3 | n(&lambda {}) #=> true n(&proc {}) #=> false n(& Proc . new {}) #=> false |
A Proc object converted from a method has no tricks.
1 2 3 4 5 | def m() end method( :m ).to_proc.lambda? #=> true n(&method( :m )) #=> true n(&method( :m ).to_proc) #=> true |
define_method
is treated the same as method definition. The
defined method has no tricks.
1 2 3 4 5 | class C define_method ( :d ) {} end C . new .d( 1 , 2 ) #=> ArgumentError C . new .method( :d ).to_proc.lambda? #=> true |
define_method
always defines a method without the tricks, even
if a non-lambda Proc object is given. This is the
only exception for which the tricks are not preserved.
1 2 3 4 5 | class C define_method ( :e , &proc {}) end C . new .e( 1 , 2 ) #=> ArgumentError C . new .method( :e ).to_proc.lambda? #=> true |
This exception insures that methods never have tricks and makes it easy to have wrappers to define methods that behave as usual.
1 2 3 4 5 6 7 8 | class C def self .def2(name, &body) define_method (name, &body) end def2( :f ) {} end C . new .f( 1 , 2 ) #=> ArgumentError |
The wrapper def2 defines a method which has no tricks.
Please login to continue.