我使用File.open('file.txt').class和File.open('file.txt').readlines.class进行检查,前者返回文件,后者返回数组。
我理解这种区别,但如果我做这样的事情:
File.open('file.txt').collect {|l| l.upcase}
=== File.open('file.txt').readlines.collect {|l| l.upcase}它还真。那么,当对象中的每个项作为参数传递给块时,这两个对象之间有什么区别吗?
而且,我还假设两个表达式中传递给块的参数都是文件中的一行字符串,这使得比较返回为真,对吗?如果是这样的话,我如何知道在编写代码时会向块传递什么样的参数?我需要检查像文档或源代码这样的东西吗?
例如,我知道
['a','b','c'].each_with_index { |num, index| puts "#{index + 1}: #{num}" } 工作而且认为这是理所当然的。但是,我如何知道第一个参数应该是数组中的每个项,第二个参数应该是索引,而不是相反?
希望这是有意义的,谢谢!
发布于 2015-05-23 11:01:50
在irb中做一些Ruby内省就可以了。
irb(main):001:0> puts File.ancestors.inspect
[File, IO, File::Constants, Enumerable, Object, Kernel, BasicObject]这个结果向我们展示了File类继承的类,其中包含了类枚举的方法。那么从File.readlines返回什么对象呢?我想是阵列,让我们检查一下。
ri File.readlines
IO.readlines(name, sep=$/ [, open_args]) -> array
IO.readlines(name, limit [, open_args]) -> array
IO.readlines(name, sep, limit [, open_args]) -> array这可能是过份的,但我们可以验证数组中存在的可枚举方法。
irb(main):003:0> puts Array.ancestors.inspect
[Array, Enumerable, Object, Kernel, BasicObject]发布于 2015-05-23 10:57:52
我将尽量使这一反应尽可能紧凑。
第二个问题--如果您对来自标准库的对象进行操作,那么您可以始终引用它们的文档,以便100%确定在传递一个块时所期望的参数。例如,您将多次在不同的数据结构(Array, Hash, ...)上使用像Array, Hash, ...这样的方法。在您习惯它们之前,您可能会在文档中找到有关它们的所有信息,例如:http://ruby-doc.org/core-2.2.0/Array.html
如果您是在非核心数据结构上操作(例如,一个来自gem的类,您应该始终浏览它的文档或Github上的源代码)。
第一个问题。结果可能是相同的,当使用不同的方法,但在更深层次上可能有一些差异。因为你的案子是基于文件的。读取文件内容可以通过两种方式处理。首先将所有内容读入内存,然后对字符串数组进行操作,第二次读取的文件行可能会持续更长时间,但不会保留那么多内存。
发布于 2015-05-23 14:23:53
在Enumerable#each_with_index中,参数与它们在方法名称本身中的顺序相同,首先是元素,然后是索引。each_with_object也是如此。
https://stackoverflow.com/questions/30411044
复制相似问题