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

标签 ruby

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

这可以给我 nil:NilClass 的 ruby​​ 未定义方法

puts obj1.obj2.obj3.obj4.to_s

这个检查很丑陋而且重复:

if(obj1 && obj1.obj2 && obj1.obj2.obj3 && obj1.obj2.obj3.obj4)
  puts obj1.obj2.obj3.obj4.to_s
end

有没有一种简洁的写法,如果什么都为nil就静静地失败?

最佳答案

我的尝试版本:

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

那么代替这个长表达式:

obj1.try(:obj2).try(:obj3).try(:obj4).to_s

你可以这样做:

obj1.try{ obj2.obj3.obj4.to_s }

更新: 让它更干净一些

关于ruby - 有没有更好的方法来编写这种类型的 nil 检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9159032/

相关文章:

java - 形式论证不能是常量 def

javascript - 为什么 Ruby 包含在内?函数无法按 AngularJS 变量的预期工作?

ruby-on-rails - ruby/rails 中的预约调度

html - Bootstrap 3 表单 - 如何添加底部边框以形成字段? (将它们隔开)

ruby - 按顺序调用对象上的方法列表,管道方法?

ruby - 如何使用 Sequel ORM 以随机顺序从 SQLite 获取记录?

Ruby:使用 join 和 ThreadsWait.all_waits 等待所有线程完成 - 有什么区别?

ruby - :each - how to do on one line instead of do. .end block 之前的 rspec?

Mysql 到 PostgreSql Rails 3 heroku 应用程序 true/false

ruby - 由于使用 rbenv 的 ssl 无效导致 Gem 安装错误