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 @ 2022-06-11 09:59  zjh6  阅读(11)  评论(0)    收藏  举报  来源