2017-08-10 37 views
0

哪一種更好的做法來存儲鍵值對?ruby​​中的鍵值對,array與hash

數組:

class A 
    DEFAULTS = [ONE = 1, TWO = 2] 
end 

或哈希:

class A 
    DEFAULTS = {'ONE' => 1, 'TWO' => 2 } 
end 
+0

你將如何訪問數組中的值? –

+0

'A :: ONE'和'A :: TWO',我覺得有點尷尬。 – Liroy

+1

你的問題不清楚。這兩個代碼片段*完全不同的東西*。我從字面上無法想象在兩種情況之間進行選擇的情況。另外,第一個代碼是*嚴重*混淆,任何編寫這樣的代碼的人都應該被解僱。 –

回答

5

這是一個更好的做法?

TL; DR你可能想要一個散列。


你的第一個例子看起來像鑰匙和價值觀,但它實際上是等同於:

class A 
    ONE = 1 
    TWO = 2 
    DEFAULTS = [ONE, TWO] 
end 

所以要創建三個常量:

A.constants #=> [:DEFAULTS, :ONE, :TWO] 

A::ONE #=> 1 
A::TWO #=> 2 
A::DEFAULTS #=> [1, 2] 

而且你要訪問通過索引的陣列值01

A::DEFAULTS[0] #=> 1 
A::DEFAULTS[1] #=> 2 

第二個只創建一個常數

A.constants #=> [:DEFAULTS] 

A::DEFAULTS #=> {"ONE" => 1, "TWO" => 2 } 

而且,您可以通過按鍵'ONE''TWO'訪問值:

A::DEFAULTS['ONE'] #=> 1 
A::DEFAULTS['TWO'] #=> 2 

第三種選擇是使用命名空間模塊:

class A 
    module DEFAULTS 
    ONE = 1 
    TWO = 2 
    end 
end 

它創建嵌套的常數:

A.constants #=> [:DEFAULTS] 

A::DEFAULTS #=> A::DEFAULTS 

A::DEFAULTS.constants #=> [:ONE, :TWO] 

A::DEFAULTS::ONE #=> 1 
A::DEFAULTS::TWO #=> 2 
1

它使絕對沒有任何意義問「哪個是更好的做法」,因爲他們做完全不同的事情

第一代碼段

  • 創建一個常數名爲TWO和值2分配給它
  • 創建一個名爲ONE常數和值1分配給它
  • 創建一個常數名爲DEFAULTS和給它賦值[1, 2]

的第二代碼片段

  • 創建一個名爲DEFAULTS常數和值{ 'ONE' => 1, 'TWO' => 2 }分配給它

兩個代碼片段的共同點幾乎一無所有。永遠不可能有一種情況,你可以選擇使用其中一種。

+0

我明白,但我的意思是存儲鍵值對。 – Liroy

+0

第一個代碼段*不存儲鍵值對*。 **完全**。因爲其中一個不存儲鍵值對,因此無論如何比較這兩個代碼片段都是爲了存儲鍵值對。第一個片段只是一種極其混亂的寫作方式'ONE = 1; TWO = 2;默認值= [1,2]'。 –

+0

絕對同意。感謝您的洞察力。 – Liroy

0

那麼,你不太明白第一個如何工作。

在這種情況下,你創建:

  • A級
  • A ::默認值== [1, 2]
  • A :: ONE
  • A ::二

所以表達DEFAULTS = [ONE = 1, TWO = 2]沒有多大意義。

,等於

class A 
    DEFAULTS = [1, 2] 
    ONE = 1 
    B = 2 
end 

所以,你需要決定如何你想訪問這些常量:通過A::ONE或通過A::DEFAULTS['ONE']

附:我建議你閱讀關於Ruby模塊(如果你喜歡,你可以稱它們爲namespeces)。這是非常重要的