Ruby代码不起作用。怎么会?我包括Enumerable,实现了每个但拒绝并不像我期望的那样

时间:2012-03-10 15:21:12

标签: ruby-on-rails ruby

我写了这个简单的类

class FibSequence
    include Enumerable


    def initialize(num) 
        @sequence = fib(num)
    end

    def fib(n)
        vals = [1, 1]
        return [1] if n == 1
        return vals if n == 2

        (n-2).times do 
            vals.push(vals[-1] + vals[-2]) 
        end
        return vals
    end

    def each(&block)
        @sequence.each(&block)
    end

end

我称之为:

f = FibSequence.new(6)

f.reject {| s | s.odd? }

f.each {| s | print(s,':')}

我期待=> [2,8] 但我得到=> 1:1:2:3:5:8:

2 个答案:

答案 0 :(得分:2)

Ruby的reject方法确实将结果作为新数组返回。你因此必须写

f = f.reject { |s| s.odd? }

答案 1 :(得分:0)

reject不会修改原始数组,但会返回修改后的副本。在您的代码中,第二个语句返回一个删除了奇数条目的数组,但是您要丢弃它,然后在原始未修改的数组上调用.each。您需要对reject返回的已修改数组执行操作:

f = FibSequence.new(6)
f.reject{|s| s.odd?}.each {|s| print(s,':')}

编辑:删除了使用reject!的选项,因为该问题基于Enumerable而不是Array