我想写一个方法返回一个枚举器(类似于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));
。
答案 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.