概述

MayBe是可能会是,可能会是空值的情况,我们可以通过MayBe来处理,在上一小结我们使用Functor的时候,如果出现了空值,这个时候会出现异常,而MayBe函子可以帮我们去处理空值的这种情况。

我们在编程的过程中可能会遇到很多的错误,我们需要对这些错误做处理,MayBe函子的作用就是对外部空值的情况做处理。

外部传递空值我们可以认为是一种副作用,而MayBe函子可以控制这种副作用发生。下面我们来演示一下MayBe函子。

我们首先创建一个MayBe的类,

class MayBe {
    static of (value) {
        return new MayBe(value)
    }
    constructor (value) {
        this._value = value;
    }
    map (fn) {
        return MayBe.of(fn(this._value)); 
    }
}

MayBe函子要去结局传入的值可能为null的情况,我们在map中处理这个值之前需要判断一下这个值是否为null或者undefined。

我们写一个辅助的函数用来判断当前的值是否为空,我们写一个isNothing方法判断this._value是否有值。

class MayBe {
    static of (value) {
        return new MayBe(value)
    }
    constructor (value) {
        this._value = value;
    }
    map (fn) {
        return MayBe.of(fn(this._value)); 
    }
    isNothing () {
        return ths._value === null || this._value === undefined;
    }
}

然后我们在map方法里面,在执行fn之前我们需要判断一下this._value是否为空,如果当前的值是空的话,我们不能去调用fn,我们应该返回一个值为null的函子,如果有值我们再调用fn,这里我们使用三元表达式。

class MayBe {
    static of (value) {
        return new MayBe(value)
    }
    constructor (value) {
        this._value = value;
    }
    map (fn) {
        return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value)); 
    }
    isNothing () {
        return ths._value === null || this._value === undefined;
    }
}

此时如果我们传入的是null,我们代码不会报错,而是会返回一个值为null的新的MayBe函子。

接下来我们再来看MayBe函子的一个问题,虽然我们可以处理空值的问题,但是如果多次调用map方法的时候,哪一次出现了空值,我们是不太明确的。