Lex Kravetski (lex_kravetski) wrote,
Lex Kravetski
lex_kravetski

Category:

Обман сознания

Поставил эксперимент. Точнее, он сам случайно поставился.

Довольно простая задача. Есть массив (или какой-то ещё список) с элементами. Назовём его elements. Есть массив с несколькими индексами. Назовём его indices. Нужно получить новый массив, в который войдут те элементы из elements, индексы которых содержались в indices. Проще говоря, из полного набора элементов выбрать, скажем так, заселекченные.

Удивительно, но несколько моих знакомых программистов практически в один голос начали с примерно такого маршрута: будем итерировать от 0 до elements.size и для каждого номера проверять, есть ли он в indices. Если есть — добавлять соответствующий элемент в новый массив. Точнее, нет, будем итерировать по elements и увеличивать на единицу счётчик. Проверять, есть ли, добавлять текущий. Точнее, нет, добавим содержимое indices в Set, чтобы быстрее проверять.

Я и сам машинально пошёл сначала по этому маршруту — именно поэтому и решил провести подобный эксперимент. Почему так происходит — не знаю. Видимо, от сильной привычки извёрнуто итерировать.

Хотя на самом деле решение мега-тривиальное: итерируем по indices, и добавляем в новый буфер массива elements(indices(i)). Тривиальное, но приходит оно почему-то вторым по счёту, а не первым. «Снимаем чайник с плиты, выливаем из него воду и таким образом приводим задачу к уже решённой».

На Scala решение записывается совершенно очаровательной в своей простоте конструкцией.

indices map elements

Смысл в том, что поскольку массив indices — коллекция, для неё определена операция map. То есть, преобразование коллекции путём преобразования каждого её элемента при помощи переданной в аргумент функции. Но функция извлечения из скала-коллекции — это просто apply, то бишь, при вызове — просто индекс в скобках после имени переменной: elements(i).

Полная запись была бы такой:

indices.map(i ⇒ elements(i))

Однако для такого тривиального случая есть и сокращённый вариант записи. Приведённый выше. Имя ссылки на контейнер одновременно может выступать и как имя функции от одного аргумента с параметром типа Int.

Последующий эксперимент показал, что эта простая запись — настолько простая, что некоторых людей способна ввести в прострацию и заставить искать в ней какой-то подвох.

Очевидное неочевидное.
Tags: программирование
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 147 comments
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →