Ruby 如何拆分数组中的字符串?
我试图反转字符串变量数组中的单词,但split似乎不起作用 在IRB中测试时,我得到了“NoMethodError:private method`split'called for Array”,我假设这与我的程序没有做任何事情有关 例如,我有: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"]. 所以我遍历数组,拆分、反转和合并。这就是什
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
看起来更自然。