Ruby 如何拆分数组中的字符串?

Ruby 如何拆分数组中的字符串?,ruby,arrays,Ruby,Arrays,我试图反转字符串变量数组中的单词,但split似乎不起作用 在IRB中测试时,我得到了“NoMethodError:private method`split'called for Array”,我假设这与我的程序没有做任何事情有关 例如,我有: nameList = ["Joe Blow", "Mary Sue", "Alice Mallory"]. 我希望返回: ["Blow Joe", "Sue Mary", "Mallory Alice"]. 所以我遍历数组,拆分、反转和合并。这就是什

我试图反转字符串变量数组中的单词,但split似乎不起作用

在IRB中测试时,我得到了“NoMethodError:private method`split'called for Array”,我假设这与我的程序没有做任何事情有关

例如,我有:

nameList = ["Joe Blow", "Mary Sue", "Alice Mallory"].
我希望返回:

["Blow Joe", "Sue Mary", "Mallory Alice"].
所以我遍历数组,拆分、反转和合并。这就是什么也不发生的地方:

nameList.each { |x| 
  x.to_s.split(' ').reverse!.join(' ')
  puts x   #testing here
}
这将产生:

Joe Blow
Mary Sue
Alice Mallory

我一定错过了一些非常简单的东西,因为这不会太难。

您正在拆分、反转并丢弃结果。看看这个

nameList = ["Joe Blow", "Mary Sue", "Alice Mallory"]

nameList.each { |x| 
  puts x.to_s.split(' ').reverse.join(' ')
  puts x
  puts '' # for easier reading   
}
# >> Blow Joe
# >> Joe Blow
# >> 
# >> Sue Mary
# >> Mary Sue
# >> 
# >> Mallory Alice
# >> Alice Mallory
# >> 
如果您想对数组的每个元素应用一些转换,获取新值并构造这些值的新数组,那么习惯使用
array\map
函数

nameList = ["Joe Blow", "Mary Sue", "Alice Mallory"]

newList = nameList.map { |x| 
  x.to_s.split(' ').reverse.join(' ')
}
同样,这里您不应该使用bang版本的reverse(
reverse!
)。它具有破坏性的语义
reverse
创建一个新的反向数组,而
reverse就地更新源阵列。在这种情况下,源数组是一个临时变量,所以它在结果方面没有区别。但我认为这是混淆和分散注意力的。

一个紧凑的版本:

nameList.map!{ |x| x.split.reverse.join(' ') }
#=> ["Blow Joe", "Sue Mary", "Mallory Alice"]
问题 Ruby中的所有内容都有返回值。在这种情况下,您没有使用方法链的返回值;您只是在打印原始值

nameList.each { |x| 
  # Returns a result, but you aren't doing anything with it.
  x.to_s.split(' ').reverse!.join(' ')

  # Here you print your original value.
  puts x   #testing here
}
解决方案 实现这一点的简单方法是使用#collect,它返回一个数组

p nameList.collect { |name| name.split.reverse.join(' ') }
["Blow Joe", "Sue Mary", "Mallory Alice"]
=> ["Blow Joe", "Sue Mary", "Mallory Alice"]
这将打印修改后的数组,并返回一个数组作为进一步处理的结果。或者,如果确实要更改数组,可以按如下方式分配结果:

nameList = nameList.collect { |name| name.split.reverse.join(' ') }
 => ["Blow Joe", "Sue Mary", "Mallory Alice"] 
nameList
 => ["Blow Joe", "Sue Mary", "Mallory Alice"]

当然还有其他方法可以做到这一点,但保持可读性很重要。在这种情况下,保持将数组分配给变量的语义是有意义的,这样目的就很清楚了。

约翰·菲茨杰拉德·肯尼迪呢?好主意。我可能会在里面工作,虽然这是一些快速和肮脏的东西-没有什么强大的..对。注意
reverse
reverse之间的区别。啊,是的,忘了提那个。谢谢:)简洁。看起来地图和收藏之间有一条鸿沟。谢谢@主体:没错,它们是别名。我想这是偏好的问题。一、 首先,不能忍受名字
收集
注入
。我就是记不清他们中的哪一个做了什么:)
map
reduce
看起来更自然。