Ruby中字符串的map()等效方法是什么?

18
如果您想要拆分由空格分隔的单词列表,您需要使用:
def words(text)
    return text.split.map{|word| word.downcase}
end

类似于Python的列表推导式:

words("get out of here")

如何对字符串中的每个字符应用一个块?该操作将返回["get", "out", "of", "here"]


你想使用 map 方法吗?还是任何块? - Arup Rakshit
我不知道你的需求。因为你可能对自己的需求感到困惑。否则,你可以快速回答我的问题。看看有多少种方式,你可以使用块。例如:"aaa".each_char { |c| #code }"aaa".scan(/./) { |c| #code } 等等。如果你能告诉我你将在块内执行的真正操作是什么,那么你就可以得到更好的答案。如果它是一个大写每个字符的操作,那么可以使用"abc".gsub(/./,&:upcase)或者小写操作,则可以使用"abc".gsub(/./,&:downcase) - Arup Rakshit
3个回答

31

使用 String#chars 方法:

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

差不多了,但是我想返回一个字符串。我能在不将.join("")附加到你的解决方案中的情况下做到吗? - EMBLEM
@ArupRakshit 我想对字符串中的每个字符应用给定的操作并返回该字符串。 - EMBLEM
将 @EMBLEM 分割成单词后是什么? - Arup Rakshit
@ArupRakshit 不,那只是一个例子。它与我实际询问的内容无关。 - EMBLEM
3
我能想到的唯一一件事是 "asdf".gsub(/./) { |ch| ch.upcase },但这有点丑陋/令人困惑。在我看来,"asdf".chars.map(&:upcase).join 更好。 - Paige Ruten
显示剩余3条评论

10

你是否在寻找类似这样的东西?

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"

4
我认为对于你的问题的简短回答是“没有像map一样逐个字符操作字符串的方法。”之前的回答者提供了最简洁的解决方案,只需要通过向类中添加函数定义来创建一个。
顺便说一句,还有一个名为String#each_char的迭代器,可以遍历字符串的每个字符。在这种情况下,String#chars可以得到相同的结果,因为它返回一个数组,该数组也响应each(或map),但我想可能会有一些情况下这种区别很重要。

2
关于 charseach_char,规则很简单:对于 Array 方法使用前者,对于 Enumerable 方法使用后者。当我看到 charsEnumerable 方法一起使用时,会感到不适,因为它会创建一个不必要的临时数组。 - Cary Swoveland
啊哈,我忘了 Enumerable 不会经过那个额外的步骤。数组是可枚举的; 可枚举的不一定是数组。谢谢。 - cvkline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接