- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Ubuntu 13.04 64 位上使用 DMD64 D 编译器 v2.063.2。
我写了一个类如下:
class FixedList(T){
// list
private T[] list;
// number of items
private size_t numberOfItems;
// capacity
private size_t capacity;
// mutex
private Mutex listMutex;
// get capacity
@property public size_t Capacity(){ return capacity; }
@property public shared size_t Capacity(){ return capacity; }
// constructor
public this( size_t capacity ){
// initialise
numberOfItems = 0;
this.capacity = capacity;
writeln("Cons Normal");
}
// constructor
public shared this( size_t capacity ){
// initialise
numberOfItems = 0;
this.capacity = capacity;
// create mutex
listMutex = cast(shared)(new Mutex());
writeln("Cons Shared");
}
}
虽然类是这样编写的,但在 main 函数中,我编写了该代码:
auto list1 = new shared FixedList!int( 128 );
auto list2 = new FixedList!int( 128 );
这样输出,完全没有错误,输出如下:
Cons Shared
Cons Normal
接下来我要做的是从代码中删除 writeln
行,当我重新编译代码时,它开始显示错误消息,如下所示:
src/webapp.d(61): Error: constructor lists.FixedList!(int).FixedList.this called with argument types:
((int) shared)
matches both:
lists.d(28): lists.FixedList!(int).FixedList.this(ulong capacity)
and:
lists.d(37): lists.FixedList!(int).FixedList.this(ulong capacity)
src/app.d(61): Error: no constructor for FixedList
src/app.d(62): Error: constructor lists.FixedList!(int).FixedList.this called with argument types:
((int))
matches both:
lists.d(28): lists.FixedList!(int).FixedList.this(ulong capacity)
and:
lists.d(37): lists.FixedList!(int).FixedList.this(ulong capacity)
src/app.d(62): Error: no constructor for FixedList
make: *** [all] Error 1
基本上 writeln
函数可以防止错误。实际上 writeln
在很多地方都被阻止,我不确定为什么会发生这种情况。
我什至尝试使用 m32
标志编译 32 位代码,但它仍然是相同的。我做错了什么,还是这是一个错误?
最佳答案
pure
, nothrow
,和@safe
被推断为模板函数。如FixedList
是模板化的,它的构造函数也是模板化的。 writeln
不是(也不可能是)pure
就像 I/O 一样。所以,虽然writeln
在构造函数中,它们被推断为不是 pure
,但构造函数所做的其他所有事情都是 pure
,因此无需调用 writeln
,他们变成pure
.
在某些情况下,编译器能够更改 pure
的返回类型函数将其隐式转换为 immutable
或shared
。这是有效的,因为在这些情况下,编译器知道返回的是一个新的、唯一的对象,并将其强制转换为 immutable
或shared
不会违反类型系统。并非全部pure
函数符合条件,因为参数类型会影响编译器是否可以保证返回值是唯一的,但很多 pure
函数能够利用这一点并将其返回值隐式转换为 immutable
或shared
。这很有用,因为它可以避免代码重复(对于不同的返回类型)或复制 - 因为如果返回的类型与 immutable
所需的类型不匹配或shared
,并且您不能保证它不会在其他地方被引用,您必须复制它才能获得您想要的类型。在这种情况下,编译器能够保证该对象不会在其他地方引用,因此它可以安全地为您转换它。
构造函数有效地返回新值,因此它们可能会受到此功能的影响。这使得如果构造函数是 pure
,您通常可以构造 immutable
和shared
从中获取值,而不必复制构造函数(就像如果不是 pure
则必须这样做)。与其他pure
一样函数,这是否有效取决于构造函数的参数类型,但这通常是可能的,并且有助于避免代码重复。
导致您出现问题的是当FixedList
时的构造函数都是 pure
,编译器可以使用它们中的任何一个来构造 shared
目的。因此,它不知道该选择哪一个,并且会给您一个歧义错误。
我已将此报告为 bug理论上编译器应该更喜欢显式标记为 shared
的构造函数,但是编译器开发人员会决定什么,我不知道。能够隐式转换 pure
的返回值函数是一项相当新的功能,我们仍在探索何时可以或不能进行这些隐式转换,这可能会导致意想不到的问题(就像这个可能是的)以及编译器错误(例如,至少有一种情况)与 immutable
,目前它不应该进行转换)。我相信这些问题很快就会得到解决。
关于oop - 没有 writeln 时找不到构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17673721/
我是 D 的新手,我只是在尝试。我正在使用的一本书给了我一个通用二进制搜索方法的例子。然后我想制作我自己的主要方法来打印结果只是为了好玩。我来自 Java,其中字符串连接只是使用 + 运算符完成的。
自恐龙时代以来,Turbo Pascal 和现在的 Delphi 都有 Write() 和 WriteLn() 过程,可以悄悄地做一些巧妙的事情。 参数数量可变; 每个变量可以是各种类型;您可以提供整
使用 writef() ,我可以控制一个浮点数的输出精度,例如: writef( "%20.15dr\n", 1.0 / 3.0 ); // 0.333333333333333 但如果我使用
D 版的 Hello World 如下所示: import std.stdio; void main(string[] args) { writeln("Hello World, Reload
我有以下代码(RAD Studio XE2,Windows 7 x64): program letters; {$APPTYPE CONSOLE} {$DEFINE BOO} const ENGL
我正在尝试为一周中的几天创建自定义数据类型,但我无法让它写入。编译器错误如下: [Error] hours.dpr(28): Illegal type in Write/Writeln stateme
我有以下代码(RAD Studio XE2,Windows 7 x64): program letters; {$APPTYPE CONSOLE} {$DEFINE BOO} const ENGL
我在 Ubuntu 13.04 64 位上使用 DMD64 D 编译器 v2.063.2。 我写了一个类如下: class FixedList(T){ // list private
当我想用这种语法编写 html 文档时,我在控制台中收到错误消息: doc.writeln (" $e.html($(e).html().split(text).join('' + text + '
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
// 在上面的代码中,如果引用 The writeln() method is identical to the write() method, with the addition of
用下面一行代码: document.writeln("blahblahblah") 我希望内容单独占一行,但内容被插入,但没有换行。只有一个空间。 这是预期的吗? 最佳答案 新行将仅显示在代码输出标签
考虑这个程序: {$APPTYPE CONSOLE} begin Writeln('АБВГДЕЖЅZЗИІКЛМНОПҀРСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ'); end.
我只是在写一些简单的代码,我注意到使用 document.writeln 不会写入新行,请允许我演示... // this is my JSON object var myObject = {
如何使用 writeln 在 Pascal 中打印撇号符号功能? 例子: writeln('My brother's book'); 无法工作,因为 s book没有“写”函数,所以编译器返回一个错误
晚安,我在 Embarcadero 10.2 上遇到 writeln 问题,我正在尝试将 sin() 函数编写为泰勒展开式无限系列。 一切都运行良好,但输出在科学表达式中,如:3.6044848692
对于较新的 Delphi 版本,支持 OSX 和 Android,是否有一种独立于平台的方法来检测 Writeln至 Output可以安全使用吗? 输出文档包含一条注释 Most processes
我在 Firefox 版本 27.0.1 上遇到此问题 当我使用 document.writeln('whatever'); 我无法使用简单的 setTimeout 函数,甚至无法使用警报。 我可以在
这是一个演示我的问题的小工具:http://plnkr.co/edit/322WB4jyCJberABbb0P0 我正在针对不同的问题进行一些测试,并且遇到了一些意外的行为。 var A = func
问候, 下面的代码适用于alert,但不适用于document.writeln。是因为onload事件吗?如果是这样,浏览器在完成加载后是否应该能够添加更多元素? - 尝试了解它是如何工作的(同时我正
我是一名优秀的程序员,十分优秀!