匿名函数可以返回自己吗?
Posted
技术标签:
【中文标题】匿名函数可以返回自己吗?【英文标题】:Can an anonymous function return itself? 【发布时间】:2019-04-02 12:58:32 【问题描述】:在一些 php 测验中,我得到了以下任务 - 我必须 return true
完成以下任务:
function foo($x)
return $x === $x();
foo(__________ALLOWED_INPUT____________);
现在我的想法是传递一个返回自身的匿名函数:
foo(function() return $this_function; )
但是我还没有找到一种方法来做到这一点。有没有可能?
PS:不错的游戏 (https://returntrue.win/?level=6)。
【问题讨论】:
我认为返回自己名称的命名函数可以解决问题? @Spudley 我也这么认为 - 在我尝试之前,得到了`致命错误:未捕获的 ArgumentCountError:函数 foo() 的参数太少,通过了 0` 可以返回对函数的引用。 【参考方案1】:你可以创建一个匿名函数来返回对自身的引用:
foo($x=function()use(&$x)return$x;)
http://sandbox.onlinephpfunctions.com/code/743f72c298e81e70f13dc0892894911adfb1b072
【讨论】:
我认为他的目标是仅通过更改输入使其返回 true? 再做一个澄清就可以完全满足这个问题:匿名函数不可能在没有对自身的引用的情况下返回自己? 不,它必须是参考@Blackbam。不确定在没有引用的情况下返回函数有何价值。【参考方案2】:[空格仅用于可读性;如果需要,所有这些都应该在一条线上工作。]
作为Islam Elshobokshy's answer 的变体,您可以使用(超级)全局变量而不是use
语句来让函数访问自身:
foo(
$GLOBALS['x'] = function()
return $GLOBALS['x'];
);
或者您可以使用debug_backtrace 让函数在调用堆栈中找到自己:
foo(
function()
$backtrace = debug_backtrace();
return $backtrace[1]['args'][0];
)
受 Spudley 关于返回函数名称的评论的启发,您实际上可以通过将函数包装在 IIFE 中来在允许的范围内声明函数:
foo(
(function()
function f() return 'f';
return 'f';
)()
);
【讨论】:
有趣的选项!第三个是立即执行并返回结果,这和返回引用不一样吧? @Blackbam IIFE 只是在给定空间内定义函数f
的一种方式;实际运行的是foo('f');
。返回字符串 f
确实与返回引用不一样,不过,它是一种稍微不同的解谜方法。【参考方案3】:
据我所知,匿名函数不能返回对自身的引用,并且据我所知,没有内置的 PHP 函数可以返回对自身的引用,因此会留下一个可调用的类。这可能行得通:
new classfunction __invoke()return $this;
answers-to-returntrue.win-with-explanations
【讨论】:
以上是关于匿名函数可以返回自己吗?的主要内容,如果未能解决你的问题,请参考以下文章