关于模板混入同名声明被外部覆盖的问题
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了 |