西行漫记(18):操作即是数据
在上次的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):操作即是数据相关推荐
- 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 查询满足某个条 ...
- TSPITR方式数据库找回误操作丢失的数据
一.TSPITR介绍 TSPITR全称是Tablespace Point In Time Recover(表空间基于时间点的不完全恢复).原理是通过辅助实例基于时间还原出误操作前的数据通过DataPu ...
- 小汤学编程之MySQL(二)——数据库操作、表结构操作、表数据操作、查询数据和数据类型
一.数据库操作 1.创建数据库 2.查询数据库 3.修改数据库 4.使用数据库 二.表结构操作 1.创建表 2.查询表 3.修改表 4.删除表 三.表数 ...
- 【开源】OSharp3.0框架解说系列(6.2):操作日志与数据日志
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- Python入门到实战(五)自动化办公、pandas操作Excel、数据可视化、绘制柱状图、操作Word、数据报表生成、pip install国内镜像下载
Python入门到实战(五)conda使用.pandas操作Excel.数据可视化.绘制柱状图.操作Word.数据报表生成.pip install国内镜像下载 conda使用 常用操作 配置VS+Co ...
- 幻想神域服务器维护,《幻想神域》1月18日部分服务器数据互通公告
亲爱的启源使者: 为优化游戏环境,提高游戏的可玩性和互动性,我们将于1月18日(星期五)上午10:00-12:00对部分服务器进行停服数据互通操作,预计维护时间为2个小时,根据实际情况,开服时间可能提 ...
- C#操作Oracle中大数据(Blob)
之前在网上搜索C#操作Oracle中大数据的源代码,找到的文章基本都是一篇,都是没有提供引用库的,还是得自己写一个 - - 代码如下: 1 using System; 2 using System.D ...
- python3字典写入excel_python3:excel操作之读取数据并返回字典 + 写入的案例
excel写入数据,使用openpyxl库 class WriteExcel: def __init__(self,path): self.path = path def write_excel(se ...
- Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例
学习目标 redis 概念 下载安装 命令操作 1. 数据结构 持久化操作 使用Java客户端操作redis Redis 前言(从百度上抄的, 看看了解一下, 懒得排版了) 1. 概念: redis是 ...
- java mongodb 模糊查询_Java操作MongoDB插入数据进行模糊查询与in查询功能的方法
Java操作MongoDB插入数据进行模糊查询与in查询功能 由于需要用MongoDB缓存数据,所以自己写了一套公共的存放和读取方法 具体如下: 存放mongodb: /** * 公共方法:设置Obj ...
最新文章
- python如何处理异常_python如何进行异常处理
- 按键精灵文字识别插件_按键精灵——如何实现办公自由(二)
- iOS-数据库sqlite的使用
- mysql pxc测试_Mysql同步机制 - PXC 压力测试 tpcc安装及使用
- 最大尺寸分辨率_全球最大尺寸、最高分辨率硅基OLED显示屏在合肥点亮!
- Python中的解决中文字符编码的问题
- 海致星图2022校招算法笔试题
- 1017. A除以B (20)-PAT乙级真题
- android字节数转兆,ios – Swift – 如何计算字节数并将其转换为兆字节?
- Yolov2 训练时anchor是如何使用的?build_target
- 考研复习计划怎么做?MindManager来帮你!
- python3 + pycharm+requests+HTMLTestRunner生成不了测试报告html
- 【系统分析与设计】高校学生社团管理系统
- 带通滤波器中心频率计算公式中R是哪个值_手把手教系列之IIR数字滤波器设计实现...
- Python与SEO,搜狗站长平台链接提交工具Python脚本源码
- 聚类系数与小世界网络
- 2019校招阿里数据研发/数据挖掘三面总结
- C++输入一系列数字,以换行结束输入
- 计算机专业综合改革举措,数学与应用数学专业综合改革的举措.docx
- 技术入股创业一年,家庭收入变成负5万