【一人 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
に関してはこちらのスライドも参照してください。