Ruby call chain

November 13, 2012 21:32


今天码字母,调试中出错,一看是链式方法调用的问

file.parent.parent.id.to_s

# 由于parent这一层出现了nil,然后随便改下

file && file.parent && file.parent.parent && file.parent.parent.id.to_s

写完后发现自己头都大了..这还是人写的么..

想想rails应该会有这方法吧?搜了下,没找到,也懒的找了,就直接自己写个了,咱比较喜欢重复造轮子.. 虽然现在重复的少了,一般是找别人的库来用用,不过还常常有去造轮子的冲动..哈哈,不过大多么, 就弄出个半成品放那不管了.. 接下来这个代码也算是个半成品吧,就光一段代码,懒的弄成gem包了,而且也不知道有没有这种类似的方法

Object.class_eval do
  def list_call(methods, default_val = nil, &block)
    methods = methods.split(".")
    obj = self

    methods.each_with_index do |method, index|
      if obj.respond_to? method
        obj = obj.send(method)
      else
        return default_val || (block && block.call(methods, index))
      end 
    end 

    obj 
  end 
end

然后任意一个对象就可以使用了

o = {:a => 1}

o.list_call("keys.first") # => :a

o.list_call("keys.first.aaa.bbb") # => nil

o.list_call("a.b.c", "default_key") # => "default_key"

o.list_call("keys.last.a.b") {|methods, method| [methods, method] }
# => [["keys", "last", "a", "b"], "a"]

Comments: