关于模板混入同名声明被外部覆盖的问题

tuja 2007-09-14
D模板混入有这样的规定:
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:
   
如下面代码, 有没有办法使模板混入代码不被插入环境同名声明覆盖?

1 有没有办法打印出10, 而不是0
2 模板中的scope(exit)语言能否作用到main函数
   
因为小弟想把一些共用代码放到模板中, 再在不同环境混入
import std.stdio;
void Foo()()
{    
    int t;
    scope(exit)
        t = 1;
    t = 10;
}


int main()
{
    int t;
    mixin Foo;
    writefln( "t = %d", t); //有没有办法打印出10, 而不是0
    return t;
}
oldrev 2007-09-14
函数模板也能被混入这几乎可以看作是一个编译器的 bug了,正统的做法是

template Foo()
{
    int t;
    .....
}
 
mixin Foo!();


scope(exit)可以在任何函数体内作用,但是通过 mixin 把代码混入函数体并不明智,更好的办法是重新设计消除此需求。
DavidL 2007-09-15
这里给一段代码
import std.stdio;   
template Foo()  
{       
		int t;
	 	void myfoo()
		{	
	    	scope(exit)   
			{
				writefln("now exit");
    	    	t = 1;   
			}
	    	t = 10;   
			writefln("umm!");
		}
}   
  
int main()   
{   
    int t;   
    mixin Foo f;   
	myfoo;
    writefln( "t = %d", f.t);    
    return t;   
}   


另外允许mixin IFTI并不是bug
import std.stdio;   
void Foo()()   
{       
    int t;   
    scope(exit)   
        t = 1;   
    t = 10;   
	writefln("haha");
}   
  
int main()   
{   
    int t;   
    mixin Foo;
    Foo();	
    writefln( "t = %d", t); 
    return t;   
}   


template Foo()
{
   void Foo()
   {
     ...
   }
}

上面的IFTI形式是void Foo()()
mixin并不执行代码,只是mixin这个template声明的内容,和引进这个template里面的function到本scope,允许本scope用更简单的形式调用template里面的function而已。
所以这个mixin Foo;并不包括执行里面的Foo这个函数,而这个template没有声明任何变量没有起到什么作用。
mixin过后应该调用该Foo才能是真正进入了Foo的scope,为什么Foo里面的t没有影响到本地的t?因为调用的是Foo这个函数,里面的t只属于Foo这个scope,调用结束时,t就回到原来的scope了

Global site tag (gtag.js) - Google Analytics