鉴于函数式编程在尽可能多地坚持不可变变量时是最好的,并且Ramda总是生成浅层副本,必须的对象如何在一个纯粹的功能框架中处理? ?
例如,考虑PIXI.Sprite(在pixi.js中)。显示系统具有固有的层次结构,它连接在一起并有自己的跟踪对象的方式,因此它可以重复使用纹理等。垃圾收集它们可能是一个真正的问题。
可以采取哪种方法来解决这个问题(以及类似钠类型的强大frp系统)?
具体来说,可以改进这种方法:
使用某种unsafePerformIO()函数来修改重物。这些对象的所有修改只能通过该功能完成。
轻量级元信息对象带有所有逻辑。
这些轻量级信息对象直接引用重物
下面是Typescript中的完整代码示例,用于演示它的运行情况(只需要导入PIXI和Ramda)。关键行在gameLoop()中:
let app = new PIXI.Application(window.innerWidth, window.innerHeight);
document.body.appendChild(app.view);
let ball = new PIXI.Graphics();
ball.beginFill(0xFF0000);
ball.drawCircle(0,0,40);
ball.endFill();
ball.y = app.stage.height/2;
app.stage.addChild(ball); //app
let ticker = new PIXI.ticker.Ticker();
ticker.add(gameLoop);
ticker.start();
let ballReference = {
ptr: ball,
x: 0
}
function performUnsafeIO(reference) {
reference.ptr.x = reference.x;
}
function gameLoop(deltaTime:number) {
//this version breaks!
//ball = R.assoc('x', ball.position.x + deltaTime * 1, ball);
//This works fine... but are there any gotchas?
ballReference = R.assoc('x', ballReference.x + deltaTime * 1, ballReference);
performUnsafeIO(ballReference);
}
(请注意,通过Google发现的此对话是一个很好的参考点:https://web.archive.org/web/20100410001213/http://itmmetelko.com/blog/2008/02/23/functional-programming-immutable-objects-explained-irc-style/)