Actions
Feature #19362
closed#dup on Proc doesn't call initialize_dup
Status:
Closed
Assignee:
-
Target version:
-
Description
In #17545, #dup
had changed to create an instance of the subclass.
It, though, doesn't invoke initialize_dup
of the subclass, unlike other standard classes.
class MyAry < Array
def initialize_dup(...)
p(self.class, ...)
super
end
end
class MyString < String
def initialize_dup(...)
p(self.class, ...)
super
end
end
class MyProc < Proc
def initialize_dup(...)
p(self.class, ...)
super
end
end
MyString.new('test').dup # prints MyString, "test"
MyAry.new(['test']).dup # prints MyAry, ["test"]
MyProc.new { 'test' }.dup # doesn't print anything
This makes the change in #17545 useless: while inheriting from core classes is indeed marginal, one of author's intention might be carrying additional information with the Proc instance, and bypassing #initialize_dup
makes it impossible to maintain this information.
It seems that actually #initialize_dup
is also invoked on the core classes themselves, but ignored on Proc
.
class Array
def initialize_dup(...)
p(self.class, ...)
super
end
end
class String
def initialize_dup(...)
p(self.class, ...)
super
end
end
class Proc
def initialize_dup(...)
p(self.class, ...)
super
end
end
'test'.dup # prints String, "test"
['test'].dup # prints Array, ["test"]
Proc.new { 'test' }.dup # doesn't print anything
Which is an even more marginal problem but still an inconsistency.
Actions
Like0
Like0Like0Like0Like0Like0Like1Like0Like0Like0Like0