吃了大力丸的Ruby:unfold的实现
最近奇忙。从早到晚工作。别说写博客,连读博客都 没有时间。虽然一直想八卦一下JavaScript那浓眉大眼的也背叛革命了这件大事,却抽不出空。不过看到这么精彩的代码,还是忍不住转载。
起因是这样的:大家都熟悉fold函数,也就是Ruby里常用的inject()函数:给出起始值,把某个Collection里的值叠加上去。比如说,给出起始值0,累加数组[1, 2, 3, 4, 5]:
[1, 2, 3, 4, 5].inject(0){|sum, n| sum = sum + n}
有了fold,便有相反的unfold:把单个的对象映射到Collection上。比如说
10.unfold { |n| n-1 unless n == 1 }.inspect => [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 10.class.unfold(&:superclass).inspect => [Fixnum, Integer, Numeric, Object]
它的实现也出奇地漂亮:通过递归把unfold调用改写为数组操作。颇有term rewriting系统的风范:
class Object def unfold &block block.call(self).unfold(&block).unshift(self) endend
class NilClass def unfold &block [] endend
用例子最容易说明这段实现的惊艳之处。我们手工执行3.unfold{|n| n - 1 unless n ==1}:
- 我们用block指代上式里的{|n| n - 1 unless n == 1}。根据unfold的定义,上式变为block.call(3).unfold(&block).unshift(3)
- 执行block.call(3)得到2,于是我们得到2.unfold(&block).unshift(3)
- 根据定义,我们得到block.call(2).unfold(&block).unshift(2).unshift(3)
- 执行block.call(2),我们得到1.unfold(&block).unshift(2).unshift(3)
- 再根据定义,我们得到block.call(1).unfold(&block).unshift(1).unshift(2).unshift(3)
- block.call(1)的结果是nil,所以我们得到nil.unfold(&block).unshift(1).unshift(2).unshift(3)
- nil早准备好了unfold的定义,于是我们得到[].unshift(1).unshift(2).unshift(3),也就是[3, 2, 1]了。
现在胃口被吊起来的老大们可以看这里的讨论了。
吃了大力丸的Ruby:unfold的实现相关推荐
- 吃了大力丸的Ruby 2
Why's Lucky Stiff 上看来的.俺只是搬运工.能读原文的老大们不用往下看了. 嗯,假如一个类里有个实例方法.我们希望这个方法只运行一次."切,我还以为是抢鸡蛋呢", ...
- 吃了大力丸的Ruby
嗯,我们的功能测试代码常有个小小的需求:当测试代码里的某一个函数抛出异常,系统自动弹出一个调试窗口.调试窗口应该已经包含异常抛出时的上下文信息,以便测试员进行调试."靠,还以为什么新鲜玩意儿 ...
- 观看5万个游戏视频后,英伟达AI学会了自己开发「吃豆人」
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI AI学会玩游戏已经不是什么新鲜事了,无论是星际争霸还是王者荣耀,AI的水平都已经超过了顶级选手. 现在,AI不仅能玩游戏,还学会了造游戏. ...
- 编程语言 Ruby 如何还能再活 25 年?
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! Ruby 创始人说:"我们要想尽一切办法活下去." [CSDN编者按]全 ...
- 如何用Machinations示意图来模拟《吃豆人》的游戏机制?
下面我们来展示一下如何用Machinations 示意图来模拟一个简单游戏的机制.我们使用的案例是经典街机游戏<吃豆人>(Pac-Man),我们将会把模拟这个游戏的过程分解成六步,并在Ma ...
- 《惢客创业日记》2018.11.26(周一)保健品和大力丸(上)
今天下午,接着去看病,看来又要花去一下午的时间.在去的路上,美美的睡了一觉,这让我的精力恢复了不少.看完病,往家赶,怕朋友开车犯困,就给她聊了一路,聊什么呢?当然是聊惢客,而她做的行业是保健品直销行业 ...
- 从零开始为《吃豆人》创建BT
从零开始为<吃豆人>创建BT 这一次我们对<吃豆人>游戏创建一组逐渐复杂的BT. 如图所示BT通过包含多个幽灵和大量药丸的迷宫控制智能体,即吃豆人,这些药丸中大的药丸就是说为的 ...
- 数数课堂·第四期:一个运营人的数据分析成长史
数据分析,这个词一直像游戏公司隔着厚毛衣的痒点一样,分析师新人们立志为公司团队和游戏产品拔出痒点,但老板们却一直对数据分析结果不得满意,就像隔靴搔痒一样让人难受. 一两年过去,分析师们一边被说&quo ...
- 巨石加密_点餐:如何吃一个可怕的巨石
巨石加密 by Alan Ridlehoover 通过艾伦·里德尔霍弗 点餐:如何吃一个可怕的巨石 (Ordering Take Out: How to Eat a Scary Monolith) M ...
最新文章
- 295. 数据流的中位数
- 分享5个可视化的正则表达式编辑工具
- 常考数据结构和算法:合并有序链表
- 神策 FM:从 IT 到 DT,To B 市场走到了哪一步?
- php ob静态缓存
- UNIX环境高级编程笔记
- leetcode 463. 岛屿的周长
- 上传文件块client实现
- Zabbix 3.0 安装部署
- java 响应式编程_响应式编程
- 我深夜用 Python 跑神经网络,只为关掉台灯!
- 爬完点评爬某东,爬他个600多本书籍资料
- marshmallow——快速入门
- Android 自定义跑马灯文字
- 【学习打卡 Free-Excel 】Task9 数据透视
- 人工智能技术知识图谱
- 【CNN】——矩阵乘法优化
- 接口隔离原则:接口里的方法,你都用得到吗?
- 打开日志管理的潘多拉盒子
- g楦和h楦的区别_填、堵、堵塞、塞、楦的区别_近义词词典_词林在线词典