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
}
posted @   zjh6  阅读(208)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示