From: takashikkbn@... Date: 2021-06-27T02:35:25+00:00 Subject: [ruby-core:104411] [Ruby master Feature#18008] `keyword_init?` method for Struct Issue #18008 has been updated by k0kubun (Takashi Kokubun). +1. While we aim to obviate `keyword_init` in [Feature #16806], unless we also intend to deprecate the option (for now we don't), we'd need to have the check to correctly write a deserializer of Structs. ---------------------------------------- Feature #18008: `keyword_init?` method for Struct https://bugs.ruby-lang.org/issues/18008#change-92657 * Author: hkdnet (Ko Sato) * Status: Open * Priority: Normal ---------------------------------------- I'd like to know whether my struct was initialized with `keyword_init: true` or not. This information is useful when writing a deserializer (attached an example below). ```ruby S1 = Struct.new(:a, :b, keyword_init: true) S2 = Struct.new(:a, :b) # Specialized for Struct def serialize(d) d.to_h.merge(__class_name: d.class.name) end def deserialize(h) klass = Object.const_get(h.delete(:__class_name)) if keyword_init?(klass) # If the class is created with keyword_init: true, the parameter should be passed as keywords klass.new(**h) else # Otherwise, each values are passed in the order of members. klass.new(*klass.members.map { |sym| h[sym] }) end end def keyword_init?(klass) # I don't want to do this... # klass.keyword_init? looks cool. klass.inspect.end_with?('(keyword_init: true)') end s1 = S1.new(a: 1, b: 2) p s1 p s1_ = deserialize(serialize(s1)) p s1 == s1_ s2 = S2.new(1, 2) p s2 p s2_ = deserialize(serialize(s2)) p s2 == s2_ ``` -- https://bugs.ruby-lang.org/ Unsubscribe: