`
hqs7636
  • 浏览: 220994 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模板混入 2.014

阅读更多
(本章无版本差异)

一个 模板混入 指的是从一个 模版声明 的过程体内 提取一个任意的声明 集合,并将它们插
入到当前的上下文中。

模板混入:
mixin 模板标识符 ;
mixin 模板标识符 混入标识符 ;
mixin 模板标识符 !(模板参数列表 ) ;
mixin 模板标识符 !(模板参数列表 ) 混入标识符 ;

混入标识符:
标识符
模版混入 可以出现在模块、类、结构、联合的声明列表中,并且可以做为语句。模板标识
符 是一个 模版声明。如果 模版声明 没有参数,就可以使用不带 !(模版参数列表) 的混入
形式。

不像模板具现化,模板混入的过程体在混入 所在的作用域内 计算,而不是在定义模板声明的
地方。

这类似于使用剪切和粘贴将模版的过程体插入混入的位置。这对注入参数化的‘样板
文件’是有用的,同时对创建模板化 嵌套函数 也很有用,而正常情况下是不可能具 现化嵌套函数的。

template Foo()
{
int x = 5;
}

mixin Foo;
struct Bar
{
mixin Foo;
}

void test()
{
writefln("x = %d", x); // 输出 5
{ Bar b;
int x = 3;
writefln("b.x = %d", b.x); // 输出 5
writefln("x = %d", x); // 输出 3
{
mixin Foo;
writefln("x = %d", x); // 输出 5
x = 4;
writefln("x = %d", x); // 输出 4
}
writefln("x = %d", x); // 输出 3
}
writefln("x = %d", x); // 输出 5
}

混入可以被参数化:

template Foo(T)
{
T x = 5;
}
mixin Foo!(int); // 创建类型为 int 的 x

混入可以可以为类添加虚函数

template Foo()
{
void func() { writefln("Foo.func()"); }
}

class Bar
{
mixin Foo;
}

class Code : Bar
{
void func() { writefln("Code.func()"); }
}

void test()
{
Bar b = new Bar();
b.func(); // 调用 Foo.func()
b = new Code();
b.func(); // 调用 Code.func()
}

混入在它们出现的地方被求值,而不是在模板声明的地方:

int y = 3;
template Foo()
{
int abc() { return y; }
}

void test()
{
int y = 8;
mixin Foo; // 使用的是局部的 y ,而不是全局的 y
assert(abc() ==;
}

混入可以使用别名参数来参数化符号:
template Foo(alias b)
{
int abc() { return b; }
}

void test()
{
int y = 8;
mixin Foo!(y);
assert(abc() ==;
}

这个例子使用了一个混入来为任意语句实现一个泛型 Duff's Device(在这里,那个语句采用粗体表示)。在生成一个嵌套函数的同时也生成了一个委托文字量,他们会通过编译器内
联:

template duffs_device(alias id1, alias id2, alias s)
{
void duff_loop()
{
if (id1 < id2)
{
typeof(id1) n = (id2 - id1 + 7) / 8;
switch ((id2 - id1) %
{
case 0: do { s();
case 7: s();
case 6: s();
case 5: s();
case 4: s();
case 3: s();
case 2: s();
case 1: s();
} while (--n > 0);
}
}
}
}

void foo() { writefln("foo"); }

void test()
{
int i = 1;
int j = 11;
mixin duffs_device!(i, j, delegate { foo(); } );
duff_loop(); // 执行 foo() 10 次
}


18.1 混入作用域

混入中的声明被‘导入’到周围的作用域中。如果混入和其周围的作用域中有相同的名字,
周围的作用域中的声明将覆盖混入中的那个声明:

int x = 3;
template Foo()
{
int x = 5;
int y = 5;
}

mixin Foo;
int y = 3;
void test()
{
writefln("x = %d", x); // 输出 3
writefln("y = %d", y); // 输出 3
}

如果两个不同的混入被放入同一个作用域,并且他们中定义了同名的声明,就会出现模棱两
可的错误:

template Foo()
{
int x = 5;
void func(int x) { }
}

template Bar()
{
int x = 4;
void func() { }
}

mixin Foo;
mixin Bar;

void test()
{
writefln("x = %d", x); // 错误,x 有歧义
func(); // 错误,func 有歧义
}

对 func() 的调用有歧义,因为 Foo.func 和 Bar.func 在不同的作用域里。

如果一个混入有 混入标识符,它就可以用来消除歧义:

int x = 6;
template Foo()
{
int x = 5;
int y = 7;
void func() { }
}

template Bar()
{
int x = 4;
void func() { }
}

mixin Foo F;
mixin Bar B;

void test()
{
writefln("y = %d", y); // 输出 7
writefln("x = %d", x); // 输出 6
writefln("F.x = %d", F.x); // 输出 5
writefln("B.x = %d", B.x); // 输出 4
F.func(); // 调用 Foo.func
B.func(); // 调用 Bar.func
}

别名声明可以被用来将声明在不同混入里的函数重载在一起:

template Foo()
{
void func(int x) { }
}
template Bar()
{
void func() { }
}

mixin Foo!() F;
mixin Bar!() B;
alias F.func func;
alias B.func func;

void main()
{
func(); // 调用 B.func
func(1); // 调用 F.func
}

一个混入有它自己的作用域,即使一个声明被另一个封闭的声明所重写也一样:

int x = 4;
template Foo()
{
int x = 5;
int bar() { return x; }
}

mixin Foo;
void test()
{
writefln("x = %d", x); // 输出 4
writefln("bar() = %d", bar()); // 输出 5
}





。。。。。。。。。。。。。
分享到:
评论

相关推荐

    幼儿园食品安全责任书模板5篇.docx

    2. **完善食品安全管理制度**: - 建立食品卫生安全档案,记录所售食品的留样情况。 - 维护食堂环境清洁,防止害虫滋生,确保食品加工环境的卫生。 - 生熟食品和成品、半成品分开存放,避免交叉污染。 - 实行索...

    餐厨垃圾收运处置协议模板合同手册.pdf

    该文档是关于“餐厨垃圾收运处置协议”的合同模板,主要目的是规范餐饮行业的餐厨垃圾管理,确保垃圾得到无害化处理和资源利用,防止废弃食用油脂流入食物链。以下是对合同内容的详细说明: 1. **名词定义**: - ...

    vuejs.2.x.api.pdf

    2. 自定义选项的混入策略 Vue允许开发者通过optionMergeStrategies来自定义选项的合并策略,这在使用Vue.extend扩展Vue构造器时非常有用。 3. Vue实例的生命周期钩子 在Vue实例或组件的生命周期钩子内部发生错误时...

    大气的网络科技公司网站html5模板源码.zip.zip

    2. **CSS样式**:CSS(Cascading Style Sheets)文件用于定义网页的布局和视觉样式。通常会有主CSS文件,用于全局样式,以及针对特定页面或组件的CSS文件。 3. **JavaScript**:JavaScript是实现网页动态效果的关键...

    ppt原始模板素材-105.pptx

    莫兰迪色系的特点是色彩温和、低调,不刺眼,通过将颜色混入一定的灰色,使得色彩之间产生微妙的平衡感。在PPT设计中,运用这种色系可以创造出优雅、专业的氛围,适合商业报告、学术演讲等正式场合。例如,模板中的...

    19-Mixin混入.ts

    19-Mixin混入

    19-Mixin混入.js

    19-Mixin混入

    Vue.js v2.x 官方教程_103021.pdf

    对于希望迁移到Vue.js的开发者,教程也提供了从其他框架(如Ember、Knockout、Polymer、Riot、React、AngularJS)迁移过来的指南,以及如何处理Vue 1.x到Vue 2.x的迁移过程中的常见问题。 最后,教程还介绍了如何将...

    简约风毕业论文答辩(2)PPT模板共15页.pdf.zip

    【标题】"简约风毕业论文答辩(2)PPT模板共15页.pdf.zip" 提供的是一款设计简洁、风格明快的毕业论文答辩PPT模板,共有15页内容,适合于展示和阐述学术成果。 【描述】"简约风毕业论文答辩(2)PPT模板共15页.pdf.zip...

    可爱卡通万圣节介绍PPT模板.pptx

    2. 节日PPT模板:节日PPT模板是指制作PPT时所需的模板,这些模板可以是各种节日的主题,如万圣节、圣诞节、元旦节等。 3. PPT素材下载:PPT素材下载是指下载各种PPT素材,如图片、图表、背景图片等,以便在制作PPT...

    8D报告模板.docx

    例如,报告中提到的混料问题,即在PP PM20E-2黑色原料中混入了其他白色胶粒,不良率为100%,影响了产品质量。 2. D2: 创建团队 组建一个跨职能的团队,包含不同领域的专家,如郑XX、王XX等,以确保全面解决问题。...

    vue.global.js,Vue.js 框架的核心文件之一

    `vue.global.js` 文件是 Vue.js 框架的核心文件之...4. 全局混入:使用 `Vue.mixin` 可以在所有组件中混入指定的选项。 5. 全局过滤器:使用 `Vue.filter` 可以定义全局过滤器。 6. 全局插件:使用 `Vue.use` 可以注册

    食品安全教育PPT模板.ppt

    3. 物理污染:异物如玻璃碎片、金属丝等混入食品中,可能引发伤害。 4. 食品欺诈:假冒伪劣产品、虚假标识等现象影响食品安全和消费者权益。 四、食品安全控制措施 1. 加强源头管理:确保原料安全,严格执行农产品...

    食品安全健康食物PPT模板.pptx

    3. **物理污染**:探讨异物混入食品的可能性及防范措施。 **健康食物选择** 1. **营养均衡**:讲解食物金字塔,强调蛋白质、碳水化合物、脂肪、维生素和矿物质的平衡摄入。 2. **有机食品**:对比有机食品与常规...

    bootstrap框架后台管理模板.zip

    2. **预定义样式**:Bootstrap提供了一套完整的CSS样式,包括字体、颜色、间距、按钮、表单、表格、图像、导航等,极大地简化了前端开发工作。 3. **组件库**:Bootstrap包含各种可复用的组件,如导航条(navbar)...

    Bootstrap5响应式APP软件功能界面展示网页模板.zip

    2. **预定义组件**:包括导航栏、按钮、表单、卡片、模态框、轮播图等丰富的UI组件,大大简化了网页构建过程,使得开发者可以快速创建出专业级别的界面。 3. **自定义**:Bootstrap5提供了丰富的SASS变量和混入...

    委托加工合同模板,加工合同.docx

    以下是对这份合同模板的详细解读: 1. **委托方式**:合同明确了委托加工的方式,即甲方提供原料(酒糟),乙方提取糟烧酒精,而剩余的干糟则由乙方自行处理。同时,如果甲方生产发生变化,需提前通知乙方。 2. **...

    标准的食品委托加工合同模板下载.doc

    这份标准的食品委托加工合同模板详细列出了双方的权利和义务,确保了合作的公平和透明。 **合同主要条款** 1. **订单流程**:委托方需提前x天通过传真给出订单数量,加工方在收到订单后需在指定时间内确认。订单...

    红酒(1)PPT模板.pptx

    2. **法国酿造工艺**:法国作为葡萄酒的重要产区,其酿造工艺闻名于世。通过多道复杂的酿造程序,如精心挑选葡萄、精确控制比例以及严格的窖藏过程,使得红酒的口感更加醇厚。 3. **口感升级**:红酒的口感提升得益...

Global site tag (gtag.js) - Google Analytics