hyphens in variable names

P

Paul Hepworth

Hello,

I am new to Ruby and have an issue with a xmlsimple object resulting
from a 3rd party webservice.

The xml has nodes that have hyphens (-) in the names. When I try to
access various hashes using the object variables I get errors telling
that the variable doesn't exists. I realize that the ruby syntax doesnot
like hyphens in variable names, how do I get around this?

Example XML:

<object>
<tree-lists>
<tree-list>
...
</tree-list>
...
</tree-lists>
</object>

Example Ruby :

for tlist in object.tree-lists
...
end

Error would be:

NoMethodError in TreeController#importproject
undefined method `tree' for #<TreeLib::Record:0x39171e8>


Thanks in advance.
Paul
 
R

Robert Klemme

2006/7/7 said:
Hello,

I am new to Ruby and have an issue with a xmlsimple object resulting
from a 3rd party webservice.

The xml has nodes that have hyphens (-) in the names. When I try to
access various hashes using the object variables I get errors telling
that the variable doesn't exists. I realize that the ruby syntax doesnot
like hyphens in variable names, how do I get around this?

Example XML:

<object>
<tree-lists>
<tree-list>
...
</tree-list>
...
</tree-lists>
</object>

Example Ruby :

for tlist in object.tree-lists
...
end

Error would be:

NoMethodError in TreeController#importproject
undefined method `tree' for #<TreeLib::Record:0x39171e8>

Either use method send or use another tool to work with XML or use
another way to access objects (if this lib provides one, maybe
object["tee-list"] or object[:tree-list]).

Kind regards

robert
 
J

Jacob Fugal

I am new to Ruby and have an issue with a xmlsimple object resulting
from a 3rd party webservice.

The xml has nodes that have hyphens (-) in the names...

Example XML:

<object>
<tree-lists>
<tree-list>
...
</tree-list>
...
</tree-lists>
</object>

Example Ruby :

for tlist in object.tree-lists
...
end

I'm not certain how xmlsimple works, but I assume it's dynamically
generating methods (or using method_missing) to map methods as
pseudo-properties onto the XML elements. If so, this *might* work:

for tlist in object.send:)'tree-lists')
...
end

Ruby doesn't like you having methods with hyphens in the name
*syntactically*, but semantically, there's nothing wrong with it. You
can create methods with hyphenated names using define_method, just not
def. And you can call methods with hyphenated names using send, just
not the standard dot syntax. It is of course discouraged, being highly
ugly, but it is *possible*. :)

Jacob Fugal
 
J

Jacob Fugal

Either use method send or use another tool to work with XML or use
another way to access objects (if this lib provides one, maybe
object["tee-list"] or object[:tree-list]).

I agree with Robert that if the lib provides hash-style access, that's
probably a cleaner way to go. Note, though, that if the hash needs a
symbol rather than a string, it will need to use quotes also, as I did
in my other post:

object[:'tree-list']

Omitting the quotes would give a syntax error:

$ irb
hash = {} => {}
hash[:tree-list]
NameError: undefined local variable or method `list' for main:Object

Jacob Fugal
 
P

Paul Hepworth

Robert said:
Either use method send or use another tool to work with XML

Are you referring to something like:
object.send('tree-list')

I did a quick search, but have not tried it yet.
or use
another way to access objects (if this lib provides one, maybe
object["tee-list"] or object[:tree-list]).

The tree-lists and tree-list are both hashes, but for some reason I
still get exceptions. I will keep playing with it. Surely I am not the
only one that has run into this problem.

Thanks for your help!
 
P

Paul Hepworth

Jacob said:
Either use method send or use another tool to work with XML or use
another way to access objects (if this lib provides one, maybe
object["tee-list"] or object[:tree-list]).

I agree with Robert that if the lib provides hash-style access, that's
probably a cleaner way to go. Note, though, that if the hash needs a
symbol rather than a string, it will need to use quotes also, as I did
in my other post:

object[:'tree-list']

Now that makes sense. I never tried it like this. Wow, what an insight.
:)
Omitting the quotes would give a syntax error:

$ irb
hash = {} => {}
hash[:tree-list]
NameError: undefined local variable or method `list' for main:Object

That is the error that I saw all too often.
 
R

Robert Klemme

2006/7/7 said:
Omitting the quotes would give a syntax error:

$ irb
hash = {} => {}
hash[:tree-list]
NameError: undefined local variable or method `list' for main:Object

That is the error that I saw all too often.

Yeah, that's caused by Ruby parsing ":foo" "-" "bar". Sorry, I should
have used the proper syntax, Jacob is right of course, you need
:"foo-bar" or :'foo-bar'. So the list of options now looks like this

object.send "foo-bar"
object.send :"foo-bar"
object["foo-bar"]
object[:"foo-bar"]

Plus same methods with double quotes replaced by single quotes.

robert
 

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
473,982
Messages
2,570,189
Members
46,735
Latest member
HikmatRamazanov

Latest Threads

Top