0

我正在阅读 Russ Olsen 的“Eloquent Ruby”。在下面的代码(Loc 3264)之后,他说:“请注意,我们实际上从未构建所有单词对的四元素数组:我们只是动态生成单词对。” 我不明白这里发生了什么。那什么是词呢?

class Document
    #Most of the class omitted...

    def each_word_pair  
        word_array = words
        index = 0
        while index < (word_array.size-1)
            yield word_array[index], word_array[index+1]
            index += 1
        end
    end
end

doc = Document.new('Donuts', '?', 'I love donuts mmmm donuts')
doc.each_word_pair{|first, second| puts "#{first} #{second}"}
#=> I love
#=> love donuts
#=> donuts mmmm
#=> mmmm donuts
4

1 回答 1

6

那什么是词呢?

words是字符串'I love donuts mmmm donuts',不是他所说的“所有单词对的四元素数组”。

“请注意,我们实际上从未构建所有单词对的四元素数组:我们只是动态生成单词对。” 我不明白这里发生了什么。

他指的是数组[["I", "love"], ["love", "donuts"], ["donuts", "mmmm"], ["mmmm", "donuts"]]从不存在于each_word_pair方法中的事实。这是因为它创建了每个单独yield的对,然后将它们发送到调用块。所以它会生成第一对 ( ["I", "love"]),yield然后生成下一个。但each_word_pair它本身永远不会包含所有四个对。

例如,我们可以改用这种类似的方法:

def word_pairs
  word_array = words
  word_pairs = []

  index = 0
  while index < (word_array.size-1)
    word_pairs << [word_array[index], word_array[index+1]]
    index += 1
  end

  word_pairs
end

它创建一个包含所有四对的数组并返回它。注意我们必须构造一个额外的局部变量word_pairs

请注意,这each_word_pairRuby 核心的each_cons一个写得很糟糕的版本,名为 with 2

于 2013-07-28T03:48:57.877 回答