Inject - это то же самое, что и reduce в рубине?

114

Я видел, что они здесь вместе задокументированы . Это одно и то же? Почему в Ruby так много псевдонимов (например, map / collect для массивов)? Большое спасибо.

Jacky
источник

Ответы:

160

Да, и это также называется foldво многих других языках программирования и в математике. Ruby использует много псевдонимов, чтобы быть интуитивно понятным программистам с разным опытом. Если вы хотите использовать #lengthего Array, вы можете. Если вы хотите использовать #size, это тоже нормально!

Zach
источник
4
Если вы хотите создать свои собственные псевдонимы, вас может заинтересовать alias_method .
Ник МакКарди,
23
#length и #count не эквивалентны в Ruby. # длина и # размер.
Quolonel Questions
9
3. length дает NoMethodError; 3.size возвращает 4. Очевидно, 3 - это не массив, но будьте осторожны при утином вводе! (3_000_000_000_000_000.size возвращает 8, а 3_000_000_000_000_000_000_000_000_000_000_000_000_000_000.size возвращает 20; похоже, это объем памяти, который он занимает.)
ChrisPhoenix
18
хм, я думаю, что текущие документы Ruby ruby-doc.org/core-2.2.3/Enumerable.html#method-i-reduce могли бы быть лучше, если бы они просто говорили то же самое, injectчтобы пользователям не приходилось читать два описание и попытайтесь выяснить, совпадают ли они ... разве это не согласуется с принципом DRY?
неполярность
3
@ 太極 者 無極 而 生, хороший момент, я был сбит с толку, как вы и предсказывали
neontapir
6

В более поздних версиях документации Enumerable#reduceэто явно указано:

injectИ reduceметоды являются псевдонимами. Это не дает никакого преимущества в производительности.

axiac
источник
1
Мне нравится разделять их в зависимости от того, как они используются, очевидно, просто для семантики. если это proc ( &:+), уменьшить, если это блок, ввести
TheRealMrCrowley