Ruby
vector

Vectorクラスをカジュアルに使っていく

Ruby の標準ライブラリのなかの Vector クラスがとても便利なのですが、利用の機会が少ないようなので、もっと気軽に使っていく例を紹介します。

例1. 普通に計算が面倒なときに使う

まず require "matrix" します。このなかに Vector クラスが入ってます。

で、配列の同じインデックスの要素をそれぞれ足したい場合、

[1, 2] + [3, 4] + [5, 6]                      # => [1, 2, 3, 4, 5, 6]

とするのは、単に配列同士が繋がってしまいます。

そこで次のようにしてもいいのですが、

[[1, 2], [3, 4], [5, 6]].transpose.map(&:sum) # => [9, 12]

Vector を使うとより自然に表現できます。

Vector[1, 2] + Vector[3, 4] + Vector[5, 6]    # => Vector[9, 12]

例2. 座標として使う

二次元座標なら、

a = Vector[1, 2]
b = Vector[3, 4]
a + b                           # => Vector[4, 6]

三次元座標なら、

a = Vector[1, 2, 3]
b = Vector[3, 4, 5]
a + b                           # => Vector[4, 6, 8]

a + b の部分は同じというところがポイントです。

例3. Railsアプリのデバッグ中に使う

まとめて引き算もできるので、関連テーブルのレコード数の変化をさっと確認したいときなど、次のように簡単に書けます。

a = Vector[User.count, Article.count, Favorite.count, Community.count]
# (ここで何か実行)
b = Vector[User.count, Article.count, Favorite.count, Community.count]
p b - a