2

まず、私が持っているもの:

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", "17", "18"]

これを達成するためのより良い方法はありますか?

4

4 に答える 4

4

私は使用しません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 によって提案されたようにコードを修正して、複数の数字で動作するようにしました。

于 2012-04-11T08:21:13.003 に答える
2
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]
于 2012-04-11T09:11:02.050 に答える
1
s = "10,12...15,17" 
s.split(',').map { |n| n['...'] ? Range.new(*n.split('...', 2)).to_a : n}.flatten 
#=> ["10", "12", "13", "14", "15", "17"]
于 2012-04-11T09:51:15.007 に答える
0

この方法はどうですか:

s='1,2..6,10'

s.split(',').map { |e| e.strip.include?('..') ? eval("(#{e}).to_a") : e.to_i }.flatten
于 2012-04-11T11:41:17.637 に答える