我只想比较两个 Fixnums 的符号。现在我正在使用:
c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0)
我想要类似的东西:
c = -c if a.sign != b.sign
或者也许只是比较符号的其他方式。
我只想比较两个 Fixnums 的符号。现在我正在使用:
c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0)
我想要类似的东西:
c = -c if a.sign != b.sign
或者也许只是比较符号的其他方式。
也许只是乘法:
c = -c if a*b < 0
您可以使用与“ ”a >= 0
类似的目的,用于正(非负)和负:a.sign
true
false
c = -c if (a>=0) != (b>=0)
如果您经常使用它,并且想要一种更 Ruby 风格的感觉,那么可能值得您花点时间阅读上面的评论并对其进行修补,就像Numeric#pos?
可能一样。
这个问题让我开始在我的汇编工具箱中四处寻找,我已经多年没有打开它了。我认为这会做你正在寻找的东西:
c = -c if (a < 0) ^ (b < 0)
这是它正在做的事情:
irb(main):006:0> 真 ^ 真 => 假的 irb(main):007:0> 真 ^ 假 => 真 irb(main):008:0> 假 ^ 真 => 真 irb(main):009:0> 假 ^ 假 => 假的
根据您的代码,另一种使用方法是在三元语句中使用它:
((a < 0) ^ (b < 0)) ? -c : c
这是一些基准代码和结果:
require 'benchmark'
puts `ruby -v`
N = 10_000_000
A = 1
B = 1
Benchmark.bm(5) do |bench|
bench.report('^') { N.times { (A < 0) ^ (B < 0) } }
bench.report('!=') { N.times { (A>=0) != (B>=0) } }
bench.report('<') { N.times { A*B < 0 } }
end
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.0]
user system total real
^ 5.740000 0.000000 5.740000 ( 5.743873)
!= 4.300000 0.000000 4.300000 ( 4.304685)
< 3.310000 0.000000 3.310000 ( 3.312378)
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
user system total real
^ 1.480000 0.000000 1.480000 ( 1.484879)
!= 1.400000 0.000000 1.400000 ( 1.401381)
< 1.260000 0.000000 1.260000 ( 1.256628)
那是 10M 循环,这是一个堆 o' 循环。看起来像是 steenslag FTW!