魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

Ruby便利機能 メモ

投稿日:
更新日:
タグ:

Rubyの便利なメソッドをメモ。 なお後述の実行結果は見やすいように形成している。

配列

  • product
  • combination
  • reject
  • select
  • collect/map
  • transpose
  • zip
  • each
  • each_with_index
  • join
  • uniq
  • split
  • inject
配列1.product(配列2, ...)
複数の配列から組み合わせて、順列を作成する。
ary1 = [1, 2, 3]
ary2 = ["a", "b"]
p ary1.product(ary2)
実行結果
[[1, "a"], [1, "b"],
 [2, "a"], [2, "b"],
 [3, "a"], [3, "b"]]
productは3つ以上の配列でも良い。
ary1 = [1, 2, 3]
ary2 = ["a", "b"]
ary3 = [-10, -20]
p ary1.product(ary2, ary3)
実行結果
[[1, "a", -10], [1, "a", -20],
 [1, "b", -10], [1, "b", -20],
 [2, "a", -10], [2, "a", -20],
 [2, "b", -10], [2, "b", -20],
 [3, "a", -10], [3, "a", -20],
 [3, "b", -10], [3, "b", -20]]
配列.combination(n){|要素, ...| block }
配列から組み合わせを生成する。要素はn個記述する。
[1, 2, 3].combination(2){|e1,e2|
  puts "#{e1} #{e2}"
}
実行結果
1 2
1 3
2 3
配列.reject{|要素| 削除条件}
配列から特定の要素を削除した配列を生成する。
奇数のみ
p [1, 2, 3, 4, 5, 6].reject{|x| x%2==0 }
実行結果
[1, 3, 5]
配列.select{|要素| 選択条件}
配列から特定の要素を選択した配列を生成する。
奇数のみ
p [1, 2, 3, 4, 5, 6].select{|x| x%2==1 }
実行結果
[1, 3, 5]
配列.collect{|要素| 新しい要素}
配列.map{|要素| 新しい要素}
各要素に対して何らかの処理を行い、新たな配列を生成する。
全ての要素を倍に
p [1, 2, 3, 4, 5, 6].collect{|x| x*2 }
実行結果
[2, 4, 6, 8, 10, 12]
配列.transpose()
配列を行列とみなし、行と列を交換する。
irb(main):002:0> [[1,2,3], [4,5,6]].transpose()
=> [[1, 4], [2, 5], [3, 6]]
配列.zip(other_array, ...)
配列の要素を引数として、other_arrayと組み合わせ、配列の配列を作成 する。
irb(main):002:0> [1,2,3].zip([4,5,6])
=> [[1, 4], [2, 5], [3, 6]]
irb(main):001:0> [1,2,3].zip([4,5,6],[7,8,9])
=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
irb(main):004:0> [1,2,3].zip([4,5,6],[7,8,9]).each{|x,y,z| puts
"#{x}-#{y}-#{z}" }
1-4-7
2-5-8
3-6-9
=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
配列.each{|要素| block}
各要素に対して何らかの処理を行う。
全ての要素を倍に
[1, 2, 3].each{|x| puts x*2 }
実行結果
2
4
6
配列.each_with_index{|要素, 添字番号| block}
eachに加えて、添字番号も取得する。
全ての要素を倍に
["hoge", "fuga", "piyo"].each{|v, i| puts "#{i} #{v}" }
実行結果
0 hoge
1 fuga
2 piyo
配列.join(区切り記号の文字列)
配列を結合して文字列を生成する。
2次元配列をCSV形式で出力
ary1 = [1, 2, 3]
ary2 = ["a", "b"]
ary3 = [-10, -20]
p ary1.product(ary2, ary3).each{|x|
 puts x.join(",")
}
実行結果
1,a,-10
1,a,-20
1,b,-10
1,b,-20
2,a,-10
2,a,-20
2,b,-10
2,b,-20
3,a,-10
3,a,-20
3,b,-10
3,b,-20
配列.uniq
配列から重複を削除する。
2次元配列をCSV形式で出力
ary1 = [1, 1, 2]
ary2 = [3, 4]
p ary1.product(ary2)
puts
p ary1.product(ary2).uniq
実行結果
[[1, 3], [1, 4],
 [1, 3], [1, 4], [2, 3], [2, 4]]

[[1, 3], [1, 4], [2, 3], [2, 4]]
文字列.split(区切り記号)
文字列を指定した文字列で区切って、配列を生成する。
  • irb(main):001:0> "hoge,fuga,piyo,,foo".split(/,+/)
    => ["hoge", "fuga", "piyo", "foo"]
    
  • irb(main):002:0> "hoge,fuga,piyo,,foo".split(",")
    => ["hoge", "fuga", "piyo", "", "foo"]
    
配列.inect{|合計, 要素| 合計}
配列.inect(初期値){|合計, 要素| 合計}
配列.inect(初期値, 合算関数)
配列.inect(合算関数)
各要素を順次処理して結果を合算していく。配列と書いたが実際にはEnumerable#inject。
ブロックの中で指定した結果の合計が次の周期の引数の合計になり、最終的な合計が返却値となる。
初期値を指定しない場合は配列の1つ目の要素が初期値で、2つ目の要素から始まる。
例1)
[1,2,3,4,5].inject{|s,v| p s; s+v}
実行結果
1
3
6
10
=> 15
例2)
[1,2,3,4,5].inject(0){|s,v| p s; s+v}
実行結果
0
1
3
6
10
=> 15
配列の合計や乗算などを扱う場合に便利。
例えば3~5(3,4,5)の整数の乗算結果は以下にように記載できる。
(3..5).inject(:*)

ハッシュ

ハッシュ.invert()
ハッシュのキーと値を入れ替える。
irb(main):001:0> h = {"a"=>1, "b"=>>, "c"=>3}
=> {"a"=>1, "b"=>2, "c"=>3}
irb(main):002:0> h.invert
=> {1=>"a", 2=>"b", 3=>"c"}
irb(main):003:0>

IO, File

IO.read(size)
IOからサイズ分文字列を読み込む。size省略で全て読み込む。
IO.readlines()
IOから全て読み込んで、行毎に配列にする。
IO.popen(コマンド, モード){|IO| 処理}
irb(main):001:0> IO.popen("date"){|io| puts io.read}
2016年  3月  5日 土曜日 15:30:54 JST
=> nil

String

文字列.scan(正規表現)
正規表現に一致する文字列の配列を返す。
irb(main):001:0> STDIN.read.scan(/[^ ]藤/)
さ藤 佐藤 田中 藤野 斎藤
佐々木 遠藤 鈴木
=> ["さ藤", "佐藤", "斎藤", "遠藤"]
irb(main):002:0>
sprintf(str, arg, ...)
str % arg
書式付き文字列を作成する。
  • puts "%.2d" % 2
  • puts "%.2d %s" % [2, "hoge"]
  • puts sprintf "%.2d %s", 2, "hoge"

一覧