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)); |
| |