d的@属性状态
它甚至进度不到1/10.
它几乎什么都不做.唯一可辨别的区分是typeof:
struct S
{
int prop1() { return 1; }
@property int prop2() { return 2; }
}
pragma(msg, typeof(S.prop1)); // int()
pragma(msg, typeof(S.prop2)); // int
有一段时间,我们有一个-property可以强制执行某些规则的开关,但它也被删除了.
从今天开始,我会忽略@property.如果有人在使用它,就假装它是一个正常的功能.
我会继续无视.反正我们有inout功能,功能都是一样的
我个人把它用于文档,因为它清楚地表明了所述函数的意图.
为什么不推荐?
当您需要发展API并把用户从A迁移到B数据成员时,它很有用,例如:
struct S
{
@property string old_member() const { return new_member; }
string new_member;
}
//或当你想审计时
struct S
{
@property string member() const
{
writeln("'member' is used by ", environment["USER"]);
return _member;
}
string _member;
}
我不反对弃用@property属性,但我相信D必须支持obj.mem表达式调用obj.mem()函数时的用例(这通常称为属性函数)
没有@property,上面也可用,且在D1时代就实现了.
这样,就可以了:
import std;
void main()
{
S s;
s.new_member = "foo";
s.old_member.writeln;
}
struct S
{
string old_member() { return new_member; }
string new_member;
}
@property的一个好处是它允许编译器自动推导.所以它表现得像动但更优越!例如:
import std.stdio;
struct ReverseS(int size)
{
private char[size] bytes;
private int index = size - 1;
@property empty() {
return index < 0;
}
@property front() {
return bytes[index];
}
@property popFront() {
--index;
}
}
void main()
{
char[9] text = "ytreporp@".dup;
foreach(c; ReverseS!9(text)) {
c.write;
}
writeln; // @property
}
浙公网安备 33010602011771号