2016-11-27 146 views
1

考慮此紅寶石代碼:在初始化散列到局部變量時避免重複鍵名?

red = '#f00' 
green = '#0f0' 
colors = {red: red, green: green} 

在最後行中的重複是不雅觀。

在ES6的javascript,有一個很好的快捷方式:

const red = '#f00' 
const green = '#0f0' 
const colors = {red, green} // creates {red: '#f00', green: '#0f0'} 

有沒有辦法實現紅寶石類似的東西嗎?

+1

簡短回答是否。沒有什麼內置的行爲就像這樣,據我所知,你不能重載散列構造的'{}'。 –

回答

0

據我所知Ruby中沒有這樣的語法。

但是,您可以做這樣的事情:

red = '#f00' 
green = '#0f0' 
colors = Hash[[:red, :green].map { |v| [v, eval(v.to_s)] }] 

這是真的更好嗎?可能不是隻有兩個鍵的情況,但它可能是在幾十個鍵的情況下。

請注意,這使用eval()來獲取變量值 - 僅在受信任的數據上運行它!如果他們是實例變量,您可以使用(安全)instance_variable_get

@red = '#f00' 
@green = '#0f0' 
colors = Hash[[:red, :green].map { |v| [v, instance_variable_get("@#{v}")] }]