s = "hello"
puts s.enum_for(:each_char).map{|x| x.succ} #=>[i,f,m,m,p]
#enum_for(function_name) 会返回一个枚举器,枚举器可以通过next来自行调用枚举的迭代
#而一般的比如array的each这些方法都会返回一个enumerator
#Enumerator定义了each方法又引入了enumeratable模块,可以使用很多迭代方法
#def each
# loop do
# yield{self.next}
# end
#end
enu=s.enum_for(:each_char)
print enu.next
#外部迭代器来并行迭代
def sequence(*enumerables, &block)
enumerables.each { |element| element.each(&block) }
end
def interleave(*enumerables)
enumerator = enumerables.map { |element| element.to_enum }
while e = enumerator.shift
begin
yield e.next
rescue StopIteration
else
enumerator << e
end
end
end
def bundle(*enumerables)
enumerators = enumerables.map { |element| element.to_enum }
loop {yield enumerators.map { |element| element.next }}
end
a,b,c=[1,2,3],4..6,'a'..'e'
sequence(a,b,c){|x| print x}
interleave(a,b,c){|x| print x}
bundle(a,b,c){|x| print x}
#为了防止迭代器在迭代过程中,数据发生变化,可以先拷贝一份,然后再进行迭代
module Enumerable
def each_in_snapshot &block
snapshot = self.dup
snapshot.each &block
end
end
#当array调用一个没有block的each方法时,他会返回一个enumerator,
# RETURN_ENUMERATOR(ary, 0, 0);而有block时,
#他会去完成代码块的相应任务
puts (1..4).to_a.each_in_snapshot.next
puts (1..4).to_a.each {}.class
#代码块的实参调用更像是并行赋值
{one: 1}.each { |k,v| } #=>k,v=[key, value]
#so
def two
yield 1, 2
end
two{|x| puts x} # x=1,2 => x=1
two{|x,| puts x} # x,=1,2 => x=1
two{|*x| puts x} # *x=1,2 => x=[1,2]
#**********************************************************
#Thread/fibers/continutions
#**********************************************************
thr = Thread.new{}
thr.value #在Thread的block没有执行完之前,thr.value会被挂起
class Fibonacc
def initialize
@x, @y = 0, 1
@fiber = Fiber.new do
loop do
@x, @y = @y, @x+@y
Fiber.yield @x
end
end
end
def next
@fiber.resume
end
def rewind
@x,@y=0,1
end
end
#可以通过纤程来创建一个有next功能的enumerator
class Generate
def initialize(enumerable)
@enumerable = enumerable
create_fiber
end
def next
@fiber.resume
end
def rewind
create_fiber
end
private
def create_fiber
@fiber = Fiber.new do
@enumerable.each do |ele|
Fiber.yield ele
end
end
end
end
x=Generate.new(5..6)
puts x.next
#纤程与调用纤程的进程间的参数传递
#Fiber如果初始化的时候有行参,那么第一次resume传近来的实参就是她的值
#fiber的代码快的返回值,是最后一次resume的结果
#resume的实参,就是代码块中的yield的结果
f=Fiber.new do |message|
puts "Caller said #{message}"
respond = Fiber.yield("Hello")
puts "Caller said #{respond}"
"Fine"
end
respond = f.resume("Hello")
puts "Fiber said #{respond}"
respond = f.resume("How are you")
puts "Fiber said #{respond}"
#
def line(symbol)
callcc{|c| here=c;puts here}
puts "here"
end
#当here.call时 第一个车here不会被打印出来,因为call只会到连续体的地方,但不会执行里面的代码
#所以会从第二行的here打印开始
#here.call(value)
#那么callcc的返回值就是here
require 'continuation'
class Generate
def initialize
load_generate
end
private
def load_generate
callcc do |c|
@generator_context = c
return
end
loop_generate
end
public
def next
callcc do |c|
@main_context = c
@generator_context.call
end
end
private
#它的作用就是让next可以顺序执行,
#并且可以让loop_generate达到循环的目的
def generate(val)
callcc do |c|
@generator_context = c
@main_context.call(val)
end
end
end
class Fib < Generate
def loop_generate
a, b = 0, 1
loop do
generate b
a, b = b, a+b
end
end
end
fib = Fib.new
puts fib.next
puts fib.next
puts fib.next
puts fib.next
puts fib.next
#**********************************************************
#Thread/fibers/continutions
#**********************************************************
分享到:
相关推荐
利用迭代重建法SIRT,用户可以通过扫描得到的数据或者读取有关的数据内容,输入到工具箱,然后通过工具箱的计算得到该事物的雏形。 图象重建工具箱的优势在于应用范围很广,无论医疗,建筑,工艺制造等等,...
本课程讲述迭代软件开发项目管理相关内容,适合希望对scrum有初步了解和概念的同学。
《算子迭代与自相似集》不仅介绍算子迭代生成的迭代函数系统和自相似集的Hausdorff测度一般理论,而且还论述了近年来关于迭代函数系统和自相似集的Hausdorff测度的若干新理论与新方法,以及相关的公开问题。...
有关MATLAB样例之雅克比迭代法方面的内容,里面包含matlab雅克比迭代发方面的祥细介绍及代码,编译可通过
“旅行”相关内容发布人数占平台全行业 比重第二位。超 4 亿旅游兴趣用户在平台 观看旅游内容,用户对旅游内容的互动指 标也呈现增长,除此之外,中国居民出游意 愿有所提高,微度假、跨省游等热度持续。 同时,出...
本文是切片系列的第三篇,主要内容是迭代器切片。 迭代器是 Python 中独特的一种高级特性,而切片也是一种高级特性,两者相结合,会产生什么样的结果呢? 1、迭代与迭代器 首先,有几个基本概念要澄清:迭代、可迭代...
回顾以上四种容器相关的例题(不作为实验报告内容),例7.33作为实验报告内容。 二.练习课本第7章的例7.35、7.36,均作为实验报告内容。 三.练习第8章例8.1、8.3、8.6、8.9、8.10。8.3和8.10作为实验报告内容。
书中大部分内容取材于作者近年来在这一领域的研究成果,含盖了一般迭代理论、迭代动力学、迭代根与嵌人流,丽且含盖了迭代方程解的存在性、唯一性、稳定性、光滑性、解折性、对称性及特征理论,《迭代方程与嵌入流》...
利用迭代重建法SIRT,用户可以通过扫描得到的数据或者读取有关的数据内容,输入到工具箱,然后通过工具箱的计算得到该事物的雏形。 图象重建工具箱的优势在于应用范围很广,无论医疗,建筑,工艺制造等等,都能用...
变换矩阵不相关的测量矩阵将变换域的高维信号投影到一个 低维空间上,然后通过求解一个优化问题就能从少量的投影 中以高概率或精确地重构出原信号!压缩感知理论的主要研 究内容包括信号的稀疏变换$测量矩阵设计和...
此程序为 数字图像相关处理方面的内容,可以得出散斑图变化前后的位移和应变的结果,精确度还可以,也可以根据自身需要修改。
首先,源节点借助一个中继节点向目的地节点发送相关内容,并在两个节点处应用分布式联合信源信道的LDPC编码;然后,基于矩阵运算在源节点处进行LDPC源编码,将LDPC信道编码应用于中继处,通过噪声信道将相应的码字...
在科技研究和工程技术所提出的计算问题中,经常会遇到线性方程组的求解问题,这里主要是有关线性方程组的直接解法。解线性方程组的直接法是用有限次运算求出线性方程组 Ax=b 的解的方法。线性方程组的直接法主要有...
在本文总小编给大家整理了关于python之中的迭代与迭代对象的相关基础知识点内容,需要的朋友们学习下。
相关具体内容请参考对应的论文:Yingqian Wang, Jungang Yang, Chao Xiao, and Wei An, "Fast convergence strategy for multi-image superresolution via adaptive line search," IEEE Access, vol. 6, no. 1, pp. ...
最近在写RN相关的东西,其中涉及到了redux-saga ,saga的实现原理就是ES6中的Generator函数,而Generator函数又和迭代器有着密不可分的关系。所以本篇博客先学习总结了iterator相关的东西,然后又介绍了Generator...
主要给大家介绍了关于Java中的迭代和递归,文章显示分别介绍了Java中的迭代和递归,而后又介绍了迭代和递归的区别以及数形递归的相关内容,文中介绍的很详细,相信会对大家学习具有一定的参考借鉴价值,有需要的朋友...
在下面查看有关如何计算效用的示例(有关更多详细信息,请参见-中的代码)算法: 策略迭代:在策略迭代中(霍华德1960),第一步执行一次,然后重复第二步直到收敛。 然后,再次执行第一步,依此类推。 对于大量可能...
2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为...
基于文本序列迭代模型的篇章语义理解,郑茂,张牧宇,本文关注在文本内容的基础上引入与文本相关的外部知识,辅助文本语义分析。在传统的文本挖掘研究中,更侧重于文本内容的分析而对