learning reflection in D

Adam D. Ruppe destructionator at gmail.com
Thu Oct 5 15:04:50 UTC 2017


On Thursday, 5 October 2017 at 14:59:10 UTC, drug wrote:
> 1) why .stringof and typeid() is equal logically and different 
> in fact? What is difference between them? Is it that stringof 
> compile time and typeid runtime things? Anyway wouldn't it be 
> better they will equal both logically and literally?

stringof is a static debugging aid, just a string that kinda 
represents it in code. It isn't guaranteed to match anything, but 
should be enough that when you eyeball it it points you in the 
right direction... you shouldn't rely on it to be anything 
specific. typeid, on the other hand, is a published, documented 
object with methods and defined comparisons. So that's one 
difference.

The other one is indeed compile time vs runtime: stringof is 
purely compile time, whereas typeid() returns a runtime object on 
a runtime object. To see the difference, try:

Object o = new MyClass();
typeid(o);


You'll see it is MyClass, but the static versions (stringof, 
typeof, etC) will all think of it as Object.


> 2) Where do these attributes come from? I mean `pure nothrow 
> @nogc @safe` except `@property` that I set explicitly?

You didn't specify a return value for those functions, which 
meant the compiler inferred a bunch about it. It inferred the 
return value and those other attributes to fill in the gap.

If you gave an explicit return value `@property int` or 
`@property void`, then it wouldn't automatically fill stuff in 
anymore.


More information about the Digitalmars-d-learn mailing list