Some quick questions

R

Ross Bamford

Hi,

I have a couple more questions. Hopefully they're not so dumb this time.

1) I need a hash that maintains insertion order. In Java, I'd use
LinkedHashMap. Does Ruby have one?

2) I like documentation. So far, Rdoc is great, but I wonder about the
following case:

class SomeClass
attr_accessor :someattr

# But I need to validate, for example, so ...
def someattr=(i)
@someattr unless i < 10
end
end

In the above case, Ruby warns about the method being redefined (and the
original being discarded). However, if I change it to attr_reader to avoid
that (i.e. manually make the reader) then RDoc lists the attribute as
read-only, with the writer shown as a normal method. This is perfectly
reasonable, but I feel there's probably a way around it.

Thanks in advance,
Ross
 
R

Ross Bamford

Hi,

I have a couple more questions. Hopefully they're not so dumb this time.

Ahh well... This is why I hate asking questions... :p

Forget this one:
1) I need a hash that maintains insertion order. In Java, I'd use
LinkedHashMap. Does Ruby have one?

Got it, in facets. I discounted the sorted hash thread as not what I want,
but I see that someone there mentions it as unsuitable for their needs :)
 
S

Steve Litt

Hi,

I have a couple more questions. Hopefully they're not so dumb this time.

1) I need a hash that maintains insertion order. In Java, I'd use
LinkedHashMap. Does Ruby have one?

I've only done Ruby for 9 days now, but from the reading I've done, no. It
would be easy enough to insert the key in an array at the same time you
insert the key=>value in a hash. You could even make a class that does it all
for you.

Perhaps there's a better way, but that's one I'm sure would work.

By the way, why do you need initial insertion order? Do you ever need to look
up by the key value? If not, why not use an array of hashes, or an array of 2
element arrays?

SteveT

Steve Litt
http://www.troubleshooters.com
(e-mail address removed)
 
J

James Edward Gray II

2) I like documentation. So far, Rdoc is great, but I wonder about
the following case:

class SomeClass
attr_accessor :someattr

# But I need to validate, for example, so ...
def someattr=(i)
@someattr unless i < 10
end
end

In the above case, Ruby warns about the method being redefined (and
the original being discarded). However, if I change it to
attr_reader to avoid that (i.e. manually make the reader) then RDoc
lists the attribute as read-only, with the writer shown as a normal
method. This is perfectly reasonable, but I feel there's probably a
way around it.

You could just define both manually.

James Edward Gray II
 
R

Ross Bamford

I've only done Ruby for 9 days now, but from the reading I've done, no. It
would be easy enough to insert the key in an array at the same time you
insert the key=>value in a hash. You could even make a class that does it all
for you.

(I'm a relative newbie too :) And just loving Ruby more and more!)

I think I found something in facets that does the trick, but I've not
gotten to looking at it yet so I'm not certain. But anyway, I think a
variant of your suggestion is more suitable.
Perhaps there's a better way, but that's one I'm sure would work.

By the way, why do you need initial insertion order? Do you ever need to look
up by the key value? If not, why not use an array of hashes, or an array of 2
element arrays?

The idea was to make a Hash that accepted Regex keys, but allowed you to
look for them by a string, using backrefs in the value:

class RxHash < Hash
def [](key)
md = nil
if v = self.detect { |k,v| md = /^#{k}$/.match(key) }
v[1].gsub(/\$(\d)/) { md[$1.to_i] }
end
end
end

You can then have mappings like /123([a-z]+)/ => '321$1'. It was for
mapping file extensions. It works, but if there are multiple matches you
get one pretty much at random.

Thinking more on it, though, I see that the Hash is probably leading me
down the wrong path anyway, it's better done with arrays as you suggest.
I think I can have an array of two element arrays and use 'map' for easy
access.

Thanks for the reply,
Ross
 
R

Ross Bamford

Yes, I suppose at least they're together in the doc then :)

I just hoped I might be able to get them shown in the 'attributes'
table, with their access listed and so on ( [RW] or whatever).

Thanks for the reply :)
 
J

James Britt

Mark said:
Don't use attr_accessor, then. attr_accessor doesn't do any magic; it's
just a shorthand that defines default accessor methods.
This line:

attr_accessor :foo

has identical results to this code:

def foo
@foo
end

def foo=(new_foo)
@foo = new_foo
end

Almost. The rdoc output is different. Using attr_accessor, rdoc does
not document 'foo' as being a method, but as being an attribute.

Unless you both use attr_accessor *and* define method bodies. Then
rdoc does both; foo is documented as both an attribute and a method.

James
--

http://www.ruby-doc.org - Ruby Help & Documentation
http://www.artima.com/rubycs/ - Ruby Code & Style: Writers wanted
http://www.rubystuff.com - The Ruby Store for Ruby Stuff
http://www.jamesbritt.com - Playing with Better Toys
http://www.30secondrule.com - Building Better Tools
 

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

Members online

Forum statistics

Threads
474,200
Messages
2,571,046
Members
47,646
Latest member
xayaci5906

Latest Threads

Top