Как вернуть экземпляр Traversable для соответствия следующему коду подтверждения? - PullRequest
0 голосов
/ 11 мая 2019

Здесь у меня есть сложная функция php, которая должна возвращать экземпляр Traversable (итератор), а также должна соответствовать другим утверждениям, проверяющим эту функцию.

Функция не имеет ошибок, она вычисляет числа Фибоначчи. Функция может быть изменена, она специально сконструирована таким образом, чтобы бросать вызов другим. Но есть ограничение, только кусок помечен как !!! (тройной восклицательный знак) можно изменить.

public function getFibonacci($n) {
        $n2 = -($n1 = 1);
        while ($n --> -1) {
            $r = $n1 += $n2 and 0 or !!![$n + 1 => $n1];
            $n2 = $n1 - $n2;
        }
        return $r;
    }

и вот код phpunit, который будет тестировать функцию getFibonacci

assertTrue(
    ($res = (getFibonacci(8))
    && ($res instanceof \Traversable)
    && count($arr = iterator_to_array($res)) === 9
    && array_keys($arr) == range(8, 0, -1)
    && array_values($arr) == [0, 1, 1, 2, 3, 5, 8, 13, 21]
);

Так что ожидается добавить некоторый код вместо !!! (тройной восклицательный знак), чтобы утверждение прошло.

1 Ответ

0 голосов

Это функция генератора

Делегирование генератора через выход из

В PHP 7 делегирование генератора позволяет вам получать значения из другого генератора, объекта Traversable или массиваиспользуя выход из ключевого слова.Затем внешний генератор будет выдавать все значения из внутреннего генератора, объекта или массива до тех пор, пока они не станут недействительными, после чего выполнение будет продолжено во внешнем генераторе.

Если генератор используется с yield от,yield from expression также возвращает любое значение, возвращаемое внутренним генератором.

$r = $n1 += $n2 and 0 or !!![$n + 1 => $n1];

PS: в PHP логические операторы имеют самый низкий приоритет.Следовательно, эта строка эквивалентна

$r = $n1 += $n2;
!!![$n + 1 => $n1];
...