如何 return Traversable 实例满足以下断言代码?
How to return instance of Traversable to meet following assertion code?
这里我有一个具有挑战性的php函数,它应该return一个instanceof 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;
}
这是一个 php单元代码,将测试 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]
);
所以希望添加一些代码而不是 !!! (三个感叹号)这样断言就会通过。
通过 yield from
生成器委派
在 PHP7 中,生成器委托允许您使用 yield from 关键字从另一个生成器、Traversable 对象或数组生成值。然后,外部生成器将从内部生成器、对象或数组中生成所有值,直到它们不再有效,之后将在外部生成器中继续执行。
如果生成器与 yield from 一起使用,则 yield from 表达式也将 return 由内部生成器编辑的任何值 return。
$r = $n1 += $n2 and 0 or !!![$n + 1 => $n1];
PS:在PHP中,逻辑运算符的优先级最低。因此,这个字符串相当于
$r = $n1 += $n2;
!!![$n + 1 => $n1];
这里我有一个具有挑战性的php函数,它应该return一个instanceof 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;
}
这是一个 php单元代码,将测试 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]
);
所以希望添加一些代码而不是 !!! (三个感叹号)这样断言就会通过。
通过 yield from
生成器委派在 PHP7 中,生成器委托允许您使用 yield from 关键字从另一个生成器、Traversable 对象或数组生成值。然后,外部生成器将从内部生成器、对象或数组中生成所有值,直到它们不再有效,之后将在外部生成器中继续执行。
如果生成器与 yield from 一起使用,则 yield from 表达式也将 return 由内部生成器编辑的任何值 return。
$r = $n1 += $n2 and 0 or !!![$n + 1 => $n1];
PS:在PHP中,逻辑运算符的优先级最低。因此,这个字符串相当于
$r = $n1 += $n2;
!!![$n + 1 => $n1];