Stream的Ruby实现
发布时间:2020-12-17 04:11:08 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 class Streamdef initialize(head = nil,tail = nil)@head = head@tailFunc = tailenddef empty?@head == nilenddef head@headenddef tail@tailFunc.c
|
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 class Stream
def initialize(head = nil,tail = nil)
@head = head
@tailFunc = tail
end
def empty?
@head == nil
end
def head
@head
end
def tail
@tailFunc.call
end
def length
count = 0
walk { count += 1}
return count
end
def add(s2)
return zip(s2) {|x,y| x + y}
end
def substract(s2)
return zip(s2) {|x,y| x - y}
end
def times(s2)
return zip(s2) {|x,y| x * y}
end
def zip(s2,&block)
return s2 if empty?
return self if s2.empty?
return Stream.new(block.call(head,s2.head),lambda { tail.zip(s2.tail,&block) })
end
def take(count)
return self if empty?
return Stream.new if count == 0
return Stream.new(head,lambda { tail.take(count - 1) })
end
def map(&block)
return self if empty?
return Stream.new(block.call(head),lambda { tail.map(&block) })
end
def scale(factor)
return map { |x| x * factor}
end
def filter(&block)
return self if empty?
return Stream.new(head,lambda { tail.filter(&block) }) if block.call(head)
return tail.filter(&block)
end
def drop(count)
return self if empty?
s = self
count.times {s = s.tail}
return s
end
def member?(item)
s = self
s = s.tail until s.empty? || s.head == item
return s.head == item
end
def force
s = self
s = s.tail until (s.empty?)
end
def walk(&block)
map { |s| block.call(s); s }.force
end
def print
walk { |s| puts s}
end
def item(index)
s = self
index.times { s = s.tail}
return s.head
end
def sum
return reduce(0) {|sum,new| sum + new}
end
def reduce(init,&block)
return init if empty?
return tail.reduce(block.call(init,head),&block);
end
def Stream.range(low = 1,high = nil)
return Stream.make(low) if low == high
return Stream.new(low,lambda { Stream.range(low + 1,high) })
end
def Stream.make(*args)
return Stream.new if args.empty?
return Stream.new(args.shift,lambda { Stream.make(*args) })
end
def Stream.make_ones
return Stream.new(1,lambda { Stream.make_ones })
end
def Stream.make_natural_nums
return Stream.new(1,lambda{ Stream.make_ones.add(Stream.make_natural_nums) })
end
def Stream.make_fib_nums_drop1
return Stream.new(1,lambda {Stream.make_fib_nums.add(Stream.make_fib_nums_drop1) })
end
def Stream.make_fib_nums
return Stream.new(0,lambda { Stream.make_fib_nums_drop1 })
end
def Stream.make_factor
return Stream.new(1,lambda { Stream.make_natural_nums.drop(1).times(Stream.make_factor) })
end
end
Stream.make_factor.take(10).print
以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
