我目前需要编写一个id生成器,我想获得有关如何实现它的帮助。基本上,id有数字和字母。我想使用succ,但它并不是我想要的。这是我想要的订单:
[0, 1, 2, 3, ... , 8, 9, "a", "b", "c", "d", ... , "x", "y", "z", "00", "01", "02", ..., "0a", ...]
你认为可以通过succ旁边的一系列内容吗?基本上我会传递类似的东西。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
编辑: 基本上我想知道id的下一个id。例如,我有一个34b,这会给我a34c或a329会给我a32a。
答案 0 :(得分:1)
您尝试生成的id
可以被视为基础36 数字。因此,我们可以使用String#to_i和Fixnum#to_s方法来转换基础系统(2到36之间)。
注意:我还添加了String#prev
方法,因为它在这里可能有意义;但是such a method isn't provided in the standard API。
警告:猴子修补核心课程不是一个好习惯;我刚刚将其作为特别提及的问题String#succ
发布;将String
子类化为创建新的id
类型可能更好。
积分:来自this answer的想法。
class String
def succ
(self.to_i(36) + 1).to_s(36)
end
def prev
(self.to_i(36) - 1).to_s(36)
end
end
'a329'.succ # => "a32a"
"a32a".prev # => "a329"
答案 1 :(得分:0)
看起来你基本上希望id在36位(这是数字0-9加上字母a-z)。要使用base 36增加字符串,您应该执行以下操作:
nextid = last_id.to_i(36)
nextid += 1
nextid = nextid.to_s(36)