Многомерный каждый

Как я сделал бы что-то как ниже?

[
    'foo'
    ['bar', 'baz'],
    [
        'one',
        ['two', 'three']
    ]
].each { |word| puts word }

# I want this to return:

foo
bar
baz
one
two
three
5
задан Andrew Grimm 9 May 2010 в 23:59
поделиться

3 ответа

Если вы не хотите сглаживать массив и при этом добиваться желаемой функциональности, вы можете сделать что-то вроде:

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]]]
2
ответ дан 14 December 2019 в 08:45
поделиться

Не могли бы вы использовать flatten ?

[
    'foo'
    ['bar', 'baz'],
    [
        'one',
        ['two', 'three']
    ]
].flatten.each { |word| puts word }

flatten вернет копию массива, поэтому оригинал не будет изменен.
Он также полностью рекурсивен, поэтому не имеет значения, сколько у вас массивов внутри массивов.

3
ответ дан 14 December 2019 в 08:45
поделиться

Самый простой способ:

words = ['foo',['bar', 'baz'],['one',['two', 'three']]]
words.flatten.each{ |word| puts word }
2
ответ дан 14 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: