Skip to content

Instantly share code, notes, and snippets.

@jaynetics
Created May 30, 2023 18:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jaynetics/386dda6a576edd942291866c78a0db5f to your computer and use it in GitHub Desktop.
Save jaynetics/386dda6a576edd942291866c78a0db5f to your computer and use it in GitHub Desktop.
Attempt at overriding Struct subclass ::new in Ruby for better kwargs performance
Struct2 = Class.new(Struct)
Struct2.singleton_class.prepend Module.new {
def new(...)
st = super
st.instance_eval <<~RUBY
alias __orig_new__ new
ARG_NOT_GIVEN = Object.new.freeze
def new(#{st.members[0]} = ARG_NOT_GIVEN, *, **)
if #{st.members[0]}.equal?(ARG_NOT_GIVEN)
__kw_new__(**)
else
__list_new__(#{st.members[0]}, *)
end
end
def __kw_new__(#{st.members.map { |m| "#{m}:" }.join(',')})
__orig_new__(#{st.members.map { |m| "#{m}" }.join(',') })
end
def __list_new__(#{st.members.map { |m| "#{m}" }.join(',') }, **)
__orig_new__(#{st.members.map { |m| "#{m}" }.join(',') })
end
RUBY
st
end
def method_added(m)
# revert performance patch that depends on default initialize sig
alias new __orig_new__ if m == :initialize
super
end
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment