Thread overview | |||||
---|---|---|---|---|---|
|
April 12, 2015 mixin template question | ||||
---|---|---|---|---|
| ||||
I don't understand why the following code compiles and runs without an error: import std.stdio; mixin template ABC(){ int abc() { return 3; } } mixin ABC; int abc() { return 4; } void main() { writefln("abc() = %s", abc()); } Doesn't the mixin ABC create a function with the same signature as the "actual function" abc()? It compiles with both included and writes "abc() = 4". If I comment out the actual function then it writes "abc() = 3". The actual function takes precedence, but why don't they conflict? Paul |
April 12, 2015 Re: mixin template question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul D Anderson | On Sunday, 12 April 2015 at 03:51:03 UTC, Paul D Anderson wrote: > I don't understand why the following code compiles and runs without an error: > > import std.stdio; > > mixin template ABC(){ > int abc() { return 3; } > } > > mixin ABC; > > int abc() { return 4; } > > void main() > { > writefln("abc() = %s", abc()); > } > > Doesn't the mixin ABC create a function with the same signature as the "actual function" abc()? > > It compiles with both included and writes "abc() = 4". If I comment out the actual function then it writes "abc() = 3". The actual function takes precedence, but why don't they conflict? > > Paul As the manual says (snippet below) the surrounding scope overrides mixin http://dlang.org/template-mixin.html --- Mixin Scope The declarations in a mixin are ‘imported’ into the surrounding scope. If the name of a declaration in a mixin is the same as a declaration in the surrounding scope, the surrounding declaration overrides the mixin one: int x = 3; mixin template Foo() { int x = 5; int y = 5; } mixin Foo; int y = 3; void test() { writefln("x = %d", x); // prints 3 writefln("y = %d", y); // prints 3 } --- bye, lobo |
April 12, 2015 Re: mixin template question | ||||
---|---|---|---|---|
| ||||
Posted in reply to lobo | On Sunday, 12 April 2015 at 04:04:43 UTC, lobo wrote:
> On Sunday, 12 April 2015 at 03:51:03 UTC, Paul D Anderson wrote:
>> I don't understand why the following code compiles and runs without an error:
>>
>> import std.stdio;
>>
>> mixin template ABC(){
>> int abc() { return 3; }
>> }
>>
>> mixin ABC;
>>
>> int abc() { return 4; }
>>
>> void main()
>> {
>> writefln("abc() = %s", abc());
>> }
>>
>> Doesn't the mixin ABC create a function with the same signature as the "actual function" abc()?
>>
>> It compiles with both included and writes "abc() = 4". If I comment out the actual function then it writes "abc() = 3". The actual function takes precedence, but why don't they conflict?
>>
>> Paul
>
> As the manual says (snippet below) the surrounding scope overrides mixin
>
> http://dlang.org/template-mixin.html
>
> ---
> Mixin Scope
> The declarations in a mixin are ‘imported’ into the surrounding scope. If the name of a declaration in a mixin is the same as a declaration in the surrounding scope, the surrounding declaration overrides the mixin one:
> int x = 3;
>
> mixin template Foo()
> {
> int x = 5;
> int y = 5;
> }
>
> mixin Foo;
> int y = 3;
>
> void test()
> {
> writefln("x = %d", x); // prints 3
> writefln("y = %d", y); // prints 3
> }
> ---
>
> bye,
> lobo
Thanks.
|
Copyright © 1999-2021 by the D Language Foundation