How to pass parameters to a proc when calling it by a method?
Asked Answered
L

3

9
proc = Proc.new do |name|
  puts "Thank you #{name}!"
end
def thank
  yield
end

proc.call # output nothing, just fine
proc.call('God') # => Thank you God!

thank &proc # output nothing, too. Fine;
thank &proc('God') # Error!
thank &proc.call('God') # Error!
thank proc.call('God') # Error!
# So, what should I do if I have to pass the 'God' to the proc and use the 'thank' method at the same time ?

Thanks :)

Lopsided answered 4/8, 2010 at 15:15 Comment(0)
H
13

I think the best way is:

def thank name
  yield name if block_given?
end
Hyetography answered 4/8, 2010 at 15:36 Comment(0)
E
9
def thank(arg, &block)
  yield arg
end

proc = Proc.new do|name|
   puts "Thank you #{name}"
end

Then you can do:

thank("God", &proc)
Eristic answered 4/8, 2010 at 15:40 Comment(6)
You should add 2 spaces before each line of code in order to make it a code sample in your answer. It will look prettier and add syntax highlighting to all your lines of code.Ferminafermion
@Marc-André Lafortune: You're referring to the defining of thank, not the calling of it, right?Ratite
@Andrew: right, which is why I wrote that the , &block was not needed and not that the , &proc was (that is needed)Boris
@Marc-André: Whoops! I think I read them as the same thing because they rhyme.Ratite
right, thanks Marc-Andre for pointing it out. I was just illustrating that you pass "God" and the block as arguments to thank, rather than passing "God" as an argument to proc, and passing proc to thank as been tried in the question above.Eristic
just wondering if we can somehow get our hands on the arguments passed to that proc? in this case: inside the thank method can we access the name argument that is passed to the proc?Pier
I
3

a different way to what Nada proposed (it's the same, just different syntax):

proc = Proc.new do |name|
    puts "thank you #{name}"
end

def thank(proc_argument, name)
    proc_argument.call(name)
end

thank(proc, "for the music") #=> "thank you for the music"
thank(proc, "for the songs you're singing") #=> "thank you for the songs you're singing"

It works, but I don't like it. Nevertheless it will help readers understand HOW procs and blocks are used.

Isom answered 23/9, 2016 at 3:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.