我正在尝试在字符串变量数组中反转单词,但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
我必须遗漏一些非常简单的东西,因为这不会太难。
答案 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"]
当然还有其他方法可以做到这一点,但保持其可读性非常重要。在这种情况下,维护将数组赋值给变量的语义是有意义的,以便明确意图。