我应该定义一个方法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
方法明确列出的数组。列出了一个范围,但它如何知道范围所指的数组?它只是在它当前所在的块上调用它吗?
答案 0 :(得分:2)
我对这段代码很感兴趣
(0...length).each { |start|
我想知道调用了
each
方法。
在Range
literal 0...length
上调用它。
我没有看到为要调用的
each
方法明确列出的数组。
为什么Array
需要each
?有很多类实现each
:ENV
,ARGF
,Dir
,Enumerator
,Hash
,IO
,{ {3}},Range
,Struct
,这就是核心库中的那些。标准库中还有更多内容,例如Array
中的CSV#each
,csv
library中的Matrix#each
和Vector#each
,matrix
library,{{ {},REXML::QuickPath#each
,REXML::XPath#each
,REXML::AttlistDecl#each
,REXML::Attributes#each
,REXML::Elements#each
,REXML::Light::Node#each
和REXML::Parent#each
位于{{ 3}},REXML::Parsers::PullParser#each
中的REXML::SyncEnumerator#each
,rexml
library中的Set#each
,set
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("")
word
是words
上的迭代的块变量,定义为:
words = sentence.split(" ")
换句话说,(0...length).each
遍历word
中每个字符的索引,这是通过将sentence
拆分为空格而产生的。