Ruby int字符串和int数组的范围(寻求改进)
首先,我所拥有的: s=“1,3..5,8” 我想要的是: [“1”、“3”、“4”、“5”、“8”] 我找到了一种方法,如下所示Ruby int字符串和int数组的范围(寻求改进),ruby,Ruby,首先,我所拥有的: s=“1,3..5,8” 我想要的是: [“1”、“3”、“4”、“5”、“8”] 我找到了一种方法,如下所示 r = s.split(/\s?,\s?/) => ["10", "12..15", "17", " r.map do |c| if Fixnum === eval(c) c else eval(c).map(&:to_s).flatten end end => ["10", "12", "13", "14", "15
r = s.split(/\s?,\s?/)
=> ["10", "12..15", "17", "
r.map do |c|
if Fixnum === eval(c)
c
else
eval(c).map(&:to_s).flatten
end
end
=> ["10", "12", "13", "14", "15", "17", "18"]
有没有更好的方法来实现这一点?我不会使用
eval
稍微好一点的方法是:
s = "1,3...5,8"
p s.split(',').map { |n|
if n.scan('...').empty?
n
else
Range.new(*n.split('...', 2)).to_a
end
}.flatten
# => ["1", "3", "4", "5", "8"]
编辑:
修复了@fl00r建议的使用多位数的代码。这样如何:
def magick(str)
str.split(",").map do |item|
item.scan(/(\d+)(\.+)(\d+)/)
if $1
Range.new($1.to_i, $3.to_i, $2 == "...").to_a
else
item.to_i
end
end.flatten
end
s1 = "1,3..5,8"
s2 = "1,3...5,8,20,100, 135"
magick(s1)
#=> [1, 3, 4, 5, 8]
magick(s2)
#=> [1, 3, 4, 8, 20, 100, 135]
s='1,2..6,10'
s.split(',').map { |e| e.strip.include?('..') ? eval("(#{e}).to_a") : e.to_i }.flatten
你为什么不使用eval?这是有原因的还是仅仅是个人的做法?请看下面的问题:如果数字是两位数怎么办<代码>s=1,3…5,8,11?如果范围是两点和三点呢<代码>s=1..3,5..7,20抓得好@fl00r,谢谢。关于点的数量,原始问题要求两个。Ruby中的
12…15
不应该返回15
@fl00r true,但原始问题用三个点编写,预计返回15。我也用javascript编程,eval是邪恶的,不知道Ruby,但肯定也有缺点
s='1,2..6,10'
s.split(',').map { |e| e.strip.include?('..') ? eval("(#{e}).to_a") : e.to_i }.flatten