Javascript 修改可变对象的方法?
考虑到函数式编程在尽可能多地坚持不可变变量的情况下是最好的,而且Ramda总是进行浅拷贝,那么必须可变的对象如何在一个基本上纯函数式的框架中处理呢Javascript 修改可变对象的方法?,javascript,functional-programming,pixi.js,ramda.js,Javascript,Functional Programming,Pixi.js,Ramda.js,考虑到函数式编程在尽可能多地坚持不可变变量的情况下是最好的,而且Ramda总是进行浅拷贝,那么必须可变的对象如何在一个基本上纯函数式的框架中处理呢 例如,考虑Pix.SpRITE(在Pix.js)中。显示系统有一个内在的层次结构,它链接在一起,并有自己的跟踪对象的方式,因此它可以重复使用纹理等。垃圾收集它们可能是一个真正的问题 可以采取什么样的方法来处理这一问题(以及像Na钠typescript这样强大的frp系统) 具体而言,这种方法是否可以改进: 具有某种unsafePerformIO()函
例如,考虑Pix.SpRITE(在Pix.js)中。显示系统有一个内在的层次结构,它链接在一起,并有自己的跟踪对象的方式,因此它可以重复使用纹理等。垃圾收集它们可能是一个真正的问题
可以采取什么样的方法来处理这一问题(以及像Na钠typescript这样强大的frp系统) 具体而言,这种方法是否可以改进:(注意,通过谷歌找到的这段对话是一个很好的参考点:)这是一个有趣的问题,但并不符合SO准则:。我认为您可以通过提供一个用代码表达您的问题的小片段来提高这个(已经很好的)问题的质量。谢谢您的提示,我将尝试通过codeLook进入功能镜头,特别是
设置
和映射
操作,来更清楚地演示问题。这是一个必须的链接。而你实际上正在寻找的技术叫做。从这个意义上讲,镜头可以给你一种非常原始的持久性。
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);
}