Closed sarna closed 1 year ago
I'm also seeing this in Faraday 2.7.5 and not in 2.7.4.
This is probably a side-effect of #1489 and #1491 (cc @bdewater). The warnings don't hurt, but I'd prefer them to go away as well if possible.
I don't like that memoized
stuff going on in there and I'm not sure I fully understand why we need it, I'll need some time to look into this 👀
This is caused by defining methods with the same name as Struct
members.
❯ cat test.rb
X = Struct.new(:a, :b) do
def a
:other
end
end
X.new(1, 2).a # => :other
❯ ruby -W test.rb
test.rb:2: warning: method redefined; discarding old a
Before #1489, the above X
was defined by inheriting from Struct.new(:a, :b)
. I'm not sure about Ruby's internal implementation, but I guess the difference between them is the timing of the method definition. Previously, a redefined method was declared as a method of the subclass, which is just a normal overriding.
# This case just overrides the method defined by the parent class.
class X < Struct.new(:a, :b)
def a
end
end
# NOTE: The above code is the same as the below.
TMP = Struct.new(:a, :b)
class X < TMP
def a
end
end
In the latest code, redefinition occurs during the setup of Struct
. This means that defining methods from Struct
members as well as custom methods within a block of .new
is happening at the same time.
X = Struct.new(:a, :b) do
def a
end
end
# Defining the method within the block seems to be the same as the below.
class X
def a
end
def a
end
end
If possible, it might be the best to avoid defining the same name as Struct
members (e.g., user
should be renamed). However, such methods might be used by other plugins or applications, so another approach would be required.
I've proposed a fix in #1506 if you all want to take a look.
Thank you @yykamei for the eye-opening explanation and @mattbrictson for providing a fix 🙇
Thank you all ❤️
Basic Info
Issue description
With warnings enabled (eg during testing), there are several lines printed with "warning: method redefined; discarding old" warnings.
Steps to reproduce