3-9《元编程》第3章Tuesday:methods
Ruby是动态语言,有静态语言实现不了的技巧。本章讲解代码的重构,把代码变得更简洁。
3.2Dynamic Methods
3.21Calling Methods Dynamically
Dynamic Dispatch(动态派发技巧):使用Object#send方法,方法名是send()的参数,可以在代码运行的最后一刻决定调用哪个方法。
send(symbol[,args...]) -> obj #string也行,会自动转换为symbol
send方法可以调用任何方法,包括私有方法。
Pry的例子(Ruby的命令行解释权,功能强于默认的irb) https://github.com/pry/pry
Kernel#respond_to? 检测如Rry#memory_size= 这样的方法是否存在。
respond_to?(symbol, include_all=false) → true or false
Hash#merge!
3.22 Defining Methods Dynamically动态方法。
使用Module#define_method()方法随时定义一个方法.代替def的重要原因是可以在运行时决定方法的名字。
说明:Defines an instance method in the receiver.
#########复杂的实例。
class A
3.23Refactoring the Computer Class
第一步 添加动态派发Dynamic dispatch: 把重复的代码抽出来,放到该类的一个方法中用send方法来接收method名字作为参数。
第二步 动态创建方法:define_method方法重构Computer类
第三步 内省introspection,缩减代码。
代码:
# introspection内省
# get_#{name}_info是传进对象的类的方法。
return "超支项目#{result}" if price >= 100
3.3method_missing方法
动态代理和幽灵方法,解决代码繁复问题。
method_missing是BasicObject的私有实例方法。
3.31 Overriding method_missing
从新写method_missing方法让你可以调用实际并不存在的方法。被处理的消息,从调用者的角度看,和普通方法没区别,但实际receiver并没有对应的方法,这称为Ghose Method。
#*args代表多个参数。block_given?是kernel方法
3.51BasicObject
拥有极少实例方法的类也叫blank Slate。BasicObject只有几个实例方法。
如果幽灵方法和真实方法的名字冲突,幽灵方法会被忽略。这时可以让创建的类继承BasicObject.
3.52删除方法
Module#undef_method: 删除所以(包含继承)的方法
Module#remove_method : 只删除receiver自己的方法。
幽灵方法的重构:动态代理和白版类。
3.61Dynamic Methods vs. Ghost Methods
幽灵方法不是真正的方法,只是对方法调用的拦截。
原则:在可以使用动态方法的时候,尽量使用动态方法;除非必须使用幽灵方法,否则尽量不用。
3-9《元编程》第3章Tuesday:methods的更多相关文章
- 3-8《Ruby元编程》第二章对象模型
<Ruby元编程> 第二章 对象模型 类定义揭秘inside class definitions: class关键字更像一个作用域操作符,核心作用是可以在里面随时定义方法. [].meth ...
- 一道模板元编程题源码解答(replace_type)
今天有一同学在群上聊到一个比较好玩的题目(本人看书不多,后面才知是<C++模板元编程>第二章里面的一道习题), 我也抱着试一试的态度去完成它, 这道题也体现了c++模板元编程的基础和精髓: ...
- 初识C++模板元编程(Template Mega Programming)
前言:毕设时在开源库上做的程序,但是源码看得很晕(当时导师告诉我这是模板元编程,可以不用太在乎),最近自己造轮子时想学习STL的源码,但也是一样的感觉,大致了解他这么做要干什么,但是不知道里面的机制. ...
- 3-11 《Ruby元编程》第4章block块 3-12
第4章代码块blocks 基础知识 作用域:用代码块携带variables through scopes 通过传递block给instance_eval方法来控制作用域. 把block转换为Proc, ...
- C++模板元编程(C++ template metaprogramming)
实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...
- atitit.元编程总结 o99
atitit.元编程总结 o99.doc 1. 元编程(Metaprogramming) 1 2. 元编程的历史and发展 1 3. 元类型and元数据 1 4. 元编程实现方式 2 4.1. 代码生 ...
- ES6中的元编程-Proxy & Reflect
前言 ES6已经出来好久了,但是工作中比较常用的只有let const声明,通过箭头函数改this指向,使用promise + async 解决异步编程,还有些数据类型方法...所以单独写一篇文章学习 ...
- Ruby元编程:单元测试框架如何找到测试用例
前几天看了Google Testing Blog上的一篇文章讲到C++因为没有反射机制,所以如何注册测试用例就成了一件需要各显神通的事情.从我的经验来看,无论是Google的GTest还是微软的LTM ...
- Groovy元编程简明教程
同函数式编程类似,元编程,看上去像一门独派武学. 在 <Ruby元编程>一书中,定义:元编程是运行时操作语言构件的编程能力.其中,语言构件指模块.类.方法.变量等.常用的主要是动态创建和访 ...
随机推荐
- 【转】eclipse反编译插件
原文地址:http://bbs.csdn.net/topics/390263414 离线安装包下载地址一:http://feeling.sourceforge.net/downloads/org.sf ...
- Linux服务器配置---ftp限制ip
ftp限制IP 1.通过vsftpd的配置文件以及“hosts.deny”和“hosts.allow”文件设置允许某个ip地址访问 1)修改配置文件“/etc/vsftpd/vsftpd.conf”中 ...
- 如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放
如何安装nginx_lua_module模块,升级nginx,nginx-lua-fastdfs-GraphicsMagick动态生成缩略图,实现图片自动裁剪缩放 参考网站:nginx-lua-fas ...
- 关于微信分享到朋友圈(Thinkphp-tp3.2框架下实现)
PHP部分 扩展类代码部分: <?php namespace Think; class JsSdk { private $appId; private $appSecret; public $d ...
- 02: SocketServer服务
网络编程其他篇 目录: 1.1 SocketServer四种基本流及 异步处理理论部分 1.2 创建socketserver实现: 多客户端并发 1.3 SocketServer实现多并发FTP 部分 ...
- 20145324王嘉澜 《网络对抗技术》 MAL_逆向与Bof基础
实践目标 •本次实践的对象是一个名为pwn1的linux可执行文件. •该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. •该程序同时包含另一个代码片段,get ...
- 20165310 学习基础和C语言基础调查
学习基础和C语言基础调查 做中学体会 阅读做中学之后,了解老师关于五笔练习.减肥.乒乓和背单词的经历,不禁联想到自己学古筝的经历. 成功的经验 兴趣 我其实小时候学过一段时间古筝,但是那时候是因为父母 ...
- visual studio扩展插件Visual Assist x给代码插入注释模板(转载)
转载:http://www.cnblogs.com/xiongmao-cpp/p/5196555.html Visual Assist 是由Whole Tomato公司为Microsoft Visua ...
- JAVA I/O(六)多路复用IO
在前边介绍Socket和ServerSocket连接交互的过程中,读写都是阻塞的.套接字写数据时,数据先写入操作系统的缓存中,形成TCP或UDP的负载,作为套接字传输到目标端,当缓存大小不足时,线程会 ...
- flash,sram
flash写入的内容不会因电源关闭而失去,读取速度慢,成本较低,一般用作程序存储器或者低速数据读取的情况. sram有最快的读写速度,但电源掉落后其内容也会失去,价格昂贵,一般用作cpu的二级缓存,内 ...