5

如果用户是所有者,我有条件检查删除和文章。

delete_article if user.owner?

另一种方法是

user.owner? && delete_article

选择其中任何一个有什么好处还是只是一种写作风格

4

6 回答 6

6

性能不太可能成为该声明的问题。

第一个要好得多 - 更容易阅读。你未来的自己和其他将开始编写代码的人会感谢你的。

于 2013-01-17T13:34:59.993 回答
3

您可以使用这两种样式,但逻辑上存在一些差异。

在方法调用中使用:

def something
  delete_article if user.owner?
end

将返回方法 delete_article 返回的任何内容,或者nil如果用户不是所有者。

和:

def something
  user.owner? && delete_article
end

false如果用户不是所有者,它将返回。如果用户是所有者,它将返回方法 delete_article 返回的任何内容。

性能应该差不多。

于 2013-01-17T13:37:47.993 回答
2

这是一些测试ifvs.速度的代码&&

require 'benchmark'

n = 10_000_000

puts RUBY_VERSION, n
puts

Benchmark.bm(2) do |b|
  10.times do
    b.report('if') { n.times { true if true } }
    b.report('&&') { n.times { true && true } }
  end
end

和输出:

1.9.3
10000000

        user     system      total        real
if   0.970000   0.000000   0.970000 (  0.975714)
&&   1.130000   0.000000   1.130000 (  1.127514)
if   0.950000   0.000000   0.950000 (  0.956892)
&&   1.120000   0.000000   1.120000 (  1.124547)
if   0.970000   0.000000   0.970000 (  0.962618)
&&   1.120000   0.000000   1.120000 (  1.129094)
if   0.960000   0.000000   0.960000 (  0.954498)
&&   1.120000   0.000000   1.120000 (  1.125080)
if   0.960000   0.000000   0.960000 (  0.954001)
&&   1.120000   0.000000   1.120000 (  1.126329)
if   0.950000   0.000000   0.950000 (  0.953360)
&&   1.130000   0.000000   1.130000 (  1.122664)
if   0.950000   0.000000   0.950000 (  0.951391)
&&   1.120000   0.010000   1.130000 (  1.123455)
if   0.980000   0.000000   0.980000 (  0.977263)
&&   1.120000   0.000000   1.120000 (  1.126989)
if   0.970000   0.000000   0.970000 (  0.966264)
&&   1.120000   0.000000   1.120000 (  1.123184)
if   0.960000   0.000000   0.960000 (  0.956702)
&&   1.120000   0.000000   1.120000 (  1.124589)
于 2013-01-17T15:10:05.227 回答
0

我相信这两种写作风格都会有相同的表现。总是更喜欢第一个版本,因为它更容易阅读,虽然被认为是“hacky”和“hard-core”,但第二个版本实际上没有优化。

编辑:这是如何进行一些基准测试。似乎两个版本的性能确实相似:

limit = 10**7
time_val=Time.now;sum=0;(0..limit).each{|t| even?(t) && sum += t};puts Time.now - time_val

time_val=Time.now;sum=0;(0..limit).each{|t| sum += t if even?(t)};puts Time.now - time_val
于 2013-01-17T13:29:46.927 回答
0

他们应该有相同的性能,因为他们做同样的事情,或者至少可以忽略不计的性能差异。

于 2013-01-17T13:35:04.450 回答
0

在性能方面,if更好,正如 Tin Man 所示。但有时,您需要编写 using&&或者and如果您想使其成为单行代码,例如主要部分包含要在条件中定义的非实例变量:

do_something_with(foo) if foo = something_that_comes_from_condition

将返回错误,但是

(foo = something_that_comes_from_condition) && do_something_with(foo)

或者

foo = something_that_comes_from_condition and do_something_with(foo)

没有这样的问题。

于 2013-01-17T15:25:26.873 回答