如何调用能从本地对象链接的原理/范例?

问题描述 投票:1回答:1

这可能是重复的,因为我脑子里找不到单词甚至刺激查询。

尽管我每天都在使用PHP,C#,JavaScript,但是只有在JavaScript中,我才能像疯子一样将链条开箱即用。

例如,给出一个简单的算法(我知道它有点模糊):

给出一个任意值数组,将数据转换为包含唯一值乘以两个大于6的值。

在PHP7中,我可以像这样实现它:

<?php
$initial = [2, 3, 4, 5, 6, 7, 8, 9, 2, 2, 2, 3, 3, 4, 4, -1, -3, -5];

$multiplied = array_map(function ($v) {
    return $v * 2;
}, $initial);

$unique = array_unique($multiplied);

$matching = array_filter(function($v) {
    return $v > 6;
}, $unique);

var_dump($initial, $matching);

// Or this crazy variation.
$matching = array_filter(array_unique(array_map(function($v) {
    return $v * 2;
}, $initial)), function ($v) {
    return $v > 6;
});

var_dump($initial, $matching);

尽管,JavaScript:

var filterUnique = function(value, index, collection) {
  return collection.indexOf(value) === index;
};

var initialData = [2, 3, 4, 5, 6, 7, 8, 9, 2, 2, 2, 3, 3, 4, 4, -1, -3, -5];

var data = initialData.map(function(v) {
  return v * 2;
}).filter(filterUnique).filter(function(v) {
  return v > 6;
});

console.log(initialData.length, initialData)
console.log(data.length, data);

在C#中有很多选项。Linq是最简单的选项,实际上允许以类似于JavaScript的方式执行操作。虽然,那里的底层结构是不同的。但是,如果我想走困难的路,由于C#的严格性质,我将面临类似的情况,例如PHP中带有显式声明,以及更多情况。

此链接原理/范例叫什么?我还能找到其他什么语言?

[我倾向于将其称为函数式编程,但是在阅读函数式语言时,这里的描述要比这还要泛泛。。。我希望消除对此的误解。

javascript syntax language-agnostic theory syntactic-sugar
1个回答
0
投票

我已经使用PHP多年了,实际上,拥有TyeObjects的问题几乎很容易,尤其是当您开始谈论比较时:Number(23)等于23,Int(23)与23.5相比,Int (0)vs 0,vs null ...

就我所知,它对Java(非脚本)开发人员在实施时造成了很多麻烦。

因此,最“明显”的方法是实现Int / Float类或Number来收集它们,String类等以及所有相关功能。这是对PHP的真正需求,但将非常耗时。

另一种解决方案,更容易的是,因为所有函数都是在PHP中以蛇形/ C风格编写的,并且几乎所有方法都是在驼峰式的情况下,您可以像这样创建一个调用管道

echo (new Pipe("my super cool string"))->strtoupper()->apply();

这将打印

MY SUPER COOL STRING

并且您可以根据需要链接尽可能多的本机函数。

就我而言,我的首要需求是异步进行一些流畅的调用,因此其调用方式略有不同,首先是要调用对象的方法,但是以下代码可与我的lib一起使用:

$chainOfCalls = DefferredCallChain::new_("string")
    ->strtoupper()
    ->explode(' ', '$$')
    ->array_reverse()
    ->print_r();

$chainOfCalls("My string I want to modify");
// prints ['MODIFY', 'TO', 'WANT', 'I', 'STRING', 'MY']

在这里可用:https://github.com/jclaveau/php-deferred-callchain

关于范式分类,首先要注意函数式编程/纯函数式语言/函数式语法之间的差异。

  • 函数式编程只是关于函数的使用。
  • 纯函数式编程是仅具有函数而没有状态(因此副作用较少)的专用范例。 Lisp是一个很好的例子。
  • [函数语法是一种编写方法,就像在纯函数范例中一样,但是在诸如PHP这样的命令性语言中。

实际上,流利的(链接的)语法就像在阅读时尊重重力的功能语法(例如,您从左上角开始阅读,在右下角结束)。这对我来说似乎是大脑消耗更少的东西。

希望它能回答您的问题:)

© www.soinside.com 2019 - 2024. All rights reserved.