Extending Array and assigning to self

  • Thread starter Oliver Saunders
  • Start date
O

Oliver Saunders

I've got this class that is essentially an array with a few things
added. Here's some of it:

class Pages

def initialize
@content = []
end

def import(file, page_delimiter = ' ')
@content = file.read.split page_delimiter
self
end

def [](num)
@content[num]
end

def <<(page_content)
@content << page_content
end

....

Because I'm basically reimplementing Array I thought it might me more
sense to inherit from Array or delegate to Array. The trouble is that I
need to assign to @content. How do you suggest I get round this problem?
 
Y

yermej

I've got this class that is essentially an array with a few things
added. Here's some of it:

class Pages

def initialize
@content = []
end

def import(file, page_delimiter = ' ')
@content = file.read.split page_delimiter
self
end

def [](num)
@content[num]
end

def <<(page_content)
@content << page_content
end

...

Because I'm basically reimplementing Array I thought it might me more
sense to inherit from Array or delegate to Array. The trouble is that I
need to assign to @content. How do you suggest I get round this problem?

I would just use Array's own methods. E.g.:
class Pages < Array
def import(file, page_delimiter = ' ')
self.clear
self.concat file.read.split.page_delimiter
end
end

I'm not sure if Array#concat is the best choice here (for some
definition of best), but it'll work.
 
O

Oliver Saunders

yermej said:
I would just use Array's own methods. E.g.:
class Pages < Array
def import(file, page_delimiter = ' ')
self.clear
self.concat file.read.split.page_delimiter
end
end

I'm not sure if Array#concat is the best choice here (for some
definition of best), but it'll work.

Fantastic yermej. I didn't know about that concat method.

Next point: What if I have a similar problem with strings? I'd like to
achieve this:

# is a string
x = ValueChangeString.new 'foo' #=> 'foo'
# has all the methods of string already
x.length #=> 3
# But also has methods that completely alter the string's value
# whilst remaining the same object
x.change_value! #=> 'bar'
 
D

David A. Black

Hi --

I've got this class that is essentially an array with a few things
added. Here's some of it:

class Pages

def initialize
@content = []
end

def import(file, page_delimiter = ' ')
@content = file.read.split page_delimiter
self
end

def [](num)
@content[num]
end

def <<(page_content)
@content << page_content
end

...

Because I'm basically reimplementing Array I thought it might me more
sense to inherit from Array or delegate to Array. The trouble is that I
need to assign to @content. How do you suggest I get round this problem?

I would just use Array's own methods. E.g.:
class Pages < Array
def import(file, page_delimiter = ' ')
self.clear
self.concat file.read.split.page_delimiter

That's actually a space before page_delimiter, not a dot. Or:

file.read.split(page_delimiter)

just to be sure :)
end
end

I'm not sure if Array#concat is the best choice here (for some
definition of best), but it'll work.

In general I'd use #replace rather than #clear plus #concat.


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,965
Messages
2,570,148
Members
46,710
Latest member
FredricRen

Latest Threads

Top