如何在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位值的答案。