ruby元编程(附录)

拟态方法 拟态方法就是去掉括号调用方法的方式,会给ruby开发者带来很多语法糖,当然也会给开发者和ruby本身增加很多容易混淆的场景。
如下场景中ruby无法知道name是局部变量还是(给@name赋值)拟态方法,按处理优先级ruby会把它当做局部变量处理

class C attr_accessor :name def initialize # 两种可能 # 1、给局部变量name赋值(高优先级) # 2、调用拟态方法name=(低优先级) name = "lang" end end puts C.new.name#=> nil

为了去除二义性,在调用拟态方法时应该加上self,明确告诉ruby当做拟态方法处理
class C attr_accessor :name def initialize self.name = "lang" end end puts C.new.name#=> "lang"

空指针保护
a ||= [] #=> 如果a为nil则将a初始化为空数组,否则什么也不做

具名参数 【ruby元编程(附录)】当调用一个方法时,不得不按照固定的顺序传入参数,当参数很多时就会很容易出错。在ruby中可以使用键值序列来当做参数传入,这些参数会被包装成一个hash传入
缺点是要自己从hash中取出需要的参数,并且单从方法定义来看无法看到完整的参数列表
def my_method(args) puts args[:a]#=> 1 end my_method(:a => 1, :b => 2, :c => 3) #在ruby 1.9以后也可以这样写 my_method(a:1, b:2, c:3)

    推荐阅读