Мое предпочтительное решение:
function processArray(arr, fn) {
return arr.reduce(
(p, v) => p.then((a) => fn(v).then(r => a.concat([r]))),
Promise.resolve([])
);
}
Это не принципиально отличается от других, опубликованных здесь, но:
Пример использования:
const numbers = [0, 4, 20, 100];
const multiplyBy3 = (x) => new Promise(res => res(x * 3));
// Prints [ 0, 12, 60, 300 ]
processArray(numbers, multiplyBy3).then(console.log);
Проверено на разумные текущие версии Chrome (v59) и NodeJS (v8.1.2).
Может быть, потому что это похоже на операцию добавления Unix, поскольку вы по существу добавляете к потоку ввода / вывода?
Например,
echo "foo" >> bar
sendmail -f test@domain.com << myemail.txt
(Пример ввода данных у Zac Howland)
>>
и <<
являются просто операторами, и вы можете реализовать свои собственные >>
и <<
для своих классов.
Я полагаю, «кто-то» выбрал их, потому что: а) они похожи на операции с файлами оболочки и б) повторно использовать существующие операторы, потому что нет необходимости создавать новые
Этот ответ неудовлетворительный, но правильный: они не являются побитовыми операторами.
Значение оператора определяется типом данных, который появляется слева. В случае cin и cout (и других типов потоков) < < и >> операторы перемещают значения в и из потоков. В случае, когда левый операнд является целым числом, операция является побитовой операцией, которую вы уже знаете из C.
Значение оператора не является фиксированным, хотя его приоритет есть.
Я предполагаю, что вы знаете, что C ++ допускает перегрузку операторов. В общем случае вы перегружаете операторы, только если семантика полностью переносима (например, перегрузка сложения для векторного класса для сложения двух векторов вместе). Я думаю, что ваш вопрос относится к тому, почему можно использовать операторы bithift, перегружать их для iostream и придавать им совершенно иной смысл, чем их первоначальное назначение. Причина, по которой это может быть сделано, заключается в том, что операции сдвига битов настолько далеки от того, что делают iostreams, и никто не может быть сбит с толку, думая, что < < или >> выполняет сдвиг на Iostream. И причина, по которой их удобно использовать, заключается также в том, что их порядок состоит в том, чтобы сначала оценить операнд слева, а затем справа и выполнить операцию. Это соответствует тому, что вы хотели бы, когда вы используете операторы для добавления или извлечения чего-либо из iostream.
Но, к первоначальному вопросу, почему? Я действительно не знаю, мне просто кажется, что < < и >> довольно легко понять как получение информации от одного объекта и размещение ее в другом. Почему причина должна быть более сложной, чем эта? Представляется целесообразным использовать их, потому что их значение очевидно .. что лучше вы можете спросить у оператора?