我使用的是Ruby 2.4。我有一个数组,我想分成两个,其中第一个数组将是字母" a"或" b"而第二个数组将是其他所有,所以我有这个
arr1, arr2 = data_col.map { |x| a, b, c = x.partition(/^[ab][[:space:]]+/i); [b.strip, a + c] }.transpose
但是,如果某个阵列中的一个元素为零,则会失败。我如何解释这一点,并强制两个零元素在结果数组中?如果原始数组是
,那就是["A bcd", nil, "B 123"]
结果数组将是
["A", nil, "B"], ["bcd", nil, "123"]
答案 0 :(得分:0)
假设非空元素总是需要在空间分割,你可以取消分区和正则表达式测试,只需这样做:
>> a = ["A bcd", nil, "B 123"]
>> a.map { |e| e ? [e.split.first, e.split.last] : [nil, nil] }.transpose
=> [["A", nil, "B"], ["bcd", nil, "123"]]
答案 1 :(得分:0)
明确检查
arr1, arr2 = data_col.map do |x|
if x
a, b, c = x.partition(/^[ab][[:space:]]+/i)
[b.strip, a + c]
else
[nil, nil]
end
end.transpose
这里没有聪明的方法来进行nil
传播。
如果您使用""
作为结果元素很酷,请尝试使用
arr1, arr2 = data_col.map { |x| a, b, c = (x || "").partition(/^[ab][[:space:]]+/i); [b.strip, a + c] }.transpose