小编PL_*_*lek的帖子

如何表示共享可变状态?

我正在努力学习Rust,但我唯一要做的就是不停地试图将熟悉(对我而言)Java概念塞进其类型系统中.或者尝试使用Haskell概念等.

我想写一个有Player很多Resources 的游戏.每个人Resource都可以拥有一个Player:

struct Player {
    points: i32,
}

struct Resource<'a> {
    owner: Option<&'a Player>,
}

fn main() {
    let mut player = Player { points: 0 };
    let mut resources = Vec::new();
    resources.push(Resource {
        owner: Some(&player),
    });
    player.points = 30;
}
Run Code Online (Sandbox Code Playgroud)

它不能编译,因为我不能将资源指向播放器,同时修改它:

error[E0506]: cannot assign to `player.points` because it is borrowed
  --> src/main.rs:15:5
   |
13 |         owner: Some(&player),
   |                      ------ borrow of `player.points` occurs here
14 |     });
15 |     player.points …
Run Code Online (Sandbox Code Playgroud)

rust

7
推荐指数
2
解决办法
2558
查看次数

哈斯克尔 - 状态monad是势在思考的标志吗?

我正在写一个简单的游戏 - 俄罗斯方块.在我生命中我第一次使用函数式编程来实现这个目标,作为我选择Haskell的语言.然而,我被OOP和命令式思维所污染,害怕无意识地将这种心态运用到我的Haskell程序中.

在我游戏的某个地方,我需要有关于经过时间(计时器)和按下/向下键(键盘)的信息.转换为Haskell的SDL课程中使用的方法如下所示:

Main.hs

data AppData = AppData {
    fps :: Timer 
    --some other fields    
}

getFPS :: MonadState AppData m => m Timer
getFPS = liftM fps get

putFPS :: MonadState AppData m => Timer -> m ()
putFPS t = modify $ \s -> s { fps = t }

modifyFPSM :: MonadState AppData m => (Timer -> m Timer) -> m ()
modifyFPSM act = getFPS >>= act >>= putFPS
Run Code Online (Sandbox Code Playgroud)

Timer.hs

data Timer = Timer { …
Run Code Online (Sandbox Code Playgroud)

oop monads haskell state-monad game-engine

5
推荐指数
1
解决办法
705
查看次数

Netwire 5 - 墙壁的反弹物体

我正在努力了解FRP和Netwire.我最好的实用知识来源是这篇文章,但它有点过时,因为它是用Netwire 4编写的,我使用的是5.0版.我希望玩家控制正方形,从屏幕边缘反弹.

根据这篇文章,我有这个:

acceleration :: (Monad m, Monoid e) => Wire s e m (Set SDL.Keysym) Double
acceleration  =  pure (-80) . when (keyDown SDL.SDLK_LEFT)
                    <|> pure 80 . when (keyDown SDL.SDLK_RIGHT)
                    <|> pure 0

velocity :: (Monad m, HasTime t s, Monoid e) => Wire s e m (Double, Bool) Double
velocity = integralWith limit 0
    where limit collision v = let newV = if collision then -v else v in clampMax maxV newV


challenge2 :: (MonadFix …
Run Code Online (Sandbox Code Playgroud)

haskell netwire

5
推荐指数
1
解决办法
492
查看次数

为什么我不能将盒装的矢量内容借用为可变的?

为什么这不编译:

fn main() {
    let mut b = Box::new(Vec::new());
    b.push(Vec::new());
    b.get_mut(0).unwrap().push(1);
}
Run Code Online (Sandbox Code Playgroud)

虽然这样做:

fn main() {
    let a = Box::new(Vec::new());
    let mut b = *a;
    b.push(Vec::new());
    b.get_mut(0).unwrap().push(1);
}
Run Code Online (Sandbox Code Playgroud)

这也是:

fn main() {
    let mut b = Vec::new();
    b.push(Vec::new());
    b.get_mut(0).unwrap().push(Vec::new());
    b.get_mut(0).unwrap().get_mut(0).unwrap().push(1)
}
Run Code Online (Sandbox Code Playgroud)

第一和第三个对我来说是概念上是相同的- Box一中Vec的TOR Vec整数的职责范围和Vec的TOR Vec的TOR Vec整数的职责范围,但最后一个导致每个向量是可变的,而第一个使内部矢量不变.

vector rust

5
推荐指数
1
解决办法
1482
查看次数

标签 统计

haskell ×2

rust ×2

game-engine ×1

monads ×1

netwire ×1

oop ×1

state-monad ×1

vector ×1