最近奇忙。从早到晚工作。别说写博客,连读博客都 没有时间。虽然一直想八卦一下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}:
  1. 我们用block指代上式里的{|n| n - 1 unless n == 1}。根据unfold的定义,上式变为block.call(3).unfold(&block).unshift(3)
  2. 执行block.call(3)得到2,于是我们得到2.unfold(&block).unshift(3)
  3. 根据定义,我们得到block.call(2).unfold(&block).unshift(2).unshift(3)
  4. 执行block.call(2),我们得到1.unfold(&block).unshift(2).unshift(3)
  5. 再根据定义,我们得到block.call(1).unfold(&block).unshift(1).unshift(2).unshift(3)
  6. block.call(1)的结果是nil,所以我们得到nil.unfold(&block).unshift(1).unshift(2).unshift(3)
  7. nil早准备好了unfold的定义,于是我们得到[].unshift(1).unshift(2).unshift(3),也就是[3, 2, 1]了。

现在胃口被吊起来的老大们可以看这里的讨论了。

吃了大力丸的Ruby:unfold的实现相关推荐

  1. 吃了大力丸的Ruby 2

    Why's Lucky Stiff  上看来的.俺只是搬运工.能读原文的老大们不用往下看了. 嗯,假如一个类里有个实例方法.我们希望这个方法只运行一次."切,我还以为是抢鸡蛋呢", ...

  2. 吃了大力丸的Ruby

    嗯,我们的功能测试代码常有个小小的需求:当测试代码里的某一个函数抛出异常,系统自动弹出一个调试窗口.调试窗口应该已经包含异常抛出时的上下文信息,以便测试员进行调试."靠,还以为什么新鲜玩意儿 ...

  3. 观看5万个游戏视频后,英伟达AI学会了自己开发「吃豆人」

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI AI学会玩游戏已经不是什么新鲜事了,无论是星际争霸还是王者荣耀,AI的水平都已经超过了顶级选手. 现在,AI不仅能玩游戏,还学会了造游戏. ...

  4. 编程语言 Ruby 如何还能再活 25 年?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! Ruby 创始人说:"我们要想尽一切办法活下去." [CSDN编者按]全 ...

  5. 如何用Machinations示意图来模拟《吃豆人》的游戏机制?

    下面我们来展示一下如何用Machinations 示意图来模拟一个简单游戏的机制.我们使用的案例是经典街机游戏<吃豆人>(Pac-Man),我们将会把模拟这个游戏的过程分解成六步,并在Ma ...

  6. 《惢客创业日记》2018.11.26(周一)保健品和大力丸(上)

    今天下午,接着去看病,看来又要花去一下午的时间.在去的路上,美美的睡了一觉,这让我的精力恢复了不少.看完病,往家赶,怕朋友开车犯困,就给她聊了一路,聊什么呢?当然是聊惢客,而她做的行业是保健品直销行业 ...

  7. 从零开始为《吃豆人》创建BT

    从零开始为<吃豆人>创建BT 这一次我们对<吃豆人>游戏创建一组逐渐复杂的BT. 如图所示BT通过包含多个幽灵和大量药丸的迷宫控制智能体,即吃豆人,这些药丸中大的药丸就是说为的 ...

  8. 数数课堂·第四期:一个运营人的数据分析成长史

    数据分析,这个词一直像游戏公司隔着厚毛衣的痒点一样,分析师新人们立志为公司团队和游戏产品拔出痒点,但老板们却一直对数据分析结果不得满意,就像隔靴搔痒一样让人难受. 一两年过去,分析师们一边被说&quo ...

  9. 巨石加密_点餐:如何吃一个可怕的巨石

    巨石加密 by Alan Ridlehoover 通过艾伦·里德尔霍弗 点餐:如何吃一个可怕的巨石 (Ordering Take Out: How to Eat a Scary Monolith) M ...

最新文章

  1. 295. 数据流的中位数
  2. 分享5个可视化的正则表达式编辑工具
  3. 常考数据结构和算法:合并有序链表
  4. 神策 FM:从 IT 到 DT,To B 市场走到了哪一步?
  5. php ob静态缓存
  6. UNIX环境高级编程笔记
  7. leetcode 463. 岛屿的周长
  8. 上传文件块client实现
  9. Zabbix 3.0 安装部署
  10. java 响应式编程_响应式编程
  11. 我深夜用 Python 跑神经网络,只为关掉台灯!
  12. 爬完点评爬某东,爬他个600多本书籍资料
  13. marshmallow——快速入门
  14. Android 自定义跑马灯文字
  15. 【学习打卡 Free-Excel 】Task9 数据透视
  16. 人工智能技术知识图谱
  17. 【CNN】——矩阵乘法优化
  18. 接口隔离原则:接口里的方法,你都用得到吗?
  19. 打开日志管理的潘多拉盒子
  20. g楦和h楦的区别_填、堵、堵塞、塞、楦的区别_近义词词典_词林在线词典

热门文章

  1. 毕设 深度学习疲劳驾驶检测 opencv python
  2. 多伦多大学密西莎加计算机科学,多伦多大学密西沙加分校
  3. 服务器数据通信协议,数据通信协议规程.doc
  4. 自动控制原理中matlab的应用
  5. 计算机组成原理fun什么意思,vb中的fun是什么意思
  6. (学习日记)2023.04.24
  7. numpy ravel、squeeze函数
  8. 校招有感:计算机专业毕业生如何找工作(Java方向)
  9. [重写] 与 [重载]
  10. Givens旋转变换