2010-05-09 31 views
5

一般來說這是更好地使用?:使用散列或case語句[紅寶石]

case n 
when 'foo' 
result = 'bar' 
when 'peanut butter' 
result = 'jelly' 
when 'stack' 
result = 'overflow' 
return result 

map = {'foo' => 'bar', 'peanut butter' => 'jelly', 'stack' => 'overflow'} 
return map[n] 

更具體地講,當我應該使用的情況下,語句和什麼時候應該簡單地使用散列?

+0

這些似乎是比較奇怪的事情。情況是邏輯,哈希是一個數據結構。你有一個具體的例子,你試圖決定使用哪一個?上下文將幫助人們提供有用的答案。 – Greg 2010-05-09 20:39:51

+0

作爲一般說明,可以(並經常)在ruby方法中省略return語句。在你的第一個例子中,假設除了返回結果之外,你沒有對'result'進行任何操作,你實際上可以刪除返回語句和賦值給'result'變量。 – 2010-05-09 23:20:59

+2

我有時會使用user94154的方法,即使它感覺有點奇怪。我不認爲這是一個愚蠢的問題。 – 2010-05-09 23:28:07

回答

11

哈希是一個數據結構,case語句是一個控制結構。

當您只是檢索一些數據時(例如您提供的示例),您應該使用散列。如果需要執行額外的邏輯,您應該寫一個case語句。

另外,如果你需要執行一些模式匹配,是有意義的使用case語句:

 

#pattern matching using ranges 
letterGrade = case score 
    when 0..64 then "F" 
    when 65..69 then "D" 
    when 70..79 then "C" 
    when 80..89 then "B" 
    when 90..100 then "A" 
    else "Invalid Score" 
end 

#pattern matching using regular expressions 
case songData 
    when /title=(.*)/ 
    puts "Song title: #$1" 
    when /track=(.*)/ 
    puts "Track number: #$1" 
    when /artist=(.*)/ 
    puts "Artist name: #$1" 
end 

 
8

一般來說,「更好」,在編程意味着不同的事情。例如,更好的程序

  1. 更容易理解,即 表達意圖更好地
  2. 更容易維護。例如, 較少的代碼行,少 容易出錯,等等
  3. 具有更好的性能,在 執行時間
  4. 具有更好的性能而言,在 存儲器使用

等方面

由於我們在談論Ruby,所以性能通常不太重要。如果你真的需要性能,你可能會考慮另一種編程語言。所以,我會先看標準(1)和(2)。更好看的Ruby代碼通常代表一個「更好」的程序。哪些代碼看起來更好?哪種表達意圖更好?如果添加/刪除邏輯,哪個更容易修改?這取決於你的問題,這在某種程度上是品味的問題。

對我來說,在你的簡短例子中,哈希解決方案更好。案例解決方案提供了更大的靈活性,在這種情況下您不需要(但在其他情況下可能需要)。

3

哈希表和case語句有兩個主要區別。

  1. 哈希表可以在詞法環境中存儲,修改和重用,而case語句不能。它產生一個結果,然後消失。但是請注意,如果case語句位於一個塊/方法內,它可以通過多次調用塊/方法多次使用(但不容易修改)。
  2. 散列表字面表達式總是評估它的所有鍵和值,而case語句只評估它需要的「鍵」和它要返回的「值」。這通常是更關鍵的區別,因爲正如Derek B.所指出的那樣,這些值可能會涉及額外的邏輯,如果只需要其中一個值,那麼執行不必要的操作可能會非常昂貴。

case n 
when 'foo' 
'bar' 
when 'peanut butter' 
'jelly' 
when 'stack' 
'overflow' 
end 

這相當於您的代碼,在使用Ruby或函數式編程語言一段時間之後,它會顯得更加自然。它也更短。