【一人 bugs.ruby Advent Calendar 2020】[Feature #16986] Anonymous Struct literal【23日目】

【一人 bugs.ruby Advent Calendar 2020】[Feature #16986] Anonymous Struct literal【23日目】 一人 bugs.ruby Advent Calendar 2020 23日目の記事になります。

[Feature #16986] Anonymous Struct literal

これは Struct.new(:a, :b).new(1, 2)${ a: 1, b: 2 } のようなリテラルで定義できるようにするチケットです。

s = ${a: 1, b: 2, c: 3}
s.a  # => 1
s.b  # => 2
s.c  # => 3

いまはそんなに Struct は使わないけどこういう記法があるとガンガン使いそうですねー。
例えばこんな感じに雑にダックタイピング呼び出しするメソッドに値を渡す場合とか?

def print(user)
  pp "#{user.id} #{user.name}"
end

name = "homu"
age = 14
# Struct を経由してメソッド呼び出しされるようにする
print(${ name: name, age: age })

Struct だと obj.value だけじゃなくて obj[:value] みたいに添え字アクセスもできるので Hash の代わりとして使用できそうですね。
Hash と違い存在しないキーにアクセスするとエラーになるのは便利そう

# Hash の場合は typo してても気づきづらい
user = { name: "homu", age: 14 }
# no error
user[:nmae]

# Struct だと存在しないキーにアクセスするとエラーになる
user = Struct.new(:name, :age).new("homu", 14)
# error
user[:nmae]

あとは ${} だとブロックと差別化できるので p { a: 1, b: 2 } とは書けないんですが p ${ a: 1, b: 2 } はかける的な。
関係ないけどどういう経緯でチケットが建てられたのか見ているとちょっとおもしろいです

Struct に関してはこちらのスライドも参照してください。

[今更聞けない! Struct の使い方と今後の可能性について]