d区间到可空转换

原文
转换为可空:

@safe Nullable!Item getItem(int _id)
  {
    import std.algorithm : filter;

    with (items.filter!(item => item.id == _id))
    {
      if (empty)
        return Nullable!Item.init;
      else
        return front.nullable;
    }
  }

这样:

import std;

// 拼写?
auto nullablelize(R)(R range) {
  alias E = Nullable!(ElementType!R);

  struct Nullablelize {
    enum empty = false;

    auto front() {
      if (range.empty) {
        return E();

      } else {
        return E(range.front);
      }
    }

    void popFront() {
      if (!range.empty) {
        range.popFront();
      }
    }

    // 其它区间算法,如save(),等等
  }

  return Nullablelize();
}

void main() {
  // 可取10个还没错.
  writeln(iota(5)
          .filter!(i => i % 2)
          .nullablelize
          .take(10));
}

用了辅助方法+结构,或这样:

import std.range, std.typecons;

Nullable!(ElementType!R) maybeFront(R)(auto ref R r)if (isInputRange!R)
{//取元素类型.
    if (r.empty)
        return typeof(return)();//返回类型.
    else
        return nullable(r.front);//可空.
}

unittest
{
    int[] a = [1, 2, 3];
    int[] b;

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