MayBe函子
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
前言
在上一篇的结尾我们说了demo有一些小毛病,在本章节我们会进行一下问题的处理
MayBe函子
- 我们在编程的过程中可能会遇到很多错误,需要对这些错误做相应的处理
Maybe
函子的作用就是可以对外部的控制情况做处理(控制副作用在允许的范围)
简单函子:
class MayBe{
static of(value) {
return new MayBe(value)
}
constructor(value){
this._value = value
}
map(fn){
return MayBe.of(fn(this._value))
}
}
我们这样执行会出现一点情况,null和undefined的时候会出现报错的,所以我们要进行一下代码升级
升级2.0版本
辅助函数: 判断是否为空
isNothing() {
return this._value === null || this._value === undefined
}
修改map
函数
map(fn) {
// 如果不为空或者undefined,正常执行
return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value))
}
完整代码
class MayBe{
static of(value) {
return new MayBe(value)
}
constructor(value){
this._value = value
}
map(fn) {
// 如果不为空或者undefined,正常执行
return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value))
}
isNothing() {
return this._value === null || this._value === undefined
}
}
测试:
正常输入:
let r = MayBe.of('hello world').map(x => x.toUpperCse())
console.log(r) // 预期结果:MayBe { _value: 'HELLO WORLD' }
正常输入的时候和我们的预期结果是一样的,但是我们需要测试的null
和undefined
还没有进行测试
输入null
:
let r = MayBe.of(null).map(x => x.toUpperCse())
console.log(r) // 预期结果:MayBe { _value: null }
测试如我们的预期,没问题
输入undefined
:
let r = MayBe.of(null).map(x => x.toUpperCse())
console.log(r) // 预期结果:MayBe { _value: null }
测试如我们的预期,没问题
个别小问题:
let r = MayBe.of(null).map(x => x.toUpperCse()).map(null).map(x => x.split(' '))
console.log(r) // 输出为:MayBe { _value: null }
虽然我们可以处理空值的问题,但是多次调用map的时候,什么时候出现了空值,我们却不知道,所以就需要一个新的函子了,下一章Either函子见!