coffeescript_CoffeeScript中的列表处理

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语法的unlessis关键字和条件在声明的末尾加载,但在列表的方式,也没有做太多。

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

请注意,此语法不适用于前两个版本,仅适用于使用列表推导的第三个版本。

如此令人敬畏的是,列出理解有两个陷阱:

  1. 列表推导会返回一个列表(在这种情况下,是中毒目标的列表)。 如果您想“堆叠”列表推导,这很好,但是如果堆叠两个以上,它很快就会变得混乱。 如果您省略了可选的括号和括号,则尤其如此。
  2. 因为这看起来很像英语,所以您有时可能会写一个有效的英语句子,但感到惊讶,因为它没有被编译。 尽管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...)

免费学习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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值