How would I do something like below?
[ 'foo' ['bar', 'baz'], [ 'one', ['two', 'three'] ] ].each { |word| puts word } # I want this to return: foo bar baz one two three Could you use flatten?
[ 'foo' ['bar', 'baz'], [ 'one', ['two', 'three'] ] ].flatten.each { |word| puts word } flatten will return a copy of the array, so the original won't be modified.
It's also fully recursive so it doesn't matter how many arrays-within-arrays you have.
a = [...] ; puts a.flatten can, if desired, replace the each loop.If you don't want to flatten the array and still achieve the desired functionality, you can do something like:
irb(main):016:0> array = [1, [2, 3], [4, [5, 6]]] => [1, [2, 3], [4, [5, 6]]] irb(main):017:0> (traverser = lambda { |list| list.respond_to?(:each) ? list.each(&traverser) : puts(list) })[array] 1 2 3 4 5 6 => [1, [2, 3], [4, [5, 6]]] Y([1, [2, 3], [4, [5, 6]]]) { |recurser, list| list.respond_to?(:each) ? list.each(&recurser) : puts(list) } The difference being no variable assignment (a la 'traverser' in the example above). :]
'foo'?