【问题标题】: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`
  • 可以返回对函数的引用。

标签: php lambda return anonymous-function


【解决方案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 class{function __invoke(){return $this;}}

answers-to-returntrue.win-with-explanations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多