Мне кажется, что я использую 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}