__call__ equivalent?

C

Charles Mills

Does Ruby have an equivalent of Python's __call__ method?

Not sure what Python's __call__ does, but ...

meth.call(args, ...) => obj
meth[args, ...] => obj


Invokes the meth with the specified arguments, returning the method’s
return value.
m = 12.method("+")
m.call(3) #=> 15
m.call(20) #=> 32

---------

prc.call(params,...) => obj
prc[params,...] => obj


Invokes the block, setting the block’s parameters to the values in
params using something close to method calling semantics. Generates a
warning if multiple values are passed to a proc that expects just one
(previously this silently converted the parameters to an array).

For procs created using Kernel.proc, generates an error if the wrong
number of parameters are passed to a proc with multiple parameters. For
procs created using Proc.new, extra parameters are silently discarded.

Returns the value of the last expression evaluated in the block. See
also Proc#yield.
a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}
a_proc.call(9, 1, 2, 3) #=> [9, 18, 27]
a_proc[9, 1, 2, 3] #=> [9, 18, 27]
a_proc = Proc.new {|a,b| a}
a_proc.call(1,2,3)


produces:
prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError)
from prog.rb:4:in `call'
from prog.rb:5
 
C

Charles Mills

Forgot to mention:
2.send '+', 3 #=> 5

Not sure what Python's __call__ does, but ...

meth.call(args, ...) => obj
meth[args, ...] => obj


Invokes the meth with the specified arguments, returning the method’s
return value.
m = 12.method("+")
m.call(3) #=> 15
m.call(20) #=> 32

---------

prc.call(params,...) => obj
prc[params,...] => obj


Invokes the block, setting the block’s parameters to the values in
params using something close to method calling semantics. Generates a
warning if multiple values are passed to a proc that expects just one
(previously this silently converted the parameters to an array).

For procs created using Kernel.proc, generates an error if the wrong
number of parameters are passed to a proc with multiple parameters.
For procs created using Proc.new, extra parameters are silently
discarded.

Returns the value of the last expression evaluated in the block. See
also Proc#yield.
a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}
a_proc.call(9, 1, 2, 3) #=> [9, 18, 27]
a_proc[9, 1, 2, 3] #=> [9, 18, 27]
a_proc = Proc.new {|a,b| a}
a_proc.call(1,2,3)


produces:
prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError)
from prog.rb:4:in `call'
from prog.rb:5
 
J

Jim Weirich

Kevin Howe said:
Does Ruby have an equivalent of Python's __call__ method?

Yes and no.

If you are asking: Can you define a call operator in a class so that
instances of that can pretend to be called with a function-like syntax?

Then the answer is no. Mainly because there is no "call" operator in Ruby.

If you are asking: Can you define objects that act like functions (ie.
functors).

Then then answer is yes. Proc and Continuations are objects that act like
functions. To call them, you send them a "call" message with the
appropriate arguments. To define your own callable object, just implement
the "call" method. Also the "[]" operator is often an alias for call.
 
K

Kevin Howe

If you are asking: Can you define a call operator in a class so that
instances of that can pretend to be called with a function-like syntax?
Then the answer is no. Mainly because there is no "call" operator in
Ruby.

That was what I was looking for, thanks!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top