我正在制作玩具roguelike,并且有一个Level用于存储游戏地图的结构,其中最天真的实现是2D矢量.
我下面这个教程它采用Vector的VectorS,但指出,对于性能提升它也可以使用一个单一的Vector大小MAP_HEIGHT * MAP_WIDTH,并在访问瓷砖(x, y)可以简单地访问map[y * MAP_WIDTH + x].
我正在尝试实现这种更快的方法,但使用getter和setter是笨重的,公共字段也不是那么好.我更喜欢它感觉像2D矢量.
为了做到这一点,我需要Index为我的班级实现特质,但我不确定如何得到我想要的结果.也许通过嵌套impls?我真的不知道.
这是我的代码尝试实现Index我的结构,这显然不适用于我的目的,因为它是一维的:
const MAP_WIDTH: i32 = 80;
const MAP_HEIGHT: i32 = 45;
pub struct Level {
map: Vec<Tile>,
}
impl Level {
pub fn new() -> Self {
Level { map: vec![Tile::empty(); (MAP_HEIGHT * MAP_WIDTH) as usize] }
}
}
impl std::ops::Index<i32> for Level {
type Output = …Run Code Online (Sandbox Code Playgroud) 我读你学习哈斯克尔(到目前为止爱它),并教导如何实现elem来讲foldl,使用Lambda.lambda解决方案对我来说似乎有点难看所以我试着考虑其他实现(全部使用foldl):
import qualified Data.Set as Set
import qualified Data.List as List
-- LYAH implementation
elem1 :: (Eq a) => a -> [a] -> Bool
y `elem1` ys =
foldl (\acc x -> if x == y then True else acc) False ys
-- When I thought about stripping duplicates from a list
-- the first thing that came to my mind was the mathematical set
elem2 :: (Eq a) => a -> [a] -> …Run Code Online (Sandbox Code Playgroud) 我读到CL支持可选的输入(因为在语言中有这个功能)在很多情况下我会假设allos用于更快的代码,但我似乎找不到任何关于实际编写类型代码的东西.是否可以显式键入代码而不是使用黑客?(例如,#'vector生成一个simple-vector,有点让我想起|0JS强制转换为整数)
或者也许因为类型实际上是CLOS类(它们是,对吧?)你只需要#'make-instance一个类型的对象,比方说,'integer?
benchmarking ×1
common-lisp ×1
haskell ×1
memoization ×1
rust ×1
syntax ×1
typed ×1
types ×1
typing ×1
vector ×1