zoukankan      html  css  js  c++  java
  • ruby迭代器枚举器

    迭代器
    一个迭代器是一个方法,这个方法里面有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执行后返回一个枚举器,这个枚举器的each方法会调用a对象的each方法


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

    例如String类不是Enumerable的,但是String类自身有三个迭代器方法(方法里有yield,这三个是String的方法,不是Enumerable的) each_char each_byte,each_line,我们想使用一个enumerable方法,比如map,

    s = "hello"
    s.enum_for(:each_char).map {|c| c.succ}


    eg:

    class Test1
    include Enumerable

    def hello(a,b)
    yield a+b
    end
    end

    a = Test1.new

    b =a.enum_for(:hello,1,2)

    b.each do |x|
    p x
    end

    或者

    a.enum_for(:hello,1,2).select {|x| puts x}


    5使用场景,当一个类A ,include Enumerable时候。A的实例对象就具备了Enumerable里的方法,当我们 a = A.new后, a.enum_for(:xxx)就返回了一个枚举器,这个枚举器的each方法调用这个xxx方法,而这个xxx方法就是A类里的一个迭代器方法,这样就可以a对象调用enumerable里的方法,同时传递一个代码快例子如下
    class Test1
    include Enumerable

    def hello(a,b)
    yield a+b
    end
    def each(a,b)
    yield a+b
    end
    end

    a = Test1.new

    b =a.enum_for(:hello,1,2)
    b.select do |x|
    p x
    end


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

    按照6所说的,上面实例代码 b =a.enum_for(:hello,1,2) 这行就省略了。直接
    a.each do |x|
    p x
    end

    前提是A类里必须有一个each的迭代器方法

    class Test1
    include Enumerable


    def each
    yield 3
    end
    end

    a = Test1.new

    a.select do |x|
    p x
    end

    有些内建类自身实现了 each方法,才可以 按照6所说的那么做,如果我们自定义一个类,没有实现 each方法,不可以省略.enum_for

  • 相关阅读:
    帮助智力障碍的可怜儿童
    PE556
    ZJOIDay2T1 BB题解
    CTSC2016游记
    再次被老爸钦点退役
    欧拉筛
    考据
    51nod 1020 逆序排列(动态规划)
    51nod 1186 质数检测(Miller-Rabin算法)
    大整数类模板
  • 原文地址:https://www.cnblogs.com/or2-/p/5482822.html
Copyright © 2011-2022 走看看