d的常量与逻辑常

参考地址

但只有该例:

struct Foo
{
    mutable int len;
    mutable bool len_done;
    const char* str;
    int length()
    {
        if (!len_done)
        {
            len = strlen(str);
            len_done = true;
        }
        return len;
    }
    this(char* str) { this.str = str; }
}
const Foo f = Foo("hello");
bar(f.length);

阿里:
你是对的,const不是绝对必要的.然而,这是非常有用概念,甚至有些编程语言根本禁止变量.
不可变性很重要,有些人甚至认为D中的默认值应该是不变的.如rust等.

我们都同意那篇文章

struct Foo
{
    mutable int len;//可变

哇!一定来自D的早期.现在D中没有"可变"了.

    mutable bool len_done;
    const char* str;
    int length()
    {
        if (!len_done)
        {
            len = strlen(str);
            len_done = true;
        }

示例逻辑常概念,对象按需计算一些值,并缓存供以后使用的结果.即使下面的"f"对象是const,也可修改"len"(和len_done)成员.但是,该示例不适合今天的D,因为已标记函数"const":

int length() const {
  // ...
}

D目前没有逻辑常,但是,可使用强制转换,玩一玩.(可能是未定义的行为等).

    }
    this(char* str) { this.str = str; }
}
const Foo f = Foo("hello");
bar(f.length);

因此,有f'const'对象,并调用它的改变对象两个成员length()函数.由于这些变量不会改变对象值,因此认为对象不变.即,缓存对象部分内容不算更改该对象.这就是逻辑常的含义:发生了变化,但并未改变对象状态.


什么逻辑常?,如何使它有用?而不仅仅是(如在C++中)无硬性保证和可验证性约定.
目前,D有物理,因此缓存/懒初化不能用.逻辑常:有变化,但对外不变化.
物理常呢?本质上是由语言保证并由编译器静态验证物理数据未变的契约.表明,在操作前后,物理数据未变化.
扩展逻辑常吗?不保证物理数据不变,而是保证对象*外部可观察行为*不变的合约呢?
只要内部逻辑不变.那么行为就类似.

如,在惰初化中,应可证明外部观察到的对象值不变.外界看不见值未初化初态;仅在初化后可观察,此后不变.
缓存值同样:应可证明第一次计算值是*唯一*外部可观察值;初始计算后,该值不变.

类似,初化不变值的构造器的扩展.编译器跟踪是否已初化变量,并在构造器内部给定是否不变,而外部看不见未初化值.赋值后,编译器不强制后续更改.
类似D纯,只要外界无法区分,就可不纯操作.
应可实现逻辑常,在放宽物理不变时仍提供保证.

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