【Ruby】Railsコンソールで、Structをちゃちゃっと理解しよう。

割と便利なStructですが、実際に使っている現場は少ないかもなぁというのが個人的な印象。この記事では、「Structってこんなものだよ」をざっくりと説明します。

2024年03月27日
関連記事

この場合に使うべきというものはないのですが、個人的に使いやすい場面としては モデルに直接対応しないケース が多いかなと思います。
※ 集計やCSVインポート機能など

Structの作成

では、Railsコンソールで試していきます。

$ rails c

1. Structの定義

Railsコンソールが立ち上がったら、早速定義していきます。
シンプルに、名前と年齢の情報を持ったStructです。

> Person = Struct.new(:name, :age)

2. インスタンスの生成

名前はアリスさん。30歳です。素敵ですね。

> person = Person.new("Alice", 30)

3. 属性へのアクセスと変更

名前、年齢をそれぞれ確認してみましょう。

> person.name  # Alice
> person.age   # 30

おっと、アリスさん、年齢をサバ読んでいたようです。
ここはちゃんとシビアにみます。

> person.age = 31
> person.age # 31

おっと、実はよしこさんだったようですね。こちらも変えてみます。

> person.name = 'よしこ'
> person.name # よしこ

※ Structで読み取り専用な属性を設定するのはちょっと複雑。場合によってはおとなしくクラスにすべし。

応用

ここからはちょっとした応用です。
Structはクラスにするまでもないけど、クラスっぽく扱いたいな〜という時に便利。
なるべく複雑なことはさせないようにしましょう。

1. メソッド

カスタムメソッドを追加することもできます。
先ほどまでは年齢を直接突っ込んでましたが、生年月日(YYYYMMDD)から年齢を出したい…みたいなこともできるってことですね。

> Person = Struct.new(:name, :birthday) do
  def age
    today = Date.today.strftime("%Y%m%d").to_i
    birth_date = self.birthday.to_i
    (today - birth_date) / 10000
  end
end

動かしてみましょう。

> person = Person.new("Yutahhhh", "19941007")
> person.birthday # 19941007
> person.age

2. 継承

実は継承も。ぶっちゃけ実務で使ったことはありません。
とりあえず豆知識程度に覚えておきましょう。

> class Employee < Struct.new(:name, :age)
  def introduce
    "名前: #{name}, 年齢: #{age}歳"
  end
end
> employee = Employee.new("Yutahhhh", 29)
> employee.introduce # 名前: Yutahhhh, 年齢: 29歳
筆者情報
IT業界経験6年目のフルスタックエンジニア。
フロントエンドを軸として技術を研鑽中でございます。