匿名函数可以返回自己吗?

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

【讨论】:

以上是关于匿名函数可以返回自己吗?的主要内容,如果未能解决你的问题,请参考以下文章

自执行匿名函数

Kotlin函数 ③ ( 匿名函数 | 匿名函数的函数类型 | 匿名函数的隐式返回 )

匿名函数lambda

js 自执行匿名函数(转载)

匿名函数

匿名函数在 JavaScript 中是一种不好的做法吗?