获取数组中值最大的变量

4
如果我有一个 Ruby 变量数组:
a = 4
b = 7
c = 1

array = [a, b, c]

如何获取具有最高值的变量名称?(在此示例中为b)我想检索具有最高值的元素的引用,以便稍后操纵它:

b += 10 

我尝试了array.max,但它只返回最大值7

不清楚你的意思。b 不是等于 7 吗? - sawa
4
需要仔细阅读才能理解,但我认为需要提及对b的引用,而不仅仅是b的值。 - Daniel Stevens
@DanielStevens 是的,那就是我应该说的。 - Mushy
4个回答

6
当您通过编写array = [a, b, c]创建一个数组时,数组中的位置不会与名称为abc的变量保持任何关联,因此没有办法完全做到您所说的事情。那些变量可以更改,而不影响数组。
您可以更改存储数据的方式以使其成为可能,但是如果不知道您正在存储的数据,很难建议一个好的方法来实现它。您可以考虑将数据存储在哈希表中,而不是松散的变量和数组:
hash = { a: 4, b: 7, c: 1}

2
你可以继续确定关键字:hash.key(hash.values.max) - pjs

4

Ruby不支持按引用传递对象,这实际上就是你试图做的事情。当你调用array.max时,你将得到一个Fixnum 7的副本,并且赋值和修改将应用于该副本。

也就是说,你不能存储对这个Array元素的引用,并在以后修改它。然而,你可以使用以下方法直接修改最大值:

array[array.index(array.max)] = array.max + 10
#=> 17

array
#=> [4, 17, 1]

请注意,当 Array 中存在重复值时,array.index(array.max) 将返回第一个值的索引。
存储索引以供以后使用并不是一个可靠的解决方案,因为在 Ruby 中,Array 是有序的,但是在检索索引和决定更改相应值之间,Array 或其元素可能会被修改。
另一个答案 建议有一种方法可以模拟按引用传递的行为,但是这样做会违反语言的意图,并且可能会导致很多问题。

1
像哈希和数组这样的对象经常被引用传递。我想你的意思是其他的,比如变量不能通过引用传递。 - David Grayson

1
如果你想操作三个值的最大值,那么最好这样做:
array.max + 10  # or any other manipulation for that matter.

如果您出于学术目的询问您所问的内容,那么您可以使用Ruby的Binding来检查本地变量的值。
a = 4
b = 7
c = 1

array = [a, b, c]

# Select variable whose value matches with maximum of three elements
# Variable's name as symbol is obtained by this process
var = binding.send(:local_variables).select do |i| 
    array.max.eql? binding.local_variable_get(i)
end.first
#=> :b

# Update value of variable using symbol representing  its name
binding.local_variable_set(var, binding.local_variable_get(var) + 10)

puts b
#=> 17

你也可以使用绑定#eval来操作变量,例如:
binding.eval("#{var.to_s} += 10")
#=> 17

请注意,我们需要使用var.to_s,因为var包含一个符号,我们需要将其转换为字符串以获取变量名字符串,以便在eval中使用。

-1

你可以使用Array#index来实现这个功能。

1.9.3-p484 :008 > max_elem = array.index(array.max)
 => 1
1.9.3-p484 :009 > array[max_elem] = array[max_elem] + 10
 => 11
1.9.3-p484 :010 > array
 => [4, 17, 1]
1.9.3-p484 :011 >

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接