比方說,我們有一個Array的Strings叫words,我想用實體化一個特殊的列舉eunum_for!它僅計算字串,長度= 3,這是我的建議:
def words.n_each
select{|x| x.length != 3}.each do |y|
yield y
end
end
e4 = words.enum_for(:n_each)
e4.each do |w|
puts w
end
但是必須有一種更聰明的rubyish方式來包含n_each方法的機制enum_for- 也許在列舉器實體化時的代碼塊內。但是如何?
uj5u.com熱心網友回復:
是lazy您要找的嗎?
p e4 = ["aaa","c","foo","aaaa"].lazy.reject{|s| s.size == 3 } # => <Enumerator::Lazy: ["aaa", "c", "foo", "aaaa"]>:reject>
e4.each do |w|
puts w
end
印刷
c
aaaa
uj5u.com熱心網友回復:
class Array
def each_except_size_3
Enumerator.new do |y|
(0..size-1).each do |i|
s = self[i]
y << s unless s.size == 3
end
end
end
end
enum = ['guppy', 'owl', 'ox', 'cow', 'bear', 'lion'].each_except_size_3
#=> #<Enumerator: #<Enumerator::Generator:0x00007fc1a41b9a28>:each>
enum.to_a
#=> ["guppy", "ox", "bear", "lion"]
enum.take(4)
#=> ["guppy", "ox", "bear", "lion"]
enum.take(3)
#=> ["guppy", "ox", "bear"]
enum.take(99)
#=> ["guppy", "ox", "bear", "lion"]
enum.next
#=> "guppy"
enum.next
#=> "ox"
enum.next
#=> "bear"
enum.next
#=> "lion"
enum.next
#=> StopIteration: iteration reached an end
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383480.html
