Bug #8091
closedClass.new is not called when class is created using class keyword
Description
=begin
When a class is created using ((|class|)) keyword, Class.new is not called but if class is created using ((|Class.new|)) it is obviously called, there seems to be a dyssymmetry between ((|class X|)) and ((|Class.new|)) e.g.
class Class
class << self
alias new_orig new
def new(*args)
obj = new_orig *args
print "created",obj,"\n"
obj
end
end
end
class X
end
It doesn't print anything, but Class.new does
=end
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
- Status changed from Open to Rejected
Correct, not a bug.
Updated by marcandre (Marc-Andre Lafortune) over 12 years ago
Note that if you need to detect class creation, that can be done using the inherited callback.
Updated by anuraguniyal (anurag uniyal) over 12 years ago
marcandre (Marc-Andre Lafortune) wrote:
Note that if you need to detect class creation, that can be done using the
inheritedcallback.
I don't want to detect class creation I wan to overload new, which should be possible, at-least it would be elegant if class X and 'Class.new` behave similarly
Updated by anuraguniyal (anurag uniyal) over 12 years ago
nobu (Nobuyoshi Nakada) wrote:
Correct, not a bug.
Why this is not a bug if classes created differently have different creation mechanism, question is why Class.new is not called when class is created?
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
new' is one of the ways to create an object, and most obvious probably, but not the only way. For examples, string interpolation, File#open, Thread#start, and many. class' statement is just one of them.
Updated by alexeymuranov (Alexey Muranov) over 12 years ago
anuraguniyal (anurag uniyal) wrote:
I don't want to detect class creation I wan to overload new, which should be possible, at-least it would be elegant if
class Xand 'Class.new` behave similarly
I think partial overloading can be done by defining the initialize private method.
Updated by anuraguniyal (anurag uniyal) over 12 years ago
Initialize is also not called on class X but it is called on Class.new
class Class
alias old_initialize initialize
def initialize(*args)
obj = old_initialize *args
print "initialize",obj,"\n"
obj
end
end
Updated by anuraguniyal (anurag uniyal) over 12 years ago
alexeymuranov (Alexey Muranov) wrote:
I think partial overloading can be done by defining the
initializeprivate method.
no initilize is called onclass Xthat is why it is a bug