如果我在Ruby中有一组变量:
a = 4
b = 7
c = 1
array = [a, b, c]
如何访问具有最高值的变量名称? (在此示例中为b
)我想检索对具有最高值的元素的引用,以便以后能够操作它:
b += 10
我尝试array.max
,但只返回最大值7
答案 0 :(得分:6)
通过编写array = [a, b, c]
来构建数组时,数组中的点不会与名为a
,b
和c
的变量保持任何关联,所以你没有办法完全按照你所说的去做。这些变量可以在不影响数组的情况下进行更改。
您可以更改存储数据的方式以使其成为可能,但如果不知道存储的是哪种数据,则很难推荐一种好方法。您可以考虑将数据存储在哈希中,而不是存储在松散变量和数组中:
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 >