LoginSignup
2
0

More than 1 year has passed since last update.

ちょっとした羅列を手で作るのはやめようって話

Last updated at Posted at 2021-12-22

概要

例えば特定のIDをもったデータを参照したいとかで

[1725,1726,1727]

みたいなものが入ったスクリプトやSQLなどを書いたりすることがあると思います。

自分は1回これを

[1725.1726,1727]

みたいな感じでタイポし、盛大にバグを出しました。
そこで再発防止でこういうものはすべてプログラムで出力してコピペするようにしています。

自分はirbでワンライナーを書いて出力をコピペしています。ターミナルに3文字打つだけで起動してくれますし、多少数が増えるとプログラムを書く方が早く、また応用も効くのでおすすめです。

配列の中身

(1725..1727).to_a.join(',')
=> "1725,1726,1727"

長い配列の中身

(1725..1735).to_a.join(',')
=> "1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735"

間が抜けた数字の列挙

[*1725..1727,*1750..1752].join(',')
=> "1725,1726,1727,1750,1751,1752"

条件をつけて絞り込む(3の倍数の列挙)

*@scivolaさんから指摘していただきました、range型にselectが使えて返り値が配列なのでto_aが消せます

(1725..1735).select{|n|n%3==0}.join(',')
=> "1725,1728,1731,1734"

前のコード

(1725..1735).to_a.select{|n|n%3==0}.join(',')
=> "1725,1728,1731,1734"

改行を入れて縦に並べる

*@scivolaさんから指摘していただきました、putsに配列を渡すと改行して表示されるため改行コードでのjoinが不要です。また[*1725..1727,*1750..1752]の時点で配列なのでto_aも不要です。

puts [*1725..1727,*1750..1752]
1725
1726
1727
1750
1751
1752
=> nil

前のコード

puts [*1725..1727,*1750..1752].to_a.join("\n")
1725
1726
1727
1750
1751
1752
=> nil

文字に番号がついている場合

*@scivolaさんから指摘していただきました、改行コードでのjoinが不要なほか、ruby2.7以降なら番号指定パラメータを使い記述を減らせます

puts (1..15).to_a.map{"id_#{_1},"}
id_1,
id_2,
id_3,
id_4,
id_5,
id_6,
id_7,
id_8,
id_9,
id_10,
id_11,
id_12,
id_13,
id_14,
id_15,
=> nil

前のコード

puts (1..15).to_a.map{|n|"id_#{n},"}.join("\n")
id_1,
id_2,
id_3,
id_4,
id_5,
id_6,
id_7,
id_8,
id_9,
id_10,
id_11,
id_12,
id_13,
id_14,
id_15,
=> nil

初心にかえって、普段ミス防止にやっていることを書いてみました。今回はレンジ型を主に使う例をあげましたが、csvを読み込んで使ったり、DBからcsvを出力して使ったりするともっといろいろなものが作れます。手で列挙したものから目検などでミスをみつけようとすると非常に大変なので作れるものはできる限りプログラムで作るのが良いです。

2
0
2

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
2
0