在块内的范围内调用'each'会有什么影响?

时间:2017-10-25 03:46:04

标签: ruby

我应该定义一个方法substrings,它将返回一个哈希,列出与定义的字符串数组匹配的子串的出现次数。这是代码

dictionary = ["below", "down", "go", "going", "horn", "how", "howdy", "it", "i", "low", "own", "part", "partner", "sit"]

def substrings(sentence, dictionary)
  substrings = Hash.new(0)
  words = sentence.split(" ")
  words.each { |word|
    word = word.downcase
    characters = word.split("")
    length = characters.length
    (0...length).each { |start|
      substring = []
      (start...length).each { |stop|
        substring.push(characters[stop])
        if (dictionary.include?(substring.join))
          substrings[substring.join] += 1
        end
      }
    }
  }
  puts substrings
end

substrings("Howdy partner, sit down! How's it going?", dictionary)

我对这段代码很感兴趣

(0...length).each { |start|

我想知道调用了什么each方法。我没有看到为要调用的each方法明确列出的数组。列出了一个范围,但它如何知道范围所指的数组?它只是在它当前所在的块上调用它吗?

2 个答案:

答案 0 :(得分:2)

  

我对这段代码很感兴趣

(0...length).each { |start|
     

我想知道调用了each方法。

Range literal 0...length上调用它。

  

我没有看到为要调用的each方法明确列出的数组。

为什么Array需要each?有很多类实现eachENVARGFDirEnumeratorHashIO,{ {3}},RangeStruct,这就是核心库中的那些。标准库中还有更多内容,例如Array中的CSV#eachcsv library中的Matrix#eachVector#eachmatrix library,{{ {},REXML::QuickPath#eachREXML::XPath#eachREXML::AttlistDecl#eachREXML::Attributes#eachREXML::Elements#eachREXML::Light::Node#eachREXML::Parent#each位于{{ 3}},REXML::Parsers::PullParser#each中的REXML::SyncEnumerator#eachrexml library中的Set#eachset library中的StringIO#each,可能还有更多。当然,在更广泛的Ruby生态系统中可能有数百个其他的,例如Ruby on Rails中有14个each实现。

  

列出了一个范围,但它如何知道范围所指的数组?

没有。 Range不是指数组。它指的是一个范围。

  

它只是在它当前所在的块上调用吗?

您无法调用块上的方法。您只能调用对象上的方法,而块不是Ruby中的对象。 (您可以隐藏一个块,但它会变成一个普通的Proc对象。Proc不响应each,因此您无法调用each那,或者。)

答案 1 :(得分:1)

length定义为:

length = characters.length

characters定义为:

characters = word.split("")

wordwords上的迭代的块变量,定义为:

words = sentence.split(" ")

换句话说,(0...length).each遍历word中每个字符的索引,这是通过将sentence拆分为空格而产生的。