2012-05-06 127 views
0

我有一個哈希看起來像這樣:哈希缺失值,引發異常

items: 
    item: 
     attribute_a: cheese 
     attribute_b: bacon 
    item: 
     attribute_a: salmon 
    item: 
     attribute_a: mushrooms 
     attribute_b: steak 

我想獲得的attribute_b的價值,我使用了以下內容:

if (result['attribute_b']) 
    // do something 
end 

然而如果缺少attribute_b,我收到一個錯誤:

The Identifier specified does not exist, undefined method '[] for nil:NilClass' 

什麼是(最好的)正確的方法檢查attribute_b是否存在?

+0

在哪一行究竟你得到這個錯誤?什麼是'結果'? –

+0

您的評論語法無效。你可以在'if'條件中省略括號。 –

+0

具體而言,我不認爲語法是* invalid * - 但是它確實不需要它。如果您認爲它更清楚,那麼使用括號進行說明是恰當的。在這種情況下,它可能沒有區別,所以放棄它們可能是最好的方法。我認爲這取決於你。 –

回答

2

看起來好像在獲取錯誤時不是訪問屬性'attribute_b',而是因爲result爲零。

The Identifier specified does not exist, undefined method [] for nil:NilClass` 

這是說你打電話的方法[]在零值。你打電話'[]'唯一的是result

你所訪問'attribute_b'的方式是一般可以接受的 - 我可能是更具體的說:

if (result && result.has_key? 'attribute_b') 
// do something 
end 

這將確保result存在以及確保該屬性不爲空。

+1

不是「指定的標識符不存在」部分混淆了你?還有更多的事情不僅僅是簡單的哈希訪問。 –

+1

最好使用'result.has_key? 'attribute_b'而不是'!result ['attribute_b']。nil?',因爲在某些情況下'nil'值可能是有效的。 – Flexoid

+0

可能。但我認爲很明顯他可能得到了一個「結果」,所以我首先想到的是確定原因。你可能是正確的,因爲這是我們在這裏看到的東西。 –

0

首先,你的YAML結構看起來不好(是YAML?)。密鑰item不能包含多個元素的哈希,因爲密鑰必須是唯一的。您應該使用數組。

我建議你組織你YAML沿着這此行:

items: 
    - 
    attribute_a: cheese 
    attribute_b: bacon 
    - 
    attribute_a: salmon 
    - 
    attribute_a: mushrooms 
    attribute_b: steak 

然後,你可以做

require 'yaml' 
result = YAML.load(File.open 'foo.yml') 
result['items'][0]['attribute_b'] 
=> "bacon" 
+0

對不起,我正在做真正的代碼thing.to_yaml。我只是捏造了它的結構以簡化問題。 – Tom

+0

把你的問題弄錯了......但是'result && result.has_key?'是要走的路。 –

+0

啊我覺得有人編輯我的問題,讓每個人都更清楚,謝謝你! – Tom