From: satoko.itse@... Date: 2021-06-27T01:56:23+00:00 Subject: [ruby-core:104410] [Ruby master Feature#18008] `keyword_init?` method for Struct Issue #18008 has been reported by hkdnet (Ko Sato). ---------------------------------------- Feature #18008: `keyword_init?` method for Struct https://bugs.ruby-lang.org/issues/18008 * 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: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>