如何在Ruby中增加/减少所有可能值的字符?

我有一个长度为一个字符的字符串,可以是任何可能的字符值:

irb(main):001:0> "\x0" => "\u0000" 

我认为这可行:

 irb(main):002:0> "\x0" += 1 SyntaxError: (irb):2: syntax error, unexpected tOP_ASGN, expecting $end "\x0" += 1 ^ from /opt/rh/ruby193/root/usr/bin/irb:12:in `' 

但是,正如你所看到的,它没有。 如何增加/减少我的角色?


编辑:

Ruby似乎没有设置这样做。 也许我正在接近这个错误的方式。 我想用8位块来操作原始数据。 我怎样才能最好地完成那种操作?

根据可能的值,您可以使用String#next

 "\x0".next # => "\u0001" 

或者,要更新现有值:

 c = "\x0" c.next! 

这可能不是你想要的:

 "z".next # => "aa" 

我能想到的增加字符底层代码点的最简单方法是:

 c = 'z' c = c.ord.next.chr # => "{" 

减量稍微复杂一些:

 c = (c.ord - 1).chr # => "z" 

在这两种情况下都假设你不会超越0..255 ; 您可能需要添加检查。

你做不到:

 "\x0" += 1 

因为,在Ruby中,这是:

 "\x0" = "\x0" + 1 

将值赋给字符串文字是一种语法错误。

但是,给定整数n ,您可以使用pack将其转换为字符。 例如,

 [97].pack 'U' # => "a" 

同样,您可以使用ord将字符转换为整数。 例如:

 [300].pack('U').ord # => 300 

使用这些方法,您可以轻松编写自己的增量函数,如下所示:

 def step(c, delta=1) [c.ord + delta].pack 'U' end def increment(c) step c, 1 end def decrement(c) step c, -1 end 

如果您只想操作字节,可以使用String#bytes ,它将为您提供一个可以使用的整数数组。 您可以使用Array#pack将这些字节转换回String。 (有关编码选项,请参阅文档。)

您可以使用String#next方法。

我认为最优雅的方法(对于字母数字字符)将是:

 "a".tr('0-9a-z','1-9a-z0') 

这将循环a到z并通过数字然后回到a。

我重读了这个问题,看到我的答案与这个问题无关。 我没有直接操纵8位值的答案。