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


114

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

Ответы:


160

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


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методы являются псевдонимами. Это не дает никакого преимущества в производительности.


1
Мне нравится разделять их в зависимости от того, как они используются, очевидно, просто для семантики. если это proc ( &:+), уменьшить, если это блок, ввести
TheRealMrCrowley
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.