我正在阅读其文档中的Ruby Enumerable的chunk
方法。
我想知道每个论点的含义。
因此,它首先打开一个文件。第二个参数是否意味着查找其ACSII代码?
| F |代表文档中的每一行? 那么,line.ord正在获得第一个字母的ACSII吗?
然后?我不太确定后一部分。
参考:http://ruby-doc.org/core-2.0/Enumerable.html
open("/usr/share/dict/words", "r:iso-8859-1") { |f|
f.chunk { |line| line.ord }.each { |ch, lines| p [ch.chr, lines.length] }
}
#=> ["\n", 1]
# ["A", 1327]
# ["B", 1372]
# ["C", 1507]
# ["D", 791]
# ...
答案 0 :(得分:2)
除了chunk
之外,该代码还使用了多种ruby方法,你需要弄清楚每种方法的作用,以便更好地了解正在发生的事情,所以让我们一起来看看<\ n / p>
没有关联的块,File.open是:: new的同义词。如果 给出了可选的代码块,它将作为一个打开的文件传递给 参数和File对象将在自动关闭时 块终止。块的值将从中返回 File.open。
语法:open(filename [, mode [, perm]] [, opt]) {|file| block }
在您的情况下,我们在&#34; / usr / share / dict / words&#34;中打开了一个文件。作为&#34; iso-8859-1&#34;格式,然后我们将它传递到一个块,我们正在用它做更多的东西
这导致我们:
枚举项目,根据返回值将它们组合在一起 块的值。返回同一块的连续元素 价值被捏在一起。
语法:somelist.chunk {|item_of_list| condition? }
## output是项目块&gt;&gt;按条件分组?结果(仍然不清楚&gt;&gt;检查文档中的第一个示例)
返回单字符字符串的整数序号 示例
"a".ord #=> 97
最后我们有:
返回包含由...表示的字符的字符串 接收者的价值根据编码。
示例65.chr #=> "A"
这个例子并不是最好的,我甚至不确定它的最终目标!必须有更简单的方法来实现这一点,并解释chunk
如何工作!
有点想法?请改进此示例(Ruby Documentation)
答案 1 :(得分:0)
我也同意提供#chunk of Enumerable的错误示例。但是第一个例子更清楚:
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5].chunk { |n|
n.even?
}.each { |even, ary|
p [even, ary]
}
#=> [false, [3, 1]]
# [true, [4]]
# [false, [1, 5, 9]]
# [true, [2, 6]]
# [false, [5, 3, 5]]
它对返回相同块值的连续元素进行分组。如果块值相同但不连续,则创建一个新组。子数组的第一个索引是块的返回值,第二个索引是连续具有相同返回值的元素的集合。直截了当。
下一个示例不太清楚,但是效果相同:
open("/usr/share/dict/words", "r:iso-8859-1") { |f|
f.chunk { |line| line.ord }.each { |ch, lines| p [ch.chr, lines.length] }
}
#=> ["\n", 1]
# ["A", 1327]
# ["B", 1372]
# ["C", 1507]
# ["D", 791]
我们不完全知道“ / usr / share / dict / words”包含什么。该文档未能公开此信息。同样,内核模块的打开迭代器将文件对象传递到其块。显然,块迭代器将文件的每一行传递到其块,类似于读取行(不是读取行)。 ord采用整行首字符的整数代码点。 (作为附带说明,对于unicode字符,我认为使用mb_chars.ord更安全)。因此,就像另一个示例一样,这会将返回相同块值的连续元素分组。现在chr获取该整数代码点,并将其转换回字符。因此,为什么子数组在第一个索引处具有字符,而在第二个索引处具有匹配该字符的连续行的总数。