Laravel 包含了許多好用的套件,Collection 應該是最好用的,將陣列導進去以後可以做各種花式操作,自己嘗試在 PHP、Python、Node.js 上模擬一下作法。
PHP
<?php
class Collection
{
private array $collections;
public function __construct(array $collections)
{
$this->collections = $collections;
}
public function sum(Closure $callable = null): int
{
$callbackIn = ($callable === null) ? $this->isNotCallback() : $this->isCallback($callable);
return array_reduce($this->collections, fn($carry, $item) => $carry + $callbackIn($item), 0);
}
private function isNotCallback(): Closure
{
return fn(int $value): int => $value;
}
private function isCallback(Closure $callable): Closure
{
return fn(int $value): int => $callable($value);
}
}
$collection = new Collection([1, 2, 3]);
$cal = fn($item): int => $item + 5;
echo $collection->sum(), PHP_EOL;
echo $collection->sum($cal);
Python
from functools import reduce
from typing import Callable
class Collection(object):
collections: list
def __init__(self, collections: list):
self.collections = collections
def sum(self, callback=None) -> int:
callback_in = self.is_not_callable() if callback is None else self.is_callable(callback)
return reduce(lambda carry, item: carry + callback_in(item), self.collections, 0)
@staticmethod
def is_not_callable() -> Callable[[int], int]:
return lambda x: x
@staticmethod
def is_callable(callback) -> Callable[[int], Callable[[int], int]]:
return lambda x: callback(x)
def call_me() -> Callable[[int], any]:
return lambda x: x + 5
collection = Collection([1, 2, 3])
print(collection.sum())
print(collection.sum(call_me()))
Node.js
class Collection {
private collections: any[];
constructor(collections: any[]) {
this.collections = collections;
}
public sum(callback: Function = null) {
const callbackIn = (callback === null) ? this.isNotCallable() : this.isCallable(callback);
return this.collections.reduce((carry, item) => carry + callbackIn(item), 0);
}
private isNotCallable(): Function {
return (value: any) => value;
}
private isCallable(callback): Function {
return (value: any) => callback(value);
}
}
const collections = new Collection([1, 2, 3]);
const cal = (value) => value + 5;
console.log(collections.sum());
console.log(collections.sum(cal));