[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

"nested" methods

Stefan Buhr

7/27/2008 2:03:00 PM

Hi there,

I want to do this:

@myclass.items[5] = an_item

But the items object of @myclass should have an custom setter. I have
tried this:
class Myclass
def items
def []= value
-code-
end
end
end

but this does not work. How can i do that?

cheers,
buhrmi
--
Posted via http://www.ruby-....

5 Answers

matu

7/27/2008 2:44:00 PM

0

Stefan Buhr wrote:

> Hi there,
>
> I want to do this:
>
> @myclass.items[5] = an_item
>
> But the items object of @myclass should have an custom setter. I have
> tried this:
> class Myclass
> def items
> def []= value
> -code-
> end
> end
> end
>
> but this does not work. How can i do that?
>

class MyArray < Array
def []= index, value
super
p 'hi'
end
end

class Myclass
attr_accessor :items
end

m = Myclass.new
m.items = MyArray.new
m.items[5] = "blah"

Robert Klemme

7/27/2008 2:55:00 PM

0

On 27.07.2008 16:02, Stefan Buhr wrote:
> I want to do this:
>
> @myclass.items[5] = an_item
>
> But the items object of @myclass should have an custom setter. I have
> tried this:
> class Myclass
> def items
> def []= value
> -code-
> end
> end
> end
>
> but this does not work.

Your nested method is defined for Myclass. Basically something like
nested methods does not exist in Ruby. The only difference is the point
in time when the nested method will be defined (after the other method
has been executed):

$ irb
irb(main):001:0> class M
irb(main):002:1> def x
irb(main):003:2> def y; 9; end
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> m=M.new
=> #<M:0x7ff8a1e0>
irb(main):007:0> m.y
NoMethodError: undefined method `y' for #<M:0x7ff8a1e0>
from (irb):7
irb(main):008:0> m.x
=> nil
irb(main):009:0> m.y
=> 9
irb(main):010:0> m=M.new
=> #<M:0x7ff7888c>
irb(main):011:0> m.y
=> 9
irb(main):012:0>


> How can i do that?

class Myclass
def items
@items ||= []
end
end

Now you have a member of type Array in Myclass and can use its method []=.

You can as well do this

class Myclass
class Items
def []= idx, val
# whatever
end
end

def items
@items ||= Items.new
end
end

Kind regards

robert

Stefan Buhr

7/27/2008 2:59:00 PM

0

oh... ok

thanks

i hoped there would be a way without an new explicit class
--
Posted via http://www.ruby-....

Sebastian Hungerecker

7/27/2008 3:17:00 PM

0

Stefan Buhr wrote:
> i hoped there would be a way without an new explicit class

There is:
class Myclass
def items
Object.new.instance_eval do
def []= index, value
-code-
end
self
end
end
end
But using an "explicit class" is clearer.

HTH,
Sebastian
--
Jabber: sepp2k@jabber.org
ICQ: 205544826

Stefan Buhr

7/27/2008 3:28:00 PM

0

Thank you very much that helped me alot.
--
Posted via http://www.ruby-....