Beginners question about Array#assoc

Hi, I am new to Ruby and still finding it very strange even though I am
enjoying learning it immensely.

I have this code:

if an_array.assoc(tag_name) == nil
...

and of course it doesn't work because I either get an array back or a
nil object. It makes it very difficult to have a simple if statement
like the above that can handle both eventualities. I don't need the
array returned, I just need to check to see if the element exists to
take a certain action.

What is the Ruby way of doing this?

Thanks,

Chad.

···

--
Posted via http://www.ruby-forum.com/.

Alle 20:52, venerdì 8 dicembre 2006, Chad Thatcher ha scritto:

Hi, I am new to Ruby and still finding it very strange even though I am
enjoying learning it immensely.

I have this code:

if an_array.assoc(tag_name) == nil
...

and of course it doesn't work because I either get an array back or a
nil object. It makes it very difficult to have a simple if statement
like the above that can handle both eventualities. I don't need the
array returned, I just need to check to see if the element exists to
take a certain action.

What is the Ruby way of doing this?

Thanks,

Chad.

In ruby everything evaluates to true in conditionals, except false and nil.
So, you can do something like

if an_array.assoc(tag_name) #the element has been found
...
else #in this case assoc returned nil because no element was found
...
end

I hope this answeres your question.

Stefano

It might be include? (the question mark is part of the method name)

An example of include?'s usage:
irb(main):001:0> array = ["a", "b", "c"]
=> ["a", "b", "c"]
irb(main):002:0> array.include? "a"
=> true
irb(main):003:0> array.include? "z"
=> false

Chad Thatcher wrote:

···

Hi, I am new to Ruby and still finding it very strange even though I am
enjoying learning it immensely.

I have this code:

if an_array.assoc(tag_name) == nil
...

and of course it doesn't work because I either get an array back or a
nil object. It makes it very difficult to have a simple if statement
like the above that can handle both eventualities. I don't need the
array returned, I just need to check to see if the element exists to
take a certain action.

What is the Ruby way of doing this?

Thanks,

Chad.

Thanks Stefano.

···

--
Posted via http://www.ruby-forum.com/.

Actually, I am still having trouble. My code is:

res = dbh.query("SELECT tag ...blah blah")
masters = Array.new
res.each_hash do |row|
  p row["tag"]

  if masters.assoc(row["tag"])
    newMaster = { "subtags" => Array.new, "master" => 'a' }
    masters.push [row["tag"], newMaster]
  end
  .....

And here is my output:

"852"
./prep_tags_yaml_02.rb:65: undefined method `[]' for nil:NilClass
(NoMethodError)
        from ./prep_tags_yaml_02.rb:8

I tried populating the "masters" array with an init line like:

masters = [["asdf", "agf"], ["bb", "behe"]]

and it works, but this doesn't help as the array has top be empty to
begin with. Puzzling...

···

--
Posted via http://www.ruby-forum.com/.

Daniel Finnie wrote:

It might be include? (the question mark is part of the method name)

An example of include?'s usage:
irb(main):001:0> array = ["a", "b", "c"]
=> ["a", "b", "c"]
irb(main):002:0> array.include? "a"
=> true
irb(main):003:0> array.include? "z"
=> false

Thing is its an array of arrays so I need to use the assoc method.

Anyway I figured it out, the code should have read:

if !masters.assoc(row["tag"])

I was being dense and coding at a quarter to 2am on a friday night is
never an advisable thing :smiley:

···

--
Posted via http://www.ruby-forum.com/\.

Chad Thatcher wrote:

Daniel Finnie wrote:

It might be include? (the question mark is part of the method name)

An example of include?'s usage:
irb(main):001:0> array = ["a", "b", "c"]
=> ["a", "b", "c"]
irb(main):002:0> array.include? "a"
=> true
irb(main):003:0> array.include? "z"
=> false

Thing is its an array of arrays so I need to use the assoc method.

Anyway I figured it out, the code should have read:

if !masters.assoc(row["tag"])

I was being dense and coding at a quarter to 2am on a friday night is
never an advisable thing :smiley:

Or you could write

unless masters.assoc(row["tag"])

This seems to be more Rubyish practice from what I've seen.

···

--
Posted via http://www.ruby-forum.com/\.