Ответ 1
Используйте String#chars
:
irb> "asdf".chars.map { |ch| ch.upcase }
=> ["A", "S", "D", "F"]
Если вы хотите разбить список слов, разделенных пробелами, вы должны использовать
def words(text)
return text.split.map{|word| word.downcase}
end
аналогично пониманию списка Python:
words("get out of here")
который возвращает ["get", "out", "of", "here"]
. Как я могу применить блок к каждому символу в строке?
Используйте String#chars
:
irb> "asdf".chars.map { |ch| ch.upcase }
=> ["A", "S", "D", "F"]
Вы ищете что-то вроде этого?
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"
Я думаю, что короткий ответ на ваш вопрос - "нет, нет ничего подобного map
для строк, которые управляют персонажем за раз". Предыдущий ответчик имел самое чистое решение в моей книге; просто создайте его, добавив определение функции в класс.
BTW, там также String#each_char
, который является итератором по каждому символу строки. В этом случае String#chars
получает тот же результат, потому что он возвращает массив, который также отвечает на each
(или map
), но я думаю, что могут быть случаи, когда различие было бы важно.