使用具有不同规则的String.succ?

时间:2014-12-17 15:55:13

标签: ruby string generator

我目前需要编写一个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。

2 个答案:

答案 0 :(得分:1)

您尝试生成的id可以被视为基础36 数字。因此,我们可以使用String#to_iFixnum#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增加字符串,您应该执行以下操作:

  1. 将字符串翻译为整数:nextid = last_id.to_i(36)
  2. 添加一个:nextid += 1
  3. 转换回字符串:nextid = nextid.to_s(36)