Рубиновый код, который не работает. Как идет? Я включил Enumerable, реализовал каждый, но reject не ведет себя так, как я ожидаю - PullRequest
0 голосов
/ 10 марта 2012

Я написал этот простой класс

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 ]

2 голосов
/ 10 марта 2012

Ruby's reject возвращает результат в виде нового массива. Таким образом, вы должны написать

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

.

0 голосов
/ 10 марта 2012

reject не изменяет исходный массив, но возвращает измененную копию. В вашем коде второй оператор возвращает массив с удаленными нечетными записями, но вы отбрасываете его, а затем вызываете .each для исходного неизмененного массива. Вам нужно будет действовать с измененным массивом, возвращаемым reject:

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

РЕДАКТИРОВАТЬ: Удалена возможность использовать reject!, поскольку вопрос основан на Enumerable, а не Array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...