こんにちは、プレイライフの熊崎です!
本日2本目は実務でOpenStructを使用したので、OpenStructについてアウトプットを行っていこうと思います。
OpenStructとは
要素を動的に追加・削除できる手軽な構造体を提供するクラスです。
ref: https://docs.ruby-lang.org/ja/latest/class/OpenStruct.html
An OpenStruct is a data structure, similar to a Hash, that allows the definition of arbitrary attributes with their accompanying values.
ref: https://ruby-doc.org/stdlib-2.6.6/libdoc/ostruct/rdoc/OpenStruct.html
→ 任意の属性とそれに付随する値を定義することができて、なおかつ属性は動的に追加・削除ができる。
構造体とは?
構造体(こうぞうたい、英: structure)はプログラミング言語におけるデータ型の一つで、1つもしくは複数の値をまとめて格納できる型。それぞれのメンバー(フィールド)に名前が付いている点、またメンバーの型が異なっていてもよい点が配列と異なる。
ref: https://ja.wikipedia.org/wiki/%E6%A7%8B%E9%80%A0%E4%BD%93
どんな挙動をするのか?
以下のように、要素を追加したり、削除したりできる。
require 'ostruct'
user = OpenStruct.new
user.name = "佐藤太郎"
p user # => #<OpenStruct name="佐藤太郎">
user.delete_field("name")
p user # => #<OpenStruct>
newメソッドの時点で属性をセットすることもできる。
require 'ostruct'
OpenStruct.new(:name => "佐藤太郎", :sex => "male")
どんな時に使うのか?
例:何らかの事情で、フロントエンド側から受け取った値を変換したいとき。
わざわざ変換用のクラスを準備するよりもこっちの方が簡単に書ける。
def conversion_entry_status
OpenStruct.new(
"ok": "entry",
"ng": "not_entry"
)
end
def save
user_schedule.update!(entry_status: conversion_entry_status[:ok])
end
最後に
今回の例以外にも、テスト時のmockを作る時などにも使用されるらしい。
まだまだ理解しきれていない部分もあるため、もっと使用して理解を深めようと思う。
参考文献