为什么Dir.glob("*.txt").sort也需要.each?

Cam*_*une 8 ruby arrays glob ruby-1.9.3

Dir.glob("*.txt") {|f| p f} 打印文件名.

Dir.glob("*.txt").sort {|f| p f} 失败并出现ArgumentError.

Dir.glob("*.txt").sort.each {|f| p f} 按字母顺序打印文件名.

为什么第二个失败?更好的是,为什么第一个工作,有或没有.each

  • Dir.glob并且Dir.glob.sort都是数组.
  • Dir.glob.methods == Dir.glob.sort.methods.

(受Dir.globAlphabetize结果的启发.与Dir.glob的重复并没有排序问题,因为"第三个"已经回答了那个人的问题.)

mu *_*ort 5

第二个失败,因为sort {|f| p f}真的没有意义.您使用的块sort应该"返回-1,0或+1"并获取两个参数(要比较的元素),但您的块接受一个参数并返回该参数,因为p str返回str.

第三个很好,因为sort默认比较器块相当于说:

sort { |a, b| a <=> b }
Run Code Online (Sandbox Code Playgroud)

所以很.sort.each有道理.

如果您使用sort第二个示例中所需的块类型:

Dir.glob("*.txt").sort {|a, b| a <=> b }
Run Code Online (Sandbox Code Playgroud)

事情会更好.或者,如果您想按升序词汇顺序对事物进行排序,则可以省略该块:

Dir.glob('*.txt').sort
Run Code Online (Sandbox Code Playgroud)


And*_*ica 4

另一个答案是正确的,但我认为还有更深层次的解释。当方法调用后有一个块时,例如Dir.glob("*.txt") {|f| p f},该块是该方法的(可选)参数。在 的定义中Dir.glob,有一条yield运行该块的语句。

当您链接方法时(例如 in )Dir.glob("*.txt").sort {|f| p f},块将成为方法的参数,sort而不是glob方法本身。sort也可以使用一个块来定义比较,但这个块在这种情况下没有意义。

链接each到 getDir.glob("*.txt").sort.each {|f| p f}使该块成为该方法的参数each,该glob方法像使用它一样(为每个参数运行该块)。