在上次的blog里提了这么一句:“ 其实要多态,还不如在对象里面保存一个变量,变量里面是一段程序,运行到那就把这段程序拿出来eval一下,不比创建几个子类强么”。有读者问这个是什么意思,要我给个例子。其实这个很简单,只要想清楚所有的反动派都是纸老虎……嗯,我是说,所有的操作都是lambda。然后把操作当数据就好了。当然,建立在一个基础上:你使用的语言支持方便地把lambda作为一等公民。

class Host
    def state= (state)
       @state = state
    end
    def do_something
       @state(self)
    end
end

host = Host.new
host.state = {|host| p host }
host.do_something

譬如说这是一个用Ruby实现的State模式(或者说是Strategy模式也好,这俩本来就不是很有区别)。Host在@state里面保存一个lambda(Ruby的黑话好像是叫closure),回头要做什么操作就拿这个出来用。State/Strategy模式用C#/Java的实现,大家都很熟悉,对比一下就明白我的意思了。

为上次的“ C#长得太丑了”一文道个歉,没想到随便开个玩笑也能引起语言大战,实在抱歉,各位读者就当我被班加罗尔的太阳晒昏了头打胡乱说罢。由此可以看到,中国程序员(或者说,部分中国程序员)确实觉悟甚高,阶级斗争这根弦绷得很紧……喜欢一种语言固然是没啥好说的,要是真对这个语言那么有信心,犯得着听见三句抱怨就跳起八丈高么?

(补充:上面例子中的lambda还可以写得更漂亮一点,do_something可以写成这样
    def do_something
       @state
    end
而这个传进去的lambda就可以写成
host.state = { p self }
这个事情就有点奇妙:lambda的context是在它定义的地方,而不是它调用的地方,也就是说这个lambda的self其实并不是host。不过有个tricky的办法:用caller可以找到这个lambda的调用者,然后把这个caller给mixin成当前context的self,调用完以后再mixin回来……感谢Obie的灵感和徐八x的实现。)

西行漫记(18):操作即是数据相关推荐

  1. SQL 100+个最佳入门案例实践(覆盖Oralce、SQL Server、Mysql)之基础操作_1_检索数据

    SQL基础操作_1_检索数据 目录 7.1.1 数据集 7.1.2 学生选课关系表 7.1.3 供应商关系表 7.2.1 从表中查询所有行和列 7.2.2 从表中查询部分行 7.2.3 查询满足某个条 ...

  2. TSPITR方式数据库找回误操作丢失的数据

    一.TSPITR介绍 TSPITR全称是Tablespace Point In Time Recover(表空间基于时间点的不完全恢复).原理是通过辅助实例基于时间还原出误操作前的数据通过DataPu ...

  3. 小汤学编程之MySQL(二)——数据库操作、表结构操作、表数据操作、查询数据和数据类型

    一.数据库操作 1.创建数据库     2.查询数据库     3.修改数据库     4.使用数据库 二.表结构操作 1.创建表     2.查询表     3.修改表     4.删除表 三.表数 ...

  4. 【开源】OSharp3.0框架解说系列(6.2):操作日志与数据日志

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  5. Python入门到实战(五)自动化办公、pandas操作Excel、数据可视化、绘制柱状图、操作Word、数据报表生成、pip install国内镜像下载

    Python入门到实战(五)conda使用.pandas操作Excel.数据可视化.绘制柱状图.操作Word.数据报表生成.pip install国内镜像下载 conda使用 常用操作 配置VS+Co ...

  6. 幻想神域服务器维护,《幻想神域》1月18日部分服务器数据互通公告

    亲爱的启源使者: 为优化游戏环境,提高游戏的可玩性和互动性,我们将于1月18日(星期五)上午10:00-12:00对部分服务器进行停服数据互通操作,预计维护时间为2个小时,根据实际情况,开服时间可能提 ...

  7. C#操作Oracle中大数据(Blob)

    之前在网上搜索C#操作Oracle中大数据的源代码,找到的文章基本都是一篇,都是没有提供引用库的,还是得自己写一个 - - 代码如下: 1 using System; 2 using System.D ...

  8. python3字典写入excel_python3:excel操作之读取数据并返回字典 + 写入的案例

    excel写入数据,使用openpyxl库 class WriteExcel: def __init__(self,path): self.path = path def write_excel(se ...

  9. Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例

    学习目标 redis 概念 下载安装 命令操作 1. 数据结构 持久化操作 使用Java客户端操作redis Redis 前言(从百度上抄的, 看看了解一下, 懒得排版了) 1. 概念: redis是 ...

  10. java mongodb 模糊查询_Java操作MongoDB插入数据进行模糊查询与in查询功能的方法

    Java操作MongoDB插入数据进行模糊查询与in查询功能 由于需要用MongoDB缓存数据,所以自己写了一套公共的存放和读取方法 具体如下: 存放mongodb: /** * 公共方法:设置Obj ...

最新文章

  1. python如何处理异常_python如何进行异常处理
  2. 按键精灵文字识别插件_按键精灵——如何实现办公自由(二)
  3. iOS-数据库sqlite的使用
  4. mysql pxc测试_Mysql同步机制 - PXC 压力测试 tpcc安装及使用
  5. 最大尺寸分辨率_全球最大尺寸、最高分辨率硅基OLED显示屏在合肥点亮!
  6. Python中的解决中文字符编码的问题
  7. 海致星图2022校招算法笔试题
  8. 1017. A除以B (20)-PAT乙级真题
  9. android字节数转兆,ios – Swift – 如何计算字节数并将其转换为兆字节?
  10. Yolov2 训练时anchor是如何使用的?build_target
  11. 考研复习计划怎么做?MindManager来帮你!
  12. python3 + pycharm+requests+HTMLTestRunner生成不了测试报告html
  13. 【系统分析与设计】高校学生社团管理系统
  14. 带通滤波器中心频率计算公式中R是哪个值_手把手教系列之IIR数字滤波器设计实现...
  15. Python与SEO,搜狗站长平台链接提交工具Python脚本源码
  16. 聚类系数与小世界网络
  17. 2019校招阿里数据研发/数据挖掘三面总结
  18. C++输入一系列数字,以换行结束输入
  19. 计算机专业综合改革举措,数学与应用数学专业综合改革的举措.docx
  20. 技术入股创业一年,家庭收入变成负5万

热门文章

  1. 2018年网易实习生笔试题集合之牛牛的闹钟
  2. gcc 内联汇编用法介绍
  3. 新年将至,如何用python给朋友送上新年祝福呢?
  4. SQL 手动注入学习实战 —— dvwa 从low到impossible《low篇》
  5. php文件格式及其导出
  6. 【Python语言基础】——Python 注释
  7. 关于Rust读取自定义toml文件
  8. 洛谷 2887 USACO2007NOV 防晒霜Sunscreen 题解
  9. 大数据学习的思维原理(定制产品原理)
  10. 免费的java开发工具_Java那些最常用的免费开放工具,分享这15个!