Forum: Ruby define_method with default parameters

B3086d7340aeba221e30ce8679eab3f3?d=identicon&s=25 Emmanuel Oga (emmanueloga)
on 2007-08-09 18:40
how can i use define_method to assign default parameters?

I want to do this:

a_helper_module.module_eval do

  define_method(:method_name) do |parameter, parameter2= "default"|
    puts parameter
    puts parameter2
  end

end

But parameter2= "default" is not a valid!

Thanks!
Ec07fbda510a142f5331ffd903b07820?d=identicon&s=25 Gordon Thiesfeld (Guest)
on 2007-08-09 19:21
(Received via mailing list)
On Aug 9, 11:40 am, Emmanuel Oga <oga_emmanuel_...@yahoo.com.ar>
wrote:
> how can i use define_method to assign default parameters?
>

Not sure if this is the most elegant way, but:

  define_method(:method_name) do |*args|
    parameter, parameter2 = *args
    parameter2 ||= 'default'
    puts parameter
    puts parameter2
  end
B3086d7340aeba221e30ce8679eab3f3?d=identicon&s=25 Emmanuel Oga (emmanueloga)
on 2007-08-09 20:13
mmmm better than my method! :) :

        eval <<-EOMETHDEF
        def method_name parameter, parameter2= 'default'
          puts parameter
          puts parameter2
        end
        EOMETHDEF

 thanks.

Gordon Thiesfeld wrote:
> On Aug 9, 11:40 am, Emmanuel Oga <oga_emmanuel_...@yahoo.com.ar>
> wrote:
>> how can i use define_method to assign default parameters?
>>
>
> Not sure if this is the most elegant way, but:
>
>   define_method(:method_name) do |*args|
>     parameter, parameter2 = *args
>     parameter2 ||= 'default'
>     puts parameter
>     puts parameter2
>   end
8f198eee78af8fee4e57ef7af7d583ae?d=identicon&s=25 Tom Werner (Guest)
on 2007-08-09 20:38
(Received via mailing list)
Gordon Thiesfeld wrote:
>     parameter, parameter2 = *args
>     parameter2 ||= 'default'
>     puts parameter
>     puts parameter2
>   end
>
>
>


Has the addition of block argument defaults to the language been
considered? There are a number of places (especially in define_method,
Proc.new, and lambda) where it would come in handy. The syntax would of
course be:

def foo
  yield 'from method'
end

foo do |x, y = 'from default'|
  puts x
  puts y
end

Which would output:

from method
from default

I've seen this come up enough that its addition would seem welcome. Are
there arguments against it?

Tom
4d60ea85b83de9f19821ecdfa8689219?d=identicon&s=25 Konrad Meyer (Guest)
on 2007-08-09 20:47
(Received via mailing list)
Attachment: signature.asc (190 Bytes)
On Thursday 09 August 2007 11:38:06 am Tom Werner wrote:
> >   define_method(:method_name) do |*args|
> Has the addition of block argument defaults to the language been
>   puts y
> Tom
I believe this has come up *lots*. IIRC, the current response is that
such
block defaults are not possible with the lexical parser / grammar ruby
currently uses.
F53b05cdbdf561cfe141f69b421244f3?d=identicon&s=25 unknown (Guest)
on 2007-08-09 21:01
(Received via mailing list)
Hi --

On Fri, 10 Aug 2007, Tom Werner wrote:

>>   define_method(:method_name) do |*args|
> Has the addition of block argument defaults to the language been considered?
Yes, quite often :-)

> end
>
> Which would output:
>
> from method
> from default
>
> I've seen this come up enough that its addition would seem welcome. Are there
> arguments against it?

The problem is with something like:

   m do |a, b = 1 | 2 | 3; end

you can't tell which | is doing what.


David
8f198eee78af8fee4e57ef7af7d583ae?d=identicon&s=25 Tom Werner (Guest)
on 2007-08-09 22:03
(Received via mailing list)
dblack@rubypal.com wrote:
>>>>
>>>
>>
>>
> you can't tell which | is doing what.
>
>
> David
>

That's never stopped Ruby from doing other things on a single line.
Single line 'if' statements need a 'then' or a semicolon (being syntax
errors otherwise).

if x | y; 'foo'; end

Or consider the following single line:

x = 10 - 5 - 2

Perfectly valid, but wait! What I really meant was:

x = 10 - 5; -2

The onus is on the programmer to write code that works in the face of
possibly ambiguous syntax.

Simply require a semicolon in your example case and there's no more
problem:

m do |a, b = 1|; 2 | 3; end

or

m do |a, b = 1 | 2|; 3; end

Just because a certain functionality *might* produce ambiguous code
seems a poor reason to exclude it from consideration!

Tom
1bac2e65d64faf472cf2ebc94f0f5ee0?d=identicon&s=25 ara.t.howard (Guest)
on 2007-08-09 22:08
(Received via mailing list)
On Aug 9, 2007, at 11:20 AM, Gordon Thiesfeld wrote:

>
>

i prefer

   define_method 'method_name' do |required, *optional|
     one, two, *ignored = *optional
   end

because you an error will be thrown if required is not passed and you
don't risk slurping ten arguments into 'two'

alternatively just use a hash

   define_method 'method_name' do |required, *options|
     options = options.first || Hash.new
     foobar = options[:foobar]
   end

   method_name 'required'
   method_name 'required', :foobar => 42

kind regards.

a @ http://drawohara.com/
F53b05cdbdf561cfe141f69b421244f3?d=identicon&s=25 unknown (Guest)
on 2007-08-09 22:44
(Received via mailing list)
Hi --

On Fri, 10 Aug 2007, ara.t.howard wrote:

>>    puts parameter2
>
> because you an error will be thrown if required is not passed and you don't
> risk slurping ten arguments into 'two'

You can do that just with the comma:

   one, two, = *optional


David
1bac2e65d64faf472cf2ebc94f0f5ee0?d=identicon&s=25 ara.t.howard (Guest)
on 2007-08-09 23:29
(Received via mailing list)
On Aug 9, 2007, at 2:42 PM, dblack@rubypal.com wrote:

>   one, two, = *optional

i used to use that, but people 'correct it' to

   one, two = *optional

and lo it works so long as there are two, then, when there are three
it blows up so i've take to 'doccumenting' it with '*ignored'

paranoid i guess ;-)

a @ http://drawohara.com/
F53b05cdbdf561cfe141f69b421244f3?d=identicon&s=25 unknown (Guest)
on 2007-08-09 23:43
(Received via mailing list)
Hi --

On Fri, 10 Aug 2007, ara.t.howard wrote:

> up so i've take to 'doccumenting' it with '*ignored'
>
> paranoid i guess ;-)

Or maybe I'm too sanguine :-)


David
E0526a6bf302e77598ef142d91bdd31c?d=identicon&s=25 Daniel DeLorme (Guest)
on 2007-08-10 01:22
(Received via mailing list)
Emmanuel Oga wrote:
> how can i use define_method to assign default parameters?
>
> I want to do this:
>
> a_helper_module.module_eval do
>   define_method(:method_name) do |parameter, parameter2= "default"|
>     puts parameter
>     puts parameter2
>   end
> end

Why don't you just use the regular "def"? Am I missing something?

Daniel
F53b05cdbdf561cfe141f69b421244f3?d=identicon&s=25 unknown (Guest)
on 2007-08-10 01:56
(Received via mailing list)
Hi --

On Fri, 10 Aug 2007, Daniel DeLorme wrote:

>> end
>
> Why don't you just use the regular "def"? Am I missing something?

In this particular example you could, but the issue of defaults for
block parameters is still a real one, for #define_method and other
cases.


David
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.