2

ここでは、Rubyを間違った方法で使用しているように感じます。正規表現に対して可能なすべての一致を生成したい/[0-9A-Za-z]{3}/

succなので使えません。結合できないように見えるため、範囲の使用に問題があります"999".succ => "1000""zZz".succ => "aaAa"(0..9), ('A'..'Z'), ('a'..'z')

だから私は書いた:

def alphaNumeric
  #range and succ don't cut it for [0-9a-zA-Z]
  (0..9).each{|x|yield x.to_s}
  ('a'..'z').each{|x|yield x}
  ('A'..'Z').each{|x|yield x}
end
def alphaNumericX3
  alphaNumeric{ |a|
    alphaNumeric{ |b|
      alphaNumeric{ |c|
        yield a+b+c
      }
    }
  }
end
alphaNumericX3.each{|x|p x}

私の質問は2つあります:

醜い方法はありませんか?alphaNumericX3また、パラメーターから定義できる方法はあります(alphaNumeric, 3)か?

PS範囲の新しいクラスを定義できることを認識しています。しかし、それは間違いなく短くはありません。この次のブロックを上記のブロックよりも短く明確にすることができる場合は、次のようにしてください。

class AlphaNum
  include Comparable
  attr :length
  def initialize(s)
    @a=s.chars.to_a
    @length=@a.length
  end
  def to_s
    @a.to_s
  end
  def <=>(other)
    @a.to_s <=> other.to_s
  end
  def succ
    def inc(x,n)
      return AlphaNum.new('0'*(@length+1)) if x<0
      case n[x]
      when '9'
        n[x]='A'
      when 'Z'
        n[x]='a'
      when 'z'
        n[x]='0'
        return inc(x-1,n)
      else
        n[x]=n[x].succ
      end
      return AlphaNum.new(n.to_s)
    end
    inc(@length-1,@a.clone)
  end
end
# (AlphaNum.new('000')..AlphaNum.new('zzz')).each{|x|p x}
#  === alphaNumericX3.each{|x|p x}
4

2 に答える 2