我使用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]https://stackoverflow.com/questions/30411044
复制相似问题