gpt4 book ai didi

ruby-on-rails - .Try vs && 性能

转载 作者:行者123 更新时间:2023-12-03 15:59:14 25 4
gpt4 key购买 nike

假设我有一个来自 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 的逻辑运算符完成的。虽然 try 由 Rails 引入并做了附加 if-else有条件的检查。从代码:

# File activesupport/lib/active_support/core_ext/object/try.rb, line 41
def try(*a, &b)
if a.empty? && block_given?
yield self
else
public_send(*a, &b) if respond_to?(a.first)
end
end

好吧,这是一个基准,可以准确显示我想说的内容:
class Object
def try(*a, &b)
if a.empty? && block_given?
yield self
else
public_send(*a, &b) if respond_to?(a.first)
end
end
end

class Foo
attr_reader :a
def initialize(a = nil)
@a = a
end
end

require "benchmark"


bar = Foo.new
baz = Foo.new(1)

n = 10000000
Benchmark.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        real
try 10.800000 0.030000 10.830000 ( 10.829770)
&& 3.940000 0.010000 3.950000 ( 3.944375)

关于ruby-on-rails - .Try vs && 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26655032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com