如果用户是所有者,我有条件检查删除和文章。
delete_article if user.owner?
另一种方法是
user.owner? && delete_article
选择其中任何一个有什么好处还是只是一种写作风格
如果用户是所有者,我有条件检查删除和文章。
delete_article if user.owner?
另一种方法是
user.owner? && delete_article
选择其中任何一个有什么好处还是只是一种写作风格
性能不太可能成为该声明的问题。
第一个要好得多 - 更容易阅读。你未来的自己和其他将开始编写代码的人会感谢你的。
您可以使用这两种样式,但逻辑上存在一些差异。
在方法调用中使用:
def something
delete_article if user.owner?
end
将返回方法 delete_article 返回的任何内容,或者nil
如果用户不是所有者。
和:
def something
user.owner? && delete_article
end
false
如果用户不是所有者,它将返回。如果用户是所有者,它将返回方法 delete_article 返回的任何内容。
性能应该差不多。
这是一些测试if
vs.速度的代码&&
。
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)
我相信这两种写作风格都会有相同的表现。总是更喜欢第一个版本,因为它更容易阅读,虽然被认为是“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
他们应该有相同的性能,因为他们做同样的事情,或者至少可以忽略不计的性能差异。
在性能方面,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)
没有这样的问题。