Если вы используете Enumerable#map, вы вернете массив, содержащий один элемент для каждого символа в строке.
arr = "try this".each_char.map.with_index { |c,i| i.even? ? c : nil }
#=> ["t", nil, "y", nil, "t", nil, "i", nil]
, который так же, как
arr = "try this".each_char.map.with_index { |c,i| c if i.even? }
#=> ["t", nil, "y", nil, "t", nil, "i", nil]
Мой первоначальный ответ предложил использовать Array#compact для удаления nil
сек до присоединения:
arr.compact.join
#=> "tyti"
, но, как @npn заметки, compact
не является необходимым потому что Array#join применяет NilClass.to_s к nil's
, преобразуя их в пустую строку s. Ergo, вы можете просто написать
arr.join
#=> "tyti"
Другой способ можно использовать map
является первым применять Enumerable#each_cons передать пары символов, а затем возвращает первый символ каждой пары:
"try this".each_char.each_cons(2).map(&:first).join
#=> "tyti"
Даже так, Array#select является предпочтительным, поскольку он возвращает только символы, представляющие интерес:
"try this".each_char.select.with_index { |c,i| i.even? }.join
#=> "tyti"
вариант этого:
even = [true, false].cycle
#=> #<Enumerator: [true, false]:cycle>
"try this".each_char.select { |c| even.next }.join
#=> "tyti"
, который использует Array#cycle для создания нумератор и Enumerator#next генерировать свои элементы.
Одна маленькая вещь: String#each_char более эффективна с точки зрения памяти, чем String#chars, поскольку первая возвращает перечислитель, тогда как последняя создает временный массив.
В общем случае, когда приемник является массивом,
меня, я хотел бы использовать простое регулярное выражение:
"Now is the time to have fun.".scan(/(.)./).join
#=> "Nwi h iet aefn"
Не думаю, что на самом деле вам не нужно называть compact, чтобы удалить нуль из массива перед присоединением. #join, класс #to_s для каждого элемента, а у NilClass - метод to_s, который возвращает "". Поэтому я не думаю, что это так, чтобы полагаться на недокументированное поведение, чтобы пропустить вызов .compact. – nPn
@nPn, спасибо за исправление. Я отредактировал. –