我不是RubyonRails开发人员,几乎没有任何经验。
在一个非常复杂的上下文中,我有这样一个过程,用分号替换逗号,并为数组的每个元素添加一个包装器(双引号(:
@wrap_char = '"'
def escape(text)
if text.present?
@wrap_char + text.to_s.tr(',', ';') + @wrap_char
else
@wrap_char + @wrap_char
end
end
['2','SE','STKT','','','',''].map(&method(:escape)).join(',') << "n"
返回此:"2","SE","STKT","","","",""
我的问题是,我需要从包装中排除第一个元素,以便获得:2,"SE","STKT","","","",""
我们将高度赞赏您的想法!
首先,nil.to_s
是''
,因此可以将escape
方法简化为:
def escape(text)
@wrap_char + text.to_s.tr(',', ';') + @wrap_char
end
一种直接的方法是这样的:
a = ['2', 'SE', 'STKT', '', '', '', '']
(a[0, 1] + a[1..].map(&method(:escape))).join(',')
只要a
不为空,它就会起作用。如果你想让a
为空,那么你可以利用[][1..]
为nil
和nil.to_a
为空数组的优势:
(a[0, 1] + a[1..].to_a.map(&method(:escape))).join(',')
你也可以说:
(a[0..0] + a[1..].to_a.map(&method(:escape))).join(',')
但是CCD_ 11范围一直看着我很有趣,所以我更喜欢CCD_。如果你不喜欢括号,你也可以使用#slice
:
(a.slice(0, 1) + a.slice(1..).to_a.map(&method(:escape))).join(',')
你也可以把";留下第一个元素";迭代中的逻辑,比如:
a.map.with_index { |e, i| i > 0 ? escape(e) : e }.join(',')
wrap_char = """
converts = ['2','SE','STKT','','','',''].map { |x|
x =~ /[+-]?[0-9]+/ ? x : "#{wrap_char}#{x.to_s.tr(',', ';')}#{wrap_char}"
}
puts converts.join(",")
# 2,"SE","STKT","","","",""