結論
ブロックの引数で、以下のような配列を展開したい場合、
引数を()で囲むことで展開できる
※1階層のみ
arr = [["hoge"], ["bar"], "foo"]
arr.each { |(ele)|
puts ele.length
}
ただ、個人的には
flattenで書く方があとから見直すときによいと思う
比較
test.rb
#!/bin/ruby
arr = [["hoge"], ["bar"], "foo"]
arr.each { |ele|
puts ele.length
puts ele.class
}
puts '---'
arr.each { |(ele)|
puts ele.length
puts ele.class
}
実行してみます
$ ruby test.rb
1
Array
1
Array
3
String
---
4
String
3
String
3
String
なお、次元が1つ下がるだけのようなので、入れ子の入れ子みたいなのは展開できないようです。
test2.rb
#!/bin/ruby
arr = [["hoge"], ["bar"], "foo", [["piyo"]]]
arr.each { |(ele)|
puts ele.length
puts ele.class
}
$ ruby test2.rb
4
String
3
String
3
String
1
Array
ただ、個人的にはわかりづらい点と、
私自身も仕組みも理解できていない点、
何階層まで展開するかの指定ができる点を考慮するとflattenという
配列を平坦化するメソッドを使った方がよりよいかなと思います
cf. https://docs.ruby-lang.org/ja/2.5.0/method/Array/i/flatten.html
test3.rb
#!/bin/ruby
arr = [["hoge"], ["bar"], "foo", [["piyo"]]].flatten(1)
arr.each { |ele|
puts ele.length
puts ele.class
}
$ ruby test3.rb
4
String
3
String
3
String
1
Array
経緯
以下の問題を解いた後、他の人の回答を見ていたところ
今回の書き方をみつけた
https://yukicoder.me/problems/no/345