2009-11-15 69 views
3

情況下我有幾個變量:指定一個替換值中的零

name 
age 
address 
phone 
social_security 
email 
weight 

和陣列稱爲personal_details與每個在位置0-6這些值。

所以我分配值是這樣的:

name = personal_details[0] 
address = personal_details[1] 
phone = personal_details[2] 
social_security = personal_details[3] 
email = personal_details[4] 
weight = personal_details[5] 

在某些情況下,然而,在右側的數據不存在。

什麼是更好的方法來處理這比寫這樣的數組中的每個元素?

if !personal_detail[0].nil? 
name = personal_details[0] 
else 
name = "" 
end 
if !personal_detail[1].nil? 
address = personal_details[1] 
else 
address = "" 
end 

回答

10

你可以這樣做,因爲一個nil值返回false,如果左邊是假的||只會評估右側:

name = personal_details[0] || '' 
2
name = personal_details[0] || "" 
1

更新:這是不正確的,請參閱下面的討論。

有一個內置的方式與Array#fetch做到這一點:

personal_details = ['Joe User', nil, '12 Main Street'] 

name = personal_details.fetch(0, '') 
age  = personal_details.fetch(1, '') 
address = personal_details.fetch(2, '') 

其他的解決方案將正常工作,根據您所提供的例子。如果右側的其中一個值設置爲false,則||方法將返回空字符串而不是值。

+0

你確定'fetch'按照你的想法工作嗎?從文檔:嘗試返回位置索引處的元素。如果索引*位於數組之外* ...將返回默認值。使用'irb'進行快速實驗表明,如果您請求的索引處有任何*項(即使是'nil'),它也不會返回默認值。所以它不適用於OP的情況,因爲他不知道超出陣列末尾的物品。 – Telemachus 2009-11-15 11:42:40

+0

你是對的 - 我測試了代碼,沒有看到任何內容,只是假定它返回空字符串。相反,它的第一眼看起來是零。我會編輯答案。 – 2009-11-16 01:53:47