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]? 
    ++@count[word1][word2]

但这是两行额外的“防御”代码。有没有办法更紧凑地做到这一点,所以我可以维护更少的代码?

(把它放在一个三元语句中并没有真正使它更紧凑,只是对于相同数量的逻辑来说更少的字符。)

4

1 回答 1

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

顺便说一句,支持这种自动对象创建被称为autovivification,并且已经在 CoffeeScript 问题上进行了讨论。此外,Coco,一种源自 CS 的语言,拥有它:)

于 2013-04-20T16:20:23.927 回答