coffeescript
因此,您正在编写CoffeeScript,并且有一个需要处理的列表。 在JavaScript中,可以使用各种各样的方法(双关语)来简化生活,但是CoffeeScript为您提供了简洁而一致的语法的优点。 jQuery的forEach()
调用和对(出色的)Underscore库的调用不是循环的混搭,而是可以以简洁易懂的方式完成所有工作。
如果您从中间开始,那会以为您正在阅读Python教程是可以原谅的。 事实上,如果您是Python的资深人士,则可以跳过本文,开始猜测,并可能为自己做得很好。 但是,对于我们其余的人来说,这是我在处理列表中的三种最喜欢的技术时的总结 Python CoffeeScript。
切片和切块
假设您要创建一款混合赛车/购物游戏Cario Mart。 在游戏中,您可以让人们购买蘑菇和贝壳以用于汽车(不要问)。 为了使游戏更加有趣和更具竞争力,您希望使第六,第七和第八名的玩家(输掉的玩家)便宜一些。 这是在CoffeeScript中执行此操作的一种方法,假设玩家列表是根据他们所在的位置排序的:
if player == players[5] or player == players[6] or player == players[7]
blueShroom.cheaperFor(player)
本质上,您是在将相关玩家与最后一位玩家进行比较。 但是,您正在重复自己。 这是一个稍微更好的实现,只提到了一个问题播放器:
if player in [players[5], players[6], players[7]]
blueShroom.cheaperFor(player)
但是这是一个充分利用CoffeeScript语法的实现:
if player in players[5..7]
blueShroom.cheaperFor(player)
现在,如果您要更改任何内容(您正在比较的玩家,正在使用的玩家列表,想要影响的位置),则只需在一处更改即可。 最后一个优化-假设您的游戏突然扩展到9个人,而不是8个人。 目前,排名6-8的玩家将受益,而排名第9的贫困玩家将受苦。 让我们先解决这个问题,然后再继续进行下去,以便任何人获得第六名和更低的收益:
if player in players[5..]
blueShroom.cheaperFor(player)
清单理解
所以您在第七位,您刚刚购买了蓝色蘑菇。 现在您要使用它。 在这种情况下,一个蓝色的蘑菇会进入其他所有人的油箱中,并使其汽车随机燃烧。 哎哟! 那会让他们退缩几秒钟。 您现在从代码中需要的是一种攻击除了您自己以外的所有人的方法。
这里有一个版本,只需要在形式优势的CoffeeScript语法的unless
和is
关键字和条件在声明的末尾加载,但在列表的方式,也没有做太多。
players.forEach (target) ->
blueShroom.poison(target) unless target is buyer
您还将注意到第二行是匿名函数。 CoffeeScript几乎使您忘记了这一点。 这是一个使代码更模糊的版本,使其更接近英语。
for target in players
blueShroom.poison target unless target is buyer
这是一个使用列表推导的方法:
blueShroom.poison target for target in players unless target is buyer
哇,那是迄今为止最类似于英语的代码! 如果不确定发生了什么,请回过头看一下类似于代码的版本。 这是使用更多的CoffeeScript关键字的一种,其英文流稍好一些:
blueShroom.poison target for target in players when target isnt buyer
请注意,此语法不适用于前两个版本,仅适用于使用列表推导的第三个版本。
如此令人敬畏的是,列出理解有两个陷阱:
- 列表推导会返回一个列表(在这种情况下,是中毒目标的列表)。 如果您想“堆叠”列表推导,这很好,但是如果堆叠两个以上,它很快就会变得混乱。 如果您省略了可选的括号和括号,则尤其如此。
- 因为这看起来很像英语,所以您有时可能会写一个有效的英语句子,但感到惊讶,因为它没有被编译。 尽管CoffeeScript付出了很多努力使您的代码像英语一样,但是如果您错误地认为它们是同一件事,那么您将很快被带回现实。
摔得痛
真是个有趣的词。 这也与我们的情况有关。 您会看到,我们正在尝试使我们的Cario Mart游戏通过网络运行,并且我们希望有一种方法可以轻松地向多个玩家发送消息。 这是我们编写的可帮助我们的函数:
tellPlayers = (message) ->
player.socket.emit(message) for player in players
一些注意事项。 首先,很好地使用列表推导! 这些东西的用途将在数量惊人的地方弹出。 其次,我们在这里所做的是向WebSocket上的每个连接的播放器发送一条消息。 您不必担心这里到底发生了什么 ,也不用担心我们为什么要这样做 ,但基本的前提是每个游戏最多有八个客户端,所有客户端都连接到中央服务器。 该代码位于服务器上,并正在向所有游戏玩家(客户端)发送消息。
如果消息很简单(例如gameEnded
,则效果gameEnded
。 但是,如果比赛结束时我们想将胜利者的名字发送给所有人该怎么办? 我们可以这样写:
tellPlayers = (message, argument) ->
player.socket.emit(message, argument) for player in players
现在可以使用,但是如果有人碰到武器(例如蓝色的垃圾)时我们发送“摔跤”消息怎么办? 在这里,我们想知道武器,玩家命中以及发动攻击的玩家。 那是三个论点! 解决此问题的方法是通过splats。
tellPlayers = (message, arguments...) ->
player.socket.emit(message, arguments...) for player in players
当您将三个点放在后面时,这意味着参数实际上是参数列表。 可以有1、3、0或任意数量的参数。 就像您把列表扔了,所有单独的论点都散布在墙上。
这是另一个例子。 我们会将根据比赛成绩排序的玩家列表通过套接字发送给每个客户。 服务器端代码将如下所示:
tellPlayers('listOfPlayers', players...)
![](https://i-blog.csdnimg.cn/blog_migrate/b3bf15592b23c793bce70a9351de1c95.png)
免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95 您的完全免费
这将调用我们先前的函数。 在客户端,我们有以下内容:
socket.on 'listOfPlayers', (first, second, third, rest....) ->
celebrate(first)
celebrate(second)
celebrate(third)
hands.clap() for hands in rest
整个玩家列表会使用splat传递到套接字上,然后在收到消息后,会挑选前三名进行庆祝, rest...
splat吸收其余的。
当你打电话是很重要的tellPlayers
您使用的图示players
。 否则,它将把整个列表作为第一个参数,导致客户端庆祝所有八个玩家,然后庆祝两个null
值,然后没人拍手。 我们不能拥有那个!
你的选择
本文向您介绍了CoffeeScript必须提供的三种最受欢迎的列表处理技术。 在CoffeeScript中,还有许多其他的小捷径和语法欢乐炸弹在等着您。 访问主页并尝试一下!
此外,SitePoint刚刚发布了其Jump Start系列中的最新产品: Jump Start:CoffeeScript 。 了解如何使用CoffeeScript制作充满真人忍者HTML5 2D平台游戏…整个一个周末!
最后,在Learnable上 ,Paul Annesley将带您看一看关于CoffeeScript的JumpCast短视频。 令人陶醉的冲泡!
翻译自: https://www.sitepoint.com/list-processing-in-coffeescript/
coffeescript