我知道这段代码会返回一个绝对值最小的数字:
arr.min_by { |v| [v.abs, -v] }
这部分[v.abs, -v]
如何运作?有人可以解释这段代码吗?
答案 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