Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > define_method vs eval "def ..."

Reply
Thread Tools

define_method vs eval "def ..."

 
 
Tomasz Wegrzanowski
Guest
Posts: n/a
 
      08-03-2006
Hello,

Just wondering, with eval "def ..." I can do:
eval "def #{tag}(*args, &blk) xml(:#{tag}, *args, &blk) end"

Of course it would be nicer to do:
define_method(tag) {|*args,&blk|, xml(tag, *args, &blk) }
But that throws a parse error.

Is there some way to define method that takes a block argument
without calling eval ?

--
Tomasz Wegrzanowski [ http://t-a-w.blogspot.com/ ]

 
Reply With Quote
 
 
 
 
Logan Capaldo
Guest
Posts: n/a
 
      08-03-2006

On Aug 3, 2006, at 9:45 AM, Tomasz Wegrzanowski wrote:

> Hello,
>
> Just wondering, with eval "def ..." I can do:
> eval "def #{tag}(*args, &blk) xml(:#{tag}, *args, &blk) end"
>
> Of course it would be nicer to do:
> define_method(tag) {|*args,&blk|, xml(tag, *args, &blk) }
> But that throws a parse error.
>
> Is there some way to define method that takes a block argument
> without calling eval ?
>

Ruby 1.9 lets blocks take blocks like define_method(:meth) { |*args,
&blk| ... }

Currently theres no way to do it in 1.8 AFAIK.

> --
> Tomasz Wegrzanowski [ http://t-a-w.blogspot.com/ ]
>



 
Reply With Quote
 
 
 
 
nobu@ruby-lang.org
Guest
Posts: n/a
 
      08-03-2006
Hi,

At Thu, 3 Aug 2006 22:45:40 +0900,
Tomasz Wegrzanowski wrote in [ruby-talk:205997]:
> Is there some way to define method that takes a block argument
> without calling eval ?


Using 1.9.

--
Nobu Nakada

 
Reply With Quote
 
Tammo Freese
Guest
Posts: n/a
 
      08-03-2006

Robert Dober wrote:
[...]
> and it seems to make it into Ruby2 since June
> http://pub.cozmixng.org/~the-rwiki/?
> cmd=view;name=Ruby2.0BlockParameterAndMultipleValu eAssignment
> which I consider extremly good news



I am suprised that the blocks will work in such a way.
How do these play together with the new define_method ?

Examples from
http://pub.cozmixng.org/~the-rwiki/?
cmd=view;name=Ruby2.0BlockParameterAndMultipleValu eAssignment
:

- Proc.new{|x| x}.call(0,1) returns 0.
- Proc.new{|x,y| [x,y]}.call(0) returns [0,nil].

So missing arguments seem to be set to nil, and additional arguments
seem to be ignored. What would happen for this code fragment:

proc_one = Proc.new{|x| x}
proc_two = Proc.new{|x,y| [x,y]}

define_method(:meth_one) &proc_one
define_method(:meth_two) &proc_two

p proc_one.call(0,1) # returns 0 according to the web page
p proc_two.call(1) # returns 1,nil according to the web page

p meth_one(0,1) # ???
p meth_two(1) # ???

Would the last two work and return the same result as the direct proc
calls?
If so, how would we define a method via define_method that takes a
fixed number of parameters?
If not, where does the magic happen that while the proc accepts the
arguments,
the method defined by the proc does not?



Thanks for your help,

Tammo




 
Reply With Quote
 
Rick DeNatale
Guest
Posts: n/a
 
      08-04-2006
On 8/3/06, Tammo Freese <(E-Mail Removed)> wrote:
>
> Robert Dober wrote:
> [...]
> > and it seems to make it into Ruby2 since June
> > http://pub.cozmixng.org/~the-rwiki/?
> > cmd=view;name=Ruby2.0BlockParameterAndMultipleValu eAssignment
> > which I consider extremly good news

>
>
> I am suprised that the blocks will work in such a way.
> How do these play together with the new define_method ?
>
> Examples from
> http://pub.cozmixng.org/~the-rwiki/?
> cmd=view;name=Ruby2.0BlockParameterAndMultipleValu eAssignment
> :
>
> - Proc.new{|x| x}.call(0,1) returns 0.
> - Proc.new{|x,y| [x,y]}.call(0) returns [0,nil].
>
> So missing arguments seem to be set to nil, and additional arguments
> seem to be ignored. What would happen for this code fragment:


That first example is a change from 1.8

Proc.new {|x| x}.call(0,1)
(irb):58: warning: multiple values for a block parameter (2 for 1)
from (irb):58
=> [0, 1]

I'm not sure that I like this change.


--
Rick DeNatale

IPMS/USA Region 12 Coordinator
http://ipmsr12.denhaven2.com/

Visit the Project Mercury Wiki Site
http://www.mercuryspacecraft.com/

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
eval('07') works, eval('08') fails, why? Alex van der Spek Python 6 01-08-2009 08:24 PM
Different behavior between eval "07" and eval "08" Liang Wang Perl Misc 8 02-02-2008 08:31 PM
eval, module_eval, define_method, and all that Greg Weeks Ruby 3 11-19-2007 12:22 AM
DataBinder.Eval and Eval. craigkenisston@hotmail.com ASP .Net 1 06-16-2006 05:33 PM
DataBinder.Eval for an object's property property... like Eval(Container.DataItem,"Version.Major") Eric Newton ASP .Net 3 04-04-2005 10:11 PM



Advertisments