On 2010-09-10 16:53, Pelle wrote:
On 09/10/2010 03:20 PM, Jacob Carlborg wrote:
On 2010-09-07 22:32, Don wrote:
Jacob Carlborg wrote:
On 2010-09-07 17:29, Don wrote:
Jacob Carlborg wrote:
I'm reading http://www.digitalmars.com/d/2.0/declaration.html#Typeof
where it says:

"typeof(this) will generate the type of what this would be in a
non-static member function, even if not in a member function. "

From that I got the impression that the code below would print the
same result, but it doesn't. It prints:

main.Bar
main.Foo

instead of:

main.Foo
main.Foo

Is this a bug or have I misunderstood the docs?

typeof(this) gives the *compile-time* type of this. Inside Bar, it has
to return 'Bar'.
typeid(this) gives the *runtime* type of this. So it can work that
it's
Bar is actually a Foo.

I know that typeof(this) is a compile time expression but in this case
I think the compiler has all the necessary information at compile
time. Note that I'm not calling "method" on a base class reference,
I'm calling it on the static type "Foo". In this case I think
typeof(this) would resolve to the type of the receiver, i.e. the type
of"foo".

Even though in this instance it could work out which derived class is
being used, it's not allowed to use that information while compiling
method(). There is only ONE function method(), and it has to work for
Bar, and all classes derived from Bar.

I think Scala can handle this problem, the following text is a snippet
from a paper called "Scalable Component Abstractions" (link at the
bottom), page 4 "Type selection and singleton types":

class C {
protected var x = 0;
def incr: this.type = { x = x + 1; this }
}

class D extends C {
def decr: this.type = { x = x - 1; this }
}

"Then we can chain calls to the incr and decr method, as in

val d = new D; d.incr.decr;

Without the singleton type this.type, this would not have
been possible, since d.incr would be of type C, which does
not have a decr member. In that sense, this.type is similar
to (covariant uses of ) Kim Bruce's mytype construct [5]."

I'm not very familiar with Scala but the above code example seems to
work as I want typeof(this) to work.

http://www.scala-lang.org/sites/default/files/odersky/ScalableComponent.pdf



You can do this in D, but the syntax is clumsy. And it uses templates.

class C {
int x;
T incr(this T)() {
x += 1;
return cast(T)this; // clumsy, but always works (?)
}
}
class D : C {
T decr(this T)() {
x -= 1;
return cast(T)this;
}
}

void main() {
D d = new D;
d.decr.incr.decr.incr.incr;
writeln(d.x);

}

I had no idea about this, thanks. I don't like the templates but I guess it's better than nothing.

--
/Jacob Carlborg

Reply via email to