获取其值在数组中的最大值的变量

时间:2015-12-22 03:38:54

标签: arrays ruby

如果我在Ruby中有一组变量:

a = 4
b = 7
c = 1

array = [a, b, c]

如何访问具有最高值的变量名称? (在此示例中为b)我想检索对具有最高值的元素的引用,以便以后能够操作它:

b += 10 

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

4 个答案:

答案 0 :(得分:6)

通过编写array = [a, b, c]来构建数组时,数组中的点不会与名为abc的变量保持任何关联,所以你没有办法完全按照你所说的去做。这些变量可以在不影响数组的情况下进行更改。

您可以更改存储数据的方式以使其成为可能,但如果不知道存储的是哪种数据,则很难推荐一种好方法。您可以考虑将数据存储在哈希中,而不是存储在松散变量和数组中:

hash = { a: 4, b: 7, c: 1}

答案 1 :(得分: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或其元素可以在您检索索引的点之间进行修改,您决定更改相应值的位置。

Another answer表明存在模仿传递引用行为的黑客行为,但是在这样做时,你正在反对语言的意图,这可能会导致很多痛苦。

答案 2 :(得分:1)

如果你试图操纵最多三个值,那么你最好做这样的事情:

std::vector<ticket> tickets { std::istream_iterator<ticket>(input),
    std::istream_iterator<ticket>() };

如果您问的是出于学术目的的要求,那么您可以使用Ruby的Binding来检查局部变量的值。

array.max + 10  # or any other manipulation for that matter.

您还可以使用Binding#eval来操纵变量,例如:

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

请注意,我们需要使用binding.eval("#{var.to_s} += 10") #=> 17 ,因为var.to_s包含符号,我们需要将其转换为字符串以获取可在var中使用的变量名称字符串。

答案 3 :(得分:-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 >