
grok = Foo.select(:foo_attr1,:foo_attr2).first
foo_attr2是一个可以为空的字段.现在假设我需要对输出进行处理(如果存在的话).
krug = grok.foo_attr2.try(:bar).try(:baz)gnar = grok.foo_attr2 && grok.foo_attr2.bar.baz # Assumes bar will always return output that can be baz'd
这两个 *** 作中哪一个更好用,为什么?
解决方法 使用gnar = grok.foo_attr2&& grok.foo_attr2.bar.baz肯定会更快,因为它使用Ruby的逻辑运算符完成.虽然Rails引入了try,但还有其他if-else条件检查.来自代码: # file activesupport/lib/active_support/core_ext/object/try.rb,line 41def try(*a,&b) if a.empty? && block_given? yIEld self else public_send(*a,&b) if respond_to?(a.first) endend
好吧,这是一个基准,以准确显示我想说的内容:
class Object def try(*a,&b) if a.empty? && block_given? yIEld self else public_send(*a,&b) if respond_to?(a.first) end endendclass Foo attr_reader :a def initialize(a = nil) @a = a endendrequire "benchmark"bar = Foo.newbaz = Foo.new(1)n = 10000000Benchmark.bm(40) do |x| x.report("try"){ n.times { bar.a.try(:class).try(:to_s) } } x.report("&& "){ n.times { baz.a && baz.a.class.to_s } }end 结果是:
user system total realtry 10.800000 0.030000 10.830000 ( 10.829770)&& 3.940000 0.010000 3.950000 ( 3.944375)总结
以上是内存溢出为你收集整理的ruby-on-rails – .尝试vs \u0026\u0026表现全部内容,希望文章能够帮你解决ruby-on-rails – .尝试vs \u0026\u0026表现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)