# A more elegant way to do this?

**URL:** <https://www.ruby-forum.com/t/a-more-elegant-way-to-do-this/60211>\
**Category:** Ruby\
**Created:** [May 11, 2006, 6:33am UTC](https://www.ruby-forum.com/t/a-more-elegant-way-to-do-this/60211 "2006-05-11T06:33:34Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tim\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/90db22/32.png) [@Tim\_U](https://www.ruby-forum.com/u/Tim_U)\
**Post date:** [May 11, 2006, 6:33am UTC](https://www.ruby-forum.com/t/a-more-elegant-way-to-do-this/60211/1 "2006-05-11T06:33:34Z")

</div>

Can anybody suggest a more elegant and rubyish way to do this?

I am reading a YAML file and then trying to iterate over arrays and  
hashes that may or may not be there.

unless conf[‘hosts’][hostname][‘groups’].nil?  
conf[‘hosts’][hostname][‘groups’].each { |group|  
unless conf[‘crontables’][group].nil?  
conf[‘crontables’][group].each { | tab\_item|  
tab\_entries \<\< tab\_item  
}  
end #Unless  
}  
end #unless

---

<div class="post-metadata">

**Author:** ![Tim\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/90db22/32.png) [@Tim\_U](https://www.ruby-forum.com/u/Tim_U)\
**Post date:** [May 11, 2006, 6:54am UTC](https://www.ruby-forum.com/t/a-more-elegant-way-to-do-this/60211/2 "2006-05-11T06:54:59Z")

</div>

On Thu, 11 May 2006, Tim U. wrote:

> ```
> }
> end #Unless
> 
> ```
> 
> }  
> end #unless

array = lambda{|x| x || []}

array[conf[‘hosts’][hostname][‘groups’]].each {|group|  
array[conf[‘crontables’][group]].each {|tab\_item|  
tab\_entries \<\< tab\_item  
}  
}

hth.

-a

---

<div class="post-metadata">

**Author:** ![Tim\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/90db22/32.png) [@Tim\_U](https://www.ruby-forum.com/u/Tim_U)\
**Post date:** [May 12, 2006, 8:53am UTC](https://www.ruby-forum.com/t/a-more-elegant-way-to-do-this/60211/3 "2006-05-12T08:53:51Z")

</div>

Tim U. wrote:

> ```
> }
> end #Unless
> 
> ```
> 
> }  
> end #unless

A slight variation on the other suggestions:

def each\_element\_of(enum)  
enum and enum.each {|elt| yield elt}  
end

each\_element\_of conf[‘hosts’][hostname][‘groups’] do |group|  
each\_element\_of conf[‘crontables’][group] do |tab\_item|  
tab\_entries \<\< tab\_item  
end  
end

Another slight variation:

conf[‘hosts’][hostname][‘groups’].to\_a.each do |group|  
conf[‘crontables’][group].to\_a.each do | tab\_item|  
tab\_entries \<\< tab\_item  
end  
end

---

<div class="post-metadata">

**Author:** ![Tim\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/90db22/32.png) [@Tim\_U](https://www.ruby-forum.com/u/Tim_U)\
**Post date:** [May 12, 2006, 12:49pm UTC](https://www.ruby-forum.com/t/a-more-elegant-way-to-do-this/60211/4 "2006-05-12T12:49:06Z")

</div>

Tim U. wrote:

> ```
> conf['crontables'][group].each { | tab_item|
> tab_entries << tab_item
> }
> 
> ```

A small suggestion for the above if tab\_entries is an array:

tab\_entries.concat(conf[‘crontables’][group])

---

<div class="post-metadata">

**Author:** ![Tim\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/90db22/32.png) [@Tim\_U](https://www.ruby-forum.com/u/Tim_U)\
**Post date:** [May 12, 2006, 3:45pm UTC](https://www.ruby-forum.com/t/a-more-elegant-way-to-do-this/60211/5 "2006-05-12T15:45:43Z")

</div>

On 5/11/06, Tim U. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> }
> end #Unless
> }
> 
> ```
> 
> end #unless

nil.to\_a # =\> []

conf[‘hosts’][hostname][‘groups’].to\_a.each do |group|  
conf[‘crontables’][group].to\_a.each do |tab\_item|  
tab\_entries \<\< tab\_item  
end  
end
