Что эквивалентно Ruby для map() для строк?

Если вы хотите разбить список слов, разделенных пробелами, вы должны использовать

def words(text)
    return text.split.map{|word| word.downcase}
end

аналогично пониманию списка Python:

words("get out of here")

который возвращает ["get", "out", "of", "here"]. Как я могу применить блок к каждому символу в строке?

Ответ 1

Используйте String#chars:

irb> "asdf".chars.map { |ch| ch.upcase }
  => ["A", "S", "D", "F"]

Ответ 2

Вы ищете что-то вроде этого?

class String
  def map
    size.times.with_object('') {|i,s| s << yield(self[i])}
  end
end

"ABC".map {|c| c.downcase}       #=> "abc" 
"ABC".map(&:downcase)            #=> "abc"
"abcdef".map {|c| (c.ord+1).chr} #=> "bcdefg"
"abcdef".map {|c| c*3}           #=> "aaabbbcccdddeeefff"

Ответ 3

Я думаю, что короткий ответ на ваш вопрос - "нет, нет ничего подобного map для строк, которые управляют персонажем за раз". Предыдущий ответчик имел самое чистое решение в моей книге; просто создайте его, добавив определение функции в класс.

BTW, там также String#each_char, который является итератором по каждому символу строки. В этом случае String#chars получает тот же результат, потому что он возвращает массив, который также отвечает на each (или map), но я думаю, что могут быть случаи, когда различие было бы важно.