Как использовать метод Ruby Enumerable .map, чтобы сделать что-то похожее на карту в C++

map(-30, -89.75, 89.75, 0, 360) 

Я ищу что-то вроде этого, где:

  • -30 - это входное значение.
  • От -89,75 до 89,75 — это диапазон возможных входных значений.
  • 0–360 — это последний диапазон, на который нужно сопоставить

Мне сказали, что это можно сделать с помощью http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map

.. однако это не очевидно!


person carl crott    schedule 07.12.2012    source источник
comment
Вам действительно нужно привести пример ожидаемого результата. Как сопоставить 179,5 входных значений с 360 выходными значениями?   -  person meagar    schedule 07.12.2012
comment
Функция Enumerable map не делает того, что вы думаете.   -  person Cory Nelson    schedule 07.12.2012


Ответы (1)


Если я правильно понимаю, я думаю, вы просто хотите единообразно сопоставить один диапазон с другим. Итак, нам просто нужно рассчитать, как далеко он проходит через входной диапазон, и вернуть эту часть выходного диапазона.

def map_range(input, in_low, in_high, out_low, out_high)
  # map onto [0,1] using input range
  frac = (input - in_low) / (in_high-in_low)
  # map onto output range
  frac * (out_high-out_low) + out_low
end

Кроме того, я должен отметить, что карта имеет немного другое значение в ruby, и более подходящим описанием, вероятно, будет transform.

person ceyko    schedule 07.12.2012
comment
Enumerable#map в Ruby — это std::transform в C++, но map — стандартное имя для этой операции. Не уверен, почему комитет C++ решил, что было бы неплохо изобрести новую терминологию для существующих понятий, таких как transform для map или accumulate для fold или функция-член для метода. - person Jörg W Mittag; 07.12.2012