• ruby中迭代器枚举器的理解


    参考《ruby编程语言》5.3迭代器和可枚举对象

    迭代器
    一个迭代器是一个方法,这个方法里面有yield语句,这个方法里的yield语句,与传递给这个方法的块进行数据传输

    yield将数据传给代码快,代码块再把数据传输给yield

    each方法就是一个迭代器,里面有yield语句

    枚举器
    1 一个枚举器是Enumerable::Enumerator的一个对象,Enumerable是一个模块
    2 使用枚举器 1.8的时候需要 require 'enumerator',在2.1就不用了
    3 可以通过new来实例化一个枚举器,但是通常使用Object类的to_enum或enum_for,返回一个枚举器,这个枚举器只是简单调用目标对象的each方法,这句话意思就是说例如 a.to_enum执行后返回一个枚举器,这个枚举器会调用a对象的each方法


    4 当给to_enum传递一个符号参数和其他参数的时候,或者使用enum_for语义上更好例如
    a.enum_for(:bbb,arg1,arg2),这个:bbb是一个迭代器方法来自a对象,enum_for方法返回一个枚举器,这个枚举器有一个each方法,这个each方法调用上面a对象的迭代器方法就是这个:bbb方法,把其余参数arg1,arg2传递给那个迭代器:bbb


    5使用场景,当一个类A ,include Enumerable时候。A的实例对象就具备了Enumerable里的方法,当我们 a = A.new后, a.enum_for(:xxx)就返回了一个枚举器,这个枚举器的each方法调用这个xxx方法,而这个xxx方法就是Enumerable里的一个迭代器方法或者别的方法,这样就可以传递一个代码块给这个xxx迭代器进行一些运算

    6 在1.9,2.1中应该也是一样,不需要显示的调用to_enum或者enum_for,当不用代码块调用内建的迭代器(内建迭代器指的是times,upto,downto,step.each及Enumerable的相关方法)的时候,就是指a.enum_for(:each)这句执行但是没有传递代码快,不传递代码快的话就自动返回一个迭代器
    a.each 这个就会返回一个枚举器

  • 相关阅读:
    Solaris 10 10/09发布
    MySQL数据库下损坏数据的恢复操作其过程总结
    [.net自定义控件]ComboBox控件重写 之ComboBoxEx
    Qt之正则表达式 QRegExp
    JavaScript中的JSON
    visual studio2008 OpenGL开发配置
    在母版页中使用UpdatePanel
    ASHX中使用Session
    ASP.NET(c#)实现中英文域名查询
    主打小巧快速Puppy Linux 4.3.1正式版发布
  • 原文地址:https://www.cnblogs.com/or2-/p/5040609.html
Copyright © 2020-2023  润新知