react/partial

部分函数应用。

v3.0.0 2017-10-01 13:27 UTC

This package is auto-updated.

Last update: 2024-09-05 18:38:46 UTC


README

部分函数应用。

Build Status Code Climate

安装

推荐安装 react/partial 的方法是 通过 composer

{
    "require": {
        "react/partial": "~2.0"
    }
}

概念

部分应用(或部分函数应用)是指将多个参数固定到函数中,生成一个较小参数数量的新函数的过程。给定一个函数 f:(X x Y x Z) -> N,我们可能会固定(或'绑定')第一个参数,生成一个类型为 f:(Y x Z) -> N 的函数。这个函数的评估可能表示为 f partial(2, 3)。注意,在这种情况下,部分函数应用的结果是一个接受两个参数的函数。

基本上,这允许你预先填充函数的参数,这在你没有控制函数调用者的情况下特别有用。

假设你有一个接受回调的异步操作。比如文件下载。回调用单个参数调用:文件的內容。假设你还有一个希望在文件下载完成后被调用的函数。然而,这个函数需要额外的信息:文件名。

public function handleDownload($filename)
{
    $this->downloadFile($filename, ...);
}

public function downloadFile($filename, $callback)
{
    $contents = get the darn file asynchronously...
    $callback($contents);
}

public function processDownloadResult($filename, $contents)
{
    echo "The file $filename contained a shitload of stuff:\n";
    echo $contents;
}

处理这个问题的传统方法是将所有内容包装在一个闭包中,如下所示

public function handleDownload($filename)
{
    $this->downloadFile($filename, function ($contents) use ($filename) {
        $this->processDownloadResult($filename, $contents);
    });
}

这并不太糟糕,特别是在 PHP 5.4 中,但在 5.3 中你需要做烦人的 $that = $this 舞蹈,总的来说,这是一大堆冗余的样板代码,你不想把你的代码弄乱。

这就是部分应用可以帮助的地方。由于我们想要预先填充将要被调用的函数的参数,我们只需调用 bind,它将插入到参数列表的左侧。 bind 的返回值是一个新的函数,它接受一个 $content 参数。

use function React\Partial\bind;

public function handleDownload($filename)
{
    $this->downloadFile($filename, bind([$this, 'processDownloadResult'], $filename));
}

部分应用是函数的依赖注入!这多么令人兴奋?

示例

bind

use function React\Partial\bind;

$add = function ($a, $b) {
    return $a + $b;
};

$addOne = bind($add, 1);

echo sprintf("%d\n", $addOne(5));
// outputs 6

bind_right

use function React\Partial\bind_right;

$div = function ($a, $b, $c) {
    return $a / $b / $c;
};

$divMore = bind_right($div, 20, 10);

echo sprintf("%F\n", $divMore(100)); // 100 / 20 / 10
// outputs 0.5

占位符

可以使用 函数(有一个别名为 placeholder)在部分应用时跳过一些参数。

这允许你在右侧预先定义参数,并在调用时绑定左侧的参数。

这个示例跳过了第一个参数,并将第二个和第三个参数分别设置为 01。结果是返回字符串第一个字符的函数。

注意:通常你的 IDE 应该有所帮助,但访问“…”字符(水平省略号,U+2026)在不同的平台上有所不同。

  • Windows: ALT + 0133
  • Mac: ALT + ;ALT + .
  • Linux: AltGr + .
use function React\Partial\bind;
use function React\Partial\…;

$firstChar = bind('substr', …(), 0, 1);
$mapped = array_map($firstChar, array('foo', 'bar', 'baz'));

var_dump($mapped);
// outputs ['f', 'b', 'b']

测试

要运行测试套件,你需要 PHPUnit。

$ phpunit

许可证

MIT,见 LICENSE。