Bug #8091

Class.new is not called when class is created using class keyword

Added by anurag uniyal about 1 year ago. Updated about 1 year ago.

[ruby-core:53390]
Status:Rejected
Priority:Normal
Assignee:-
Category:-
Target version:-
ruby -v:2.0.0p0 Backport:

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

History

#1 Updated by Nobuyoshi Nakada about 1 year ago

  • Status changed from Open to Rejected

Correct, not a bug.

#2 Updated by Marc-Andre Lafortune about 1 year ago

Note that if you need to detect class creation, that can be done using the inherited callback.

#3 Updated by anurag uniyal about 1 year ago

marcandre (Marc-Andre Lafortune) wrote:

Note that if you need to detect class creation, that can be done using the inherited callback.

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

#4 Updated by anurag uniyal about 1 year 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?

#5 Updated by Nobuyoshi Nakada about 1 year 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.

#6 Updated by Alexey Muranov about 1 year 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 X and 'Class.new` behave similarly

I think partial overloading can be done by defining the initialize private method.

#7 Updated by anurag uniyal about 1 year 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

#8 Updated by anurag uniyal about 1 year ago

alexeymuranov (Alexey Muranov) wrote:

I think partial overloading can be done by defining the initialize private method.
no initilize is called on class X that is why it is a bug

Also available in: Atom PDF