对于字符串,map() 的 Ruby 等价物是什么?



如果您想分割一个空格分隔的单词列表,您可以使用

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),但我想可能有情况下,区别将是重要的。

最新更新