ruby元编程(附录)
2017-03-10 本文已影响0人
五月的约修亚
拟态方法
拟态方法就是去掉括号调用方法的方式,会给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中可以使用键值序列来当做参数传入,这些参数会被包装成一个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)