有没有更好的方法来编写这种类型的零检查?

Chr*_*ris 1 ruby

我的代码中有几个地方有嵌套对象,但不能保证它们总是被设置.

这可以给我一个nil的红宝石未定义方法:NilClass

puts obj1.obj2.obj3.obj4.to_s
Run Code Online (Sandbox Code Playgroud)

这项检查是丑陋和重复的:

if(obj1 && obj1.obj2 && obj1.obj2.obj3 && obj1.obj2.obj3.obj4)
  puts obj1.obj2.obj3.obj4.to_s
end
Run Code Online (Sandbox Code Playgroud)

是否有一种简洁的写作方式,如果有什么是零只是默默地失败?

meg*_*gas 5

我试试的版本:

class Object
  def try(*args, &block)
    if args.empty? and block_given?
      begin
        instance_eval &block
      rescue NameError => e
        puts e.message + ' ' + e.backtrace.first
      end
    elsif respond_to?(args.first)
      send(*args, &block)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

那么,而不是这个长表达式:

obj1.try(:obj2).try(:obj3).try(:obj4).to_s
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

obj1.try{ obj2.obj3.obj4.to_s }
Run Code Online (Sandbox Code Playgroud)

更新: 让它更清洁一点