枚举器返回文件的每一行,但是扼杀了

时间:2016-04-26 10:09:30

标签: ruby

我想写一个方法返回一个枚举器(类似于def chomped_lines(filename) File.foreach(filename).map(&:chomp).each end 返回的一个),它连续返回一个文件的每一行,但是却扼杀了。我的第一个方法是

my_enum = chomped_lines('my_file.txt')
....
my_enum.each { |line| .... }

并将其用作

map

我猜,Enumerator :: lazy可以在某种程度上使用,但无论如何,代码应该在Ruby 1.9.3上运行,这意味着我还没有懒惰的枚举器。

写这样一个枚举器的好方法是什么?

这似乎有效,但如果我理解正确(如果我错了请纠正我),该文件将作为一个整体插入内存中,以便应用$review['review_date'] = date( 'F m, Y',strtotime($old_date));

2 个答案:

答案 0 :(得分:3)

我写了一堂我相信你想做的课。它也是https://gist.github.com/keithrbennett/9f126fa17d9df5e3aacaf638b198dfb9的一个要点。

在类定义之后有一些代码以几种方式练习类。

 [Key, ForeignKey("Reseller")]
  public int Id { get; set; }
  public Reseller Reseller { get; set; }

答案 1 :(得分:1)

您可以按如下方式创建枚举器。首先,让我们创建一个演示文件。

str =<<_
Now is the
time for all
Rubiests to
come to the
aid of their
bowling team.
_

fname = "temp"
File.write(fname, str)
  #=> 75
没有块的

IO#foreach会返回一个枚举器:

efe = File.foreach(fname)
  #=> #<Enumerator: File:foreach("temp")> 

所以我们只需要将这个枚举器嵌入到另一个中,从一行中删除换行符:

echomp = Enumerator.new do |y|
  loop do
    y << efe.next.chomp
  end
end
  #=> #<Enumerator: #<Enumerator::Generator:0x007fbe128837b8>:each> 

我们试一试:

echomp.next
  #=> "Now is the" 
echomp.next
  #=> "time for all" 
echomp.next
  #=> "Rubiests to" 
echomp.next
  #=> "come to the" 
echomp.next
  #=> "aid of their" 
echomp.next
  #=> "bowling team." 
echomp.next
  #=> StopIteration: iteration reached an end

您当然可以将其包装在一个方法中:

def foreach_with_chomp(fname)
  efe = File.foreach(fname)
  Enumerator.new do |y|
    loop do
      y << efe.next.chomp
    end
  end
end

foreach_with_chomp(fname).each { |s| print "#{s} " }
Now is the time for all Rubiests to come to the aid of their bowling team.