LoginSignup
1
1

More than 5 years have passed since last update.

[ruby]括弧を使うことで、ブロックの引数に渡した配列の入れ子を展開することができる

Last updated at Posted at 2018-07-28

結論

ブロックの引数で、以下のような配列を展開したい場合、
引数を()で囲むことで展開できる
※1階層のみ

arr = [["hoge"], ["bar"], "foo"]
arr.each { |(ele)| 
  puts ele.length
}

ただ、個人的には
flattenで書く方があとから見直すときによいと思う:thinking:

比較

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という
配列を平坦化するメソッドを使った方がよりよいかなと思います :relieved:
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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1