如何在数组中拆分字符串?

时间:2012-05-28 18:32:47

标签: ruby arrays

我正在尝试在字符串变量数组中反转单词,但split似乎不起作用。

在IRB中测试我得到“NoMethodError:私有方法`split'调用了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

我必须遗漏一些非常简单的东西,因为这不会太难。

3 个答案:

答案 0 :(得分:7)

您正在拆分,撤消和放弃结果。看看这个。

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!更新源数组。在这种情况下,源数组是一个临时变量,因此它在结果上没有任何区别。但我认为这令人困惑和分心。

答案 1 :(得分:2)

紧凑版:

nameList.map!{ |x| x.split.reverse.join(' ') }
#=> ["Blow Joe", "Sue Mary", "Mallory Alice"]

答案 2 :(得分:0)

问题

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"]

当然还有其他方法可以做到这一点,但保持其可读性非常重要。在这种情况下,维护将数组赋值给变量的语义是有意义的,以便明确意图。