2013-04-20 38 views
1

我已經寫了一個工具來計算文本中單詞對的頻率,這樣每次單詞B跟隨單詞A時,單詞[A] [B]的計數就會增加。緊湊的方式將新值添加到地圖的地圖?

在Perl中,哈希的哈希和哈希會在您第一次嘗試訪問哈希時自動實例化,這使代碼變得簡單。在Javascript中,您似乎必須先創建內部代碼,這會使代碼變得更長。

在CoffeeScript中,這個功能:

class Adder 
    ... 
    addPair: (word1, word2) -> 
    @count[word1] = {} if not @count[word1]? 
    @count[word1][word2] = 0 if not @count[word1][word2]? 
    [email protected][word1][word2] 

,但它的 '防禦' 兩個代碼多餘的線條。有沒有辦法更緊湊地做到這一點,所以我可以維護更少的代碼?

(在三元聲明中把它並沒有真正使其更緊湊,對於相同數量的邏輯只是個字符)。

+0

您不能真正刪除邏輯,因爲您只需要它。只有你可以將它移動到輔助函數中。另外,你是否考慮使用短路OR,而不是三元操作符? – Bergi 2013-04-20 15:01:45

回答

1

您可以通過使用or=運營商減少這些線路的詳細程度(或?=,但它沒有必要在這些情況下):

addPair: (word1, word2) -> 
    @count[word1] or= {} 
    @count[word1][word2] or= 0 
    @count[word1][word2] += 1 

你也可以打高爾夫球這兩個初始化行成一個(雖然我認爲這將導致更少的可讀的代碼):

addPair: (word1, word2) -> 
    (@count[word1] or= {})[word2] or= 0 
    @count[word1][word2] += 1 

順便說一下,支持這種自動對象創建在CoffeeScript問題上被稱爲autovivificationhas been discussed。另外,Coco語言,CS語言,has it :)

+0

那麼,這至少有一點*更緊湊,並減少了變量被命名的次數。 – 2013-04-22 13:06:15