【发布时间】:2015-08-04 17:55:51
【问题描述】:
我正在尝试制作一个简单的不可变 Interval 类型。它有一个 start 和一个 end 属性。有没有一种直接的方法可以利用 immutable-js 库来创建您自己的自定义不可变类型?
我目前使用 Immutable.Map 和 Immutable.List 的包含模式的尝试效果不佳。例如,difference 应该返回一个不可变的 Interval 列表,但是因为它创建了新的 Interval 实例,所以它返回的 List 不会通过相等性。
感觉好像我采取了错误的方法,但我不确定如何。我可以很容易地用Immutable.Map 表示数据,但我想在它的公共接口中包含difference,而不是包含像get 和set 这样的通用Map 方法。即我希望它是不可变的,但它是具有自己接口的自己的类型。
var Immutable = require('immutable')
function Interval(start, end) {
this.value = Immutable.Map({
start: start,
end: end
})
}
Interval.prototype.start = function () {
return this.value.get('start')
}
Interval.prototype.end = function () {
return this.value.get('end')
}
Interval.prototype.equals = function(interval) {
return this.value.equals(interval.value)
}
Interval.prototype.difference = function (subtrahend) {
var nonoverlapping = subtrahend.start() > this.end() || subtrahend.end() < this.start()
return nonoverlapping ? Immutable.List.of(this) :
Immutable.List.of(
new Interval(this.start(), subtrahend.start()),
new Interval(subtrahend.end(), this.end())
)
.filter(function(interval) {
return interval.end() > interval.start()
})
}
一些测试:
it('should return an empty array for an exact difference', function() {
var interval = new Interval(80, 90)
interval.difference(interval)
.equals(Immutable.List())
.should.be.true
})
it('should return an array with the same Interval for a missed difference', function() {
var interval = new Interval(80, 90)
console.log(interval.difference(new Interval(50, 60)).toJS());
interval.difference(new Interval(50, 60))
.equals(Immutable.List.of([
{ value: Immutable.Map({ start: 80, end: 90 }) }
]))
.should.be.true
})
【问题讨论】:
标签: javascript immutability immutable.js