D - 纯粹的类和结构

Mic*_*ail 3 d

出于好奇心,我输入了以下代码:

pure struct Foo{ }
pure class Bar{ }
Run Code Online (Sandbox Code Playgroud)

显然,这与DMD和LDC都有关.我不知道它做了什么(如果它),因为从这样的结构/类调用不纯的函数是可以的.那么,附加pure到类或结构的变化是什么?

Jon*_*vis 8

一般来说,D倾向于在不应用时忽略属性,如果没有别的话,因为通用代码更容易以这种方式编写(有时,它避免必须编写一堆静态ifs以避免将属性应用于代码,它们不会产生任何影响) - 一个例子是你可以static在模块级别上放置几乎任何声明,但它实际上并没有为大多数声明做任何事情,并且编译器不会抱怨它.

但是,无论出于何种原因,当您使用它们标记结构或类时,应用属性的方式有点不一致.例如,如果您使用了标记结构或类@safe,则该结构或类中的每个函数都将被@safe标记为@trusted@system.相反,如果你用类标记类或结构pure,它绝对没有 - 就像用static.它完全被忽略了.

我最好的猜测,为什么像@safe被应用到所有的结构或类中的功能,而像一个属性pure或者nothrow被忽略的是@safe,@trusted@system可以在结构或类中的特定功能,通过使用不同的属性明确撤销在该函数上,而对于大多数属性,没有办法扭转它们.

然而,不幸的是,当一个类或结构不适用时,或者当它们只应用于类或结构中的声明而不是类或结构本身时,你可以用属性标记一个类或结构的事实确实会使人混淆(例如一些人们认为这immutable class C {..}意味着类的特殊之处,当它意味着类中的声明是immutable;它与做的没什么不同class C { immutable { ... } }).因此,最终,您必须熟悉每个属性实际应用于类或结构时实际知道的内容,当它们真正应用于类或结构内部的声明时,以及它们被简单地忽略时.

就个人而言,我从不将属性应用于类或结构,除非它们专门用于应用于结构或类而不是应用于其中的函数(例如final,在类上意味着将某些内容放在该类中的函数之外),并且实际应用于结构或类的属性数量非常少.static确实在某些情况下(只是没有在模块级),abstractfinal为班级做,并访问修饰符(public,private,等)做的.每个TDPL,synchronized也应该是特殊的类,但是同步类从未真正实现过(只是同步函数).所以,我可能会错过一个,但是从我的头顶,这实际上可以适用于结构或类属性的完整列表,以及所有其他被忽略或者在结构或类中申请的声明但不是结构或类本身.