[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

define_method with default parameters

Emmanuel Oga

8/9/2007 4:41:00 PM

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!
--
Posted via http://www.ruby-....

12 Answers

Gordon Thiesfeld

8/9/2007 5:16:00 PM

0

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


Emmanuel Oga

8/9/2007 6:13:00 PM

0

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

--
Posted via http://www.ruby-....

Tom Werner

8/9/2007 6:38:00 PM

0

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
>
>
>


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

Konrad Meyer

8/9/2007 6:47:00 PM

0

On Thursday 09 August 2007 11:38:06 am Tom Werner wrote:
> 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
> >
> >
> >
>
>
> 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

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.

--
Konrad Meyer <konrad@tylerc.org> http://konrad.sobertil...

David A. Black

8/9/2007 7:00:00 PM

0

Tom Werner

8/9/2007 8:03:00 PM

0

dblack@rubypal.com wrote:
> Hi --
>
> On Fri, 10 Aug 2007, Tom Werner wrote:
>
>> 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
>>>
>>>
>>>
>>
>>
>> Has the addition of block argument defaults to the language been
>> considered?
>
> Yes, quite often :-)
>
>> 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?
>
> The problem is with something like:
>
> m do |a, b = 1 | 2 | 3; end
>
> 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

ara.t.howard

8/9/2007 8:08:00 PM

0


On Aug 9, 2007, at 11:20 AM, Gordon Thiesfeld wrote:

>
> 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
>
>
>

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://draw...
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama




David A. Black

8/9/2007 8:43:00 PM

0

ara.t.howard

8/9/2007 9:28:00 PM

0


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://draw...
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama




David A. Black

8/9/2007 9:42:00 PM

0