"Gennady" <gfb / tonesoft.com> schrieb im Newsbeitrag
news:411966D7.2040101 / tonesoft.com...
> David A. Black wrote:
> > Hi --
> >
> > On Wed, 11 Aug 2004, Gennady wrote:
> >
> >
> >>David A. Black wrote:
> >>
> >>
> >>>Hi --
> >>>
> >>>On Wed, 11 Aug 2004, Gennady wrote:
> >>>
> >>>
> >>>
> >>>>>>At least for "def Foo.f1" and "class << Foo" it is not the same
one: one
> >>>>>>holds "A=10" and another -- "A=20".
> >>>>>
> >>>>>
> >>>>>But only one of them is a singleton class; the other is simply Foo
> >>>>>itself :-) When you do def Foo.m, 'self' is Foo; but when you do
class
> >>>>
> >>>>That's where a slight misunderstanding might have occurred: I was
> >>>>calling "Foo itself" an original singleton class (isn't it? ;-)),
and
> >>>>the one created by "class << Foo" -- an anonymous singleton class of
Foo
> >>>>(i omitted word "anonymous" from my original reply, sorry).
> >>>
> >>>
> >>>I realize that we should probably be saying 'virtual class' instead
of
> >>>'singleton class' (at least, that's what shows up in the error
> >>>messages when you try to instantiate one) -- but either way, Foo
isn't
> >>>one :-)  It's just a regular class.
> >>>
> >>>
> >>>David
> >>>
> >>
> >>Hmm, I like "virtual class" much better. I used term "singleton" for
> >>describing Foo's class simply to reflect that there's only one
instance
> >>of class "Class" representing "Foo". Seems like my terminology was
> >>misleading.
> >
> >
> > It's not a very useful usage -- you'd have to call every object in
> > Ruby a 'singleton' then :-)
> >
> > 'Singleton class' has always had the problem that there's also the
> > Singleton module, so 'singleton class' can also mean a class that
> > includes that module.  'Virtual class' strikes me as possibly causing
> > confusion, or false expectations, due to the use of that term for very
> > different things in other languages.  But I don't have a perfect term
>
> Neither Java, nor C++ have term "virtual class", rather "abstract
> class". "virtual" may be member functions in C++ (or implicitly
> "non-virtual" in Java if you specify "final" keyword for a method).
> Also, "virtual" may be inheritance specification in C++.
>
> So at least for those two languages, term "virtual class" is vacant ;-).

I'd still opt for using "singleton class" since that is the term used by
most publications (news and books) about the matter.

That would mean:

fooSingle = class Foo
  class <<self
    self
  end
end

f = Foo.new
fooInstanceSingle = class <<f; self; end

>> fooSingle = class Foo
>>   class <<self
>>     self
>>   end
>> end
=> #<Class:Foo>
>> f = Foo.new
=> #<Foo:0x10184920>
>> fooInstanceSingle = class <<f; self; end
=> #<Class:#<Foo:0x10184920>>
>> fooSingle
=> #<Class:Foo>
>> fooInstanceSingle
=> #<Class:#<Foo:0x10184920>>
>> fooInstanceSingle === f
=> true
>> fooInstanceSingle === Foo.new
=> false
>> fooSingle === Foo
=> true

Now we have:

Foo is a class.
fooSingle is the singleton class of the instance Foo (i.e. the class).
f is an instance of Foo.
fooInstanceSingle is the singleton class of the instance f.

Kind regards

    robert