Forum: Ruby hyphens in variable names

Posted by (unknown) (Guest)
on 2006-07-07 17:51
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
Posted by Robert Klemme (Guest)
on 2006-07-07 18:14
(Received via mailing list)
2006/7/7, Paul Hepworth <paul@hepworthinc.com>:
> Example XML:
> 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
Posted by Jacob Fugal (Guest)
on 2006-07-07 18:17
(Received via mailing list)
On 7/7/06, Paul Hepworth <paul@hepworthinc.com> wrote:
>    ...
>    </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
Posted by Jacob Fugal (Guest)
on 2006-07-07 18:20
(Received via mailing list)
On 7/7/06, Robert Klemme <shortcutter@googlemail.com> wrote:
> 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
Posted by (unknown) (Guest)
on 2006-07-07 18:23
Robert Klemme wrote:
> 2006/7/7, Paul Hepworth <paul@hepworthinc.com>:
>> Example XML:
>> 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 

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!

> 
> Kind regards
> 
> robert
Posted by (unknown) (Guest)
on 2006-07-07 18:26
Jacob Fugal wrote:
> On 7/7/06, Robert Klemme <shortcutter@googlemail.com> wrote:
>> 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.

> 
> Jacob Fugal
Posted by Robert Klemme (Guest)
on 2006-07-07 18:44
(Received via mailing list)
2006/7/7, Paul Hepworth <paul@hepworthinc.com>:
> > 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
Posted by (unknown) (Guest)
on 2006-07-07 18:47
You guys are great. Thanks so much!
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.