2015-12-22 39 views
4

最大。如果我有一個變量數組在紅寶石:獲取變量,其值是一個數組

a = 4 
b = 7 
c = 1 

array = [a, b, c] 

我如何才能訪問到具有最高值的變量的名稱? (在這個例子中b)我想恢復到最高值的元素的引用,才能夠在以後對其進行操作:

b += 10 

我想array.max但只是返回最大值7

+0

不清楚你的意思。不是'b'' 7'? – sawa

+4

它確實需要仔細閱讀才能理解,但我認爲需要引用'b',而不僅僅是'b'的值。 –

+0

@DanielStevens是的,這就是我應該說的。 – Mushy

回答

6

當您通過編寫array = [a, b, c]來構建陣列時,陣列中的點不保留與名爲a,bc的變量的任何關聯,因此您無法完全按照您所說的內容進行操作。這些變量可以改變而不會影響數組。

您可以更改存儲數據的方式,以便使其成爲可能,但不知道要存儲哪些數據是很難推薦的一種好方法。你可以考慮存儲寬鬆變量的哈希內,而不是和數組數據:

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

然後你可以繼續確定鍵值:'hash.key(hash.values.max)' – pjs

4

Ruby沒有通過引用支持傳遞對象,基本上是你正在嘗試做的。當您致電array.max時,您會通過Fixnum7的副本,並將分配和修改應用於此副本。

也就是說,您不能存儲對此Array元素的引用,並稍後進行修改。您可以修改最大值當場,但是使用:

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

array 
#=> [4, 17, 1] 

注意,當有在Array重複值,array.index(array.max)將返回第一個索引。

存儲索引供以後使用並不是一個可靠的解決方案,因爲雖然訂購了Ruby中的Array s,但Array或其元素可以在您檢索索引的點和您決定更改的點之間進行修改相應的值。


Another answer表明有一個黑客模擬傳遞的引用行爲,但在做這個,你對語言的意圖工作,它可能會導致很多痛苦的倒行。

+1

像哈希和數組這樣的對象一直被引用傳遞。我想你的意思是說別的東西,就像變量不能通過引用傳遞一樣。 –

-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 > 
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 

您還可以使用Binding#eval來操縱變量,例如,:

binding.eval("#{var.to_s} += 10") 
#=> 17 

請注意,我們需要使用var.to_svar包含一個符號,我們需要將其轉換爲字符串得到變量名的字符串,在eval使用。

相關問題