rpardee / gmail.com wrote:
> Hey all,
>
> Kind of an idle, syntax comparison question here...
>
> In python, you can apparently pass method references around very
> easily.  So imagine you have these 2 functions defined:
>
>    def firstWay(arg1, arg2)
>       return 'Tastes great.'
>
>    def secondWay(arg1, arg2)
>       return 'Less filling.'
>
> Then you can define a method that takes a method name as an argument,
> and calls it just by throwing parens (and any expected arguments of
> course) after it.
>
>    def doStuff(whichway, first_arg, second_arg)
>       return whichway(first_arg, second_arg)
>
> So calling:
>
>    puts doStuff(firstWay, None, None)
>
> Would result in 'Tastes great.'
>
> What's the most graceful way to do this sort of thing in ruby?  I
> tried passing in e.g., firstWay.to_proc, but that got me a complaint
> about not having enough arguments on the call.  I can imagine doing,
> e.g.,
>
>    first_pointer = Proc.new do |foo, bar|
>       return firstWay(foo, bar)
>    end
>
> One for each alternate method & passing one of those in.  I can also
> imagine having doStuff take a block that would call the desired
> function & yielding out to that.  But neither of those are as pretty
> as the python I think.  Are those my best options in ruby, or is there
> another way?
>
> Thanks!
>
> -Roy
>
>   

Here is another way:

irb(main):001:0> def dostuff(whichway, arg1, arg2)
irb(main):002:1>   send(whichway, arg1, arg2)
irb(main):003:1> end
=> nil
irb(main):004:0> def first_way(arg1, arg2)
irb(main):005:1>   "tastes great"
irb(main):006:1> end
=> nil
irb(main):007:0> def second_way(arg1, arg2)
irb(main):008:1>   "less filling"
irb(main):009:1> end
=> nil
irb(main):010:0> dostuff(:first_way, nil, nil)
=> "tastes great"
irb(main):011:0> dostuff(:second_way, nil, nil)
=> "less filling"
irb(main):012:0> "No! #{dostuff(:first_way, nil, nil).capitalize}!"
=> "No! Tastes great!"


-Justin