d静态导入对象

Posted fqbqrr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了d静态导入对象相关的知识,希望对你有一定的参考价值。


​原文​

d静态导入对象

你知道可​​静态导入对象​​​并抑制​​自动隐式导入​​吗?

static import object;

​IainBuclaw​​​在​​github​​​评论中指出​​D编译器​​​将不会​​隐式导入对象(import object;)​​​;如果在定义​​模块​​​后的​​第一件事​​​是你自己的​​静态导入对象;​

module test;
static import object;

void main()

编译会提示从​​object.d​​​来的未定义​​_d_cmain​​标识符错误.当然,可只导入需要的:

module test;
static import object;
import object :, string, idup;

void main()
string s = "foo".idup;

工作.但有趣的是,在​​D中​​​隐式​​导入​​​的内置​​对象模块​​​定义.
如,​​​串​​​不是语言​​关键字​​​.相反,与​​dup,idup​​​相同,是在​​object​​模块中定义的.

alias string = immutable(char)[];

是的,可​​局部​​覆盖它们:

module test;
alias string = int;
void main()
string s = "foo".idup;

错误:无法隐式转换​​idup("foo")​​​串类型为​​int​​​.
这是因为与​​​查找​​​其他符号相同的​​查找规则​​.如果:

module test;
alias string = int;//转为整.
void main()
object.string s = "foo".idup;//串类型

现在查找​​对象​​模块并工作.

回到​​静态导入对象​​​,看看​​以为​​​内置但并不是的​​其他东西​​.

module test;
static import object;

import object :;

void main()
object.string s = "foo";

​_d_cmain​​​是什么东西?
包含​​​Cmain​​​及用来初化​​druntime​​​并调用​​Dmain​​​的​​函数​​​的模板.编译器对包含​​D主函数​​​声明的​​模块​​​都会生成​​mixin _d_cmain();​​​来注入​​代码​​进模块.

​ddoc​​​会生成,但​​dpldocs.info​​​不会.
注释说"​​​这段代码​​.

module test;
//不必,只需如下局部覆盖
// static import object;
// import object : _d_cmain;//这一行,就覆盖了.
template _d_cmain()
extern(C) int main()
return 0;
//生成主函数.


void main()
import core.stdc.stdio;
printf("你好,D!\\n");

编译运行,看到​​你好,D​​​了吗?没有!定义的​​_d_cmain​​​覆盖了你的!
要求编译器用​​​object._d_interpolated​​​而不是仅​​_d_interpolated​​​来禁止​​局部​​​覆盖.然而,显然​​dmd​​​自身并没有那么严格.
这是用户偶然调用​​​object.destroy​​​,引起.应该这样用​​object​​模块:

static import object;
import object ...;


以上是关于d静态导入对象的主要内容,如果未能解决你的问题,请参考以下文章

无法导入名称抑制 Python 2.7

抑制 Java 中不推荐使用的导入警告

导入模块时抑制 scapy 警告消息

模电中差分放大电路对共模信号的输出为零,我很不理解,抑制零点漂移的同时不是把原信号也搞没了吗?

Effective Java 学习笔记之创建和销毁对象

jsp静态导入和动态导入