ruby-on-rails – .尝试vs \u0026\u0026表现

ruby-on-rails – .尝试vs \u0026\u0026表现,第1张

概述假设我有一个来自SQL查询的传入值,如下所示: 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.ba 假设我有一个来自SQL查询的传入值,如下所示:

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表现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1284320.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存