9

長さが 1 文字で、任意の文字値を指定できる文字列があります。

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 `<main>'

しかし、ご覧のとおり、そうではありませんでした。キャラクターをインクリメント/デクリメントするにはどうすればよいですか?


編集:

Rubyはこれを行うように設定されていないようです。多分私はこれに間違った方法でアプローチしています。生データを 8 ビット チャンクで操作したい。そのような操作をどのように行うのが最善でしょうか?

4

4 に答える 4

23

可能な値に応じて、次を使用できます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;の外に出ないという前提があります。そのためのチェックを追加する必要がある場合があります。

于 2013-08-02T00:00:43.440 に答える
1

メソッドを使用できますString#next

于 2013-08-02T00:01:20.117 に答える
0

最もエレガントな方法(英数字の場合)は次のようになると思います:

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

これは、a を z までループし、数値を通過して a に戻ります。

私は質問を読み直して、私の答えが質問とは何の関係もないことを知りました. 8ビット値を直接操作することについては答えがありません。

于 2015-11-18T11:14:59.193 に答える