[v.abs,-v]如何工作?

时间:2016-04-21 16:41:48

标签: ruby

我知道这段代码会返回一个绝对值最小的数字:

arr.min_by { |v| [v.abs, -v] }

这部分[v.abs, -v]如何运作?有人可以解释这段代码吗?

2 个答案:

答案 0 :(得分:2)

数组的比较方式是逐个比较这些值。 Aka是第一个阵列中的第一个,第一个是第二个,第二个是第二个,依此类推。换句话说,这首先通过绝对值进行比较。如果它们相同,则按否定值进行比较。

class PassByReference:
    def __init__(self, name):
        self.name = name

def changeRef(ref):
    ref[0] = PassByReference('Michael')

obj = PassByReference('Peter')
print obj.name

p = [obj] # A pointer to obj! ;-)
changeRef(p)

print p[0].name # p->name

换句话说,而不是具有

的自然顺序
  

..., - 2,-1,0,1,2,......

你有

  

0,1,-1,2,-2,......

答案 1 :(得分:0)

v.abs返回数字的绝对值:

-10.abs
=> 10

-v只会给你倒数字的数字:

v = 10
-v
=> -10
v = -10
-v
=> 10

min_by将首先比较绝对值,然后比较否定值。所以它给你数组中较小的数字与标志无关:

[-1, 2, -3].min_by { |v| [v.abs, -v] }
=> -1
[1,2,-3].min_by { |v| [v.abs, -v] }
=> 1