ruby on rails

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)
上一篇 下一篇

猜你喜欢

热点阅读