Ruby的块方法

时间:2014-12-07 06:23:21

标签: ruby

我正在阅读其文档中的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]
#   ...

2 个答案:

答案 0 :(得分:2)

除了chunk之外,该代码还使用了多种ruby方法,你需要弄清楚每种方法的作用,以便更好地了解正在发生的事情,所以让我们一起来看看<\ n / p>

Ruby File::Open

  

没有关联的块,File.open是:: new的同义词。如果   给出了可选的代码块,它将作为一个打开的文件传递给   参数和File对象将在自动关闭时   块终止。块的值将从中返回   File.open。

语法:open(filename [, mode [, perm]] [, opt]) {|file| block }

在您的情况下,我们在&#34; / usr / share / dict / words&#34;中打开了一个文件。作为&#34; iso-8859-1&#34;格式,然后我们将它传递到一个块,我们正在用它做更多的东西

这导致我们:

Ruby Enumerable::Chunk

  

枚举项目,根据返回值将它们组合在一起   块的值。返回同一块的连续元素   价值被捏在一起。

语法:somelist.chunk {|item_of_list| condition? } ## output是项目块&gt;&gt;按条件分组?结果(仍然不清楚&gt;&gt;检查文档中的第一个示例)

Ruby String::Ord

  

返回单字符字符串的整数序号   示例"a".ord #=> 97

最后我们有:

Ruby Integer::Chr

  

返回包含由...表示的字符的字符串   接收者的价值根据编码。

示例65.chr #=> "A"

他们如何一起玩:

  1. 我们打开一个包含英语单词的文件并将其传递给一个块。 输出&gt;&gt;是一个行数组
  2. 我们在文件行上应用chunk,其表达式计算每个字符整数序数&gt;&gt;所以对于以资本开头的行&#34; A&#34; line.ord = 65.现在每一行以&#34; A&#34;开头。将被分组在一个数组中。 输出&gt;&gt;是包含[序数chr值(例如65),满足条件的项目(行)数组(例如ord = 65的行)的对象数组
  3. 我们循环并打印每个ord值代表的字符(例如&#34; A&#34;代表65)以及字符出现的次数(通过计算行长度)
  4. 注意(个人开放):

    这个例子并不是最好的,我甚至不确定它的最终目标!必须有更简单的方法来实现这一点,并解释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获取该整数代码点,并将其转换回字符。因此,为什么子数组在第一个索引处具有字符,而在第二个索引处具有匹配该字符的连续行的总数。