资讯专栏INFORMATION COLUMN

如何写懒惰的代码

betacat / 530人阅读

摘要:考虑下面这段的代码现在的问题是是否计算答案大概是是的。如果你需要代码变得懒一些,你需要绕过它的勤奋。这样的代码太差了。可惜的是,虽然是懒惰的,它却很勤奋的计算它的参数。里有一亿个数,所以这样的代码太贵了。

懒和勤奋:
“懒”是一个很广泛的词,在程序员的世界里,它指只做需要做的工作。而“勤奋”在这里指做很多的工作为了未来。

考虑下面这段 JavaScript 的代码:

现在的问题是: JavaScript 是否计算 2+3 ? 答案大概是:是的。当 JaveScript 在给一个函数传送参数的时候,它是非常勤奋的。它计算所有表达式,并且不管是否真的需要计算这些表达式。

如果你需要代码变得懒一些,你需要绕过它的勤奋。比如:

JavaScript 会计算函数 () => 2 + 3
但它不会计算函数里面的表达式。当这个函数并没有开始执行,里面的2+3并不会 被计算。

把表达式放在函数里来延迟它被计算是一个编程里经常用到的方法。有很多这方面有趣的应用。

制造懒惰
if 条件,和许多 control flow 的语句都是很懒的,他们是不会被计算直到程序真的跑到了它们的条件里。看看这段代码:

想象一个 List 从1到一亿,然后我们启动这段代码:

我们会得到正确的答案,但是代码先做了一个从一到一亿的 list。这样的代码太差了。因为连小孩都知道你可以随时从函数里 return 出来,然后剩下的值就被忽略不计了。所以我们可以这样写:

这个版本的函数要比之前那个懒多了。根据 containing,我们可以写一个类似的函数,findwith:

findwith 函数预测第一个值是不是想要的。可惜的是,虽然 findwith 是懒惰的,它却很勤奋的计算它的参数。比如说我们需要找到 list 里的第一个大于99并且顺逆序一样的数字:

我们得到的结果是101。
但是 JavaScript 会很勤奋地计算所有的参数,所以它计算 isPalindromic, gt(99)),还有 billion。billion 里有一亿个数,所以这样的代码太贵了。我们需要更懒的函数:

现在JavaScript还是会计算 Numbers(),但是这里是一个 iterator,而不是一个 array,条件句:for (const element of list) { ... },从 iterator里取值,而不是从一个有一亿个值得 array里。

原文链接:http://raganwald.com/2016/04/15/laziness-is-a-virtue.html

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79222.html

相关文章

  • 60分钟正则从入门到深入

    摘要:正则表达式使用单个字符串来描述匹配一系列匹配某个句法规则的字符串。接下来,是在手机正则里面已经出现了。序列匹配而则匹配。分组与反向引用分组,又称为子表达式。把正则表达式拆分成小表达式。 本文转载自网络。转载编辑过程中,可能有遗漏或错误,请以原文为准。原文作者:水墨寒湘原文链接:https://juejin.im/post/582dfc... 正则表达式对于我来说一直像黑暗魔法一样的存...

    _ang 评论0 收藏0
  • postcss-lazysprite: 一种生成CSS 雪碧图懒惰姿势

    摘要:无论是早期工具,还是现在流行的配合这类构建工具而产生的雪碧图插件。 本文原文链接:https://devework.com/postcss-...,转载请注明原始来源,谢谢! showImg(https://segmentfault.com/img/bVPmaC?w=1692&h=754); postcss-lazysprite 是一个基于PostCSS 开发的用于生成雪碧图图片及其C...

    BearyChat 评论0 收藏0
  • php工程狮感知前端工作流程

    摘要:在这种背景下,诞生了很多工具很多前端工作流程。目前我们很多时候常说的前端工程师,其实主要指的就是其工程师。所以就是来解决这些问题的最后至此前端的一个工作结构介绍至此结束。 这个时代不懂点前端知识,真的没有办法生存。就算不会写,也得了解它的原理吧! 最近做了一些总结,之前都是迷迷糊糊,搞不清楚前端之前的相关定位。好好梳理了一下。错误之处请各位指正。 本文主要说的是 JavaScript ...

    binaryTree 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<