3-18/19 (自我练习)30多个《Ruby元编程》的spell(pattern)小例子。
2024-08-27 08:01:07
Spell,也称pattern,idiom
# Around Alias:从一个重新定义的方法中调用原始的,被重命名的版本。
# old_reverse是未改变的原始方法,reverse/new_reverse是改变的方法。
class String
def new_reverse
"x:#{old_reverse}"
end
alias_method :old_reverse, :reverse
alias_method :reverse, :new_reverse
end
puts "abc".reverse #x:cba
# Blank Slate:移除一个对象的所有方法,以便把它们转换成ghost method
class C
def method_missing(name, *args)
'a Ghost Method'
end
p ancestors #[C, Object, Kernel, BasicObject]
end
puts C.new.to_s #返回一个string记录了对象的类和encoding-id#<C:0x00007f9ef0006950>
class D < BasicObject
def method_missing(name, *args)
"a Ghost Method"
end
end
blank_slate = D.new
puts blank_slate.to_s #返回method_missing方法的return: a Ghost Method
# Class Extension: 通过向singleton class中加入Module来定义class method,是对象扩展的一个特例
class C; end
module M
def my_method
'a class method'
end
end
+ 1) # prints "method"
# Self Yield: 把self传给当前block
class Person
attr_accessor :name, :surname
def initialize
yield self
end
end
joe = Person.new do |p|
p.name = 'Joe'
p.surname = 'Smith'
end
p joe #=>#<Person:0x00007fdc560042b0 @name="Joe", @surname="Smith">
Ruby中有不少方法也是自动把receiver传入块。如:instance_eval ,class_eval, Object#tap
# Singleton Method:
给一个对象定义一个单例方法,也可以extend一个模块。
class Klass
end
k = Klass.new
class << k
def hello
"Hello from Mod.\n"
end
end
p k.hello
# String of code
执行一段表示Ruby代码的字符串
my_string_of_code = "1+1"
p eval(my_string_of_code) #=》2
# Symbol To Proc
# 把一个调用单个方法的块转换成一个符号,一样的写法,目的是更省事
p [1,2,3].map{|x| x.even? }
p [1,2,3].map &:even?.to_proc #变成proc对象,然后再用&变成代码块
p [1,2,3].map(&:even?)
#=> [false, true, false]
最新文章
- Spring Boot CLI安装
- vsftpd的主动模式与被动模式
- poj1013.Counterfeit Dollar(枚举)
- Oracle 触发器,事物
- 初见,Devexpress
- Mysql slave 状态之Seconds_Behind_Master
- delphi 截取指定符号之间的字符串-随机读取
- 它们的定义UIAlertView
- 用netsh wlan命令行解决“Win10下WLAN不自动登陆”问题
- Java中常见的URL问题及解决方案
- 响应式网页:用em,rem设置网页字体大小自适应
- hive中安装hive_utils模块
- VC 任务栏图标闪烁
- VB.NET中的DLL编写和调用的最简单示例
- Bat 参数去引号(各种去引号的奇葩方式,三种变量互转),普通变量不能直接去掉外层引号
- VS2010安装msdn本地帮助
- gitlab的安装和基本维护
- sqlserver还原数据库
- swift版的GCD封装
- 基于windowsphone7的控制ppt播放
热门文章
- caffe 中base_lr、weight_decay、lr_mult、decay_mult代表什么意思?
- Selenium2+python自动化54-unittest生成测试报告(HTMLTestRunner)
- python webdriver操作浏览器句柄
- 页面点击,不是a标签也会刷新原因
- Ubuntu系统下使用Jenkins进行项目的自动构建还是项目回滚方法
- MySQL数据库----完整性约束
- sqlserver 判断各种不存在
- Kafka学习之(七)搭建kafka可视化服务Kafka Eagle
- Centos下使用php调用shell脚本
- xShell终端中文乱码完全解决方法