在Ruby中定义String#prev方法

S.G*_*ami 2 ruby string encoding

我已经看到Ruby的String#next可以处理非ASCII字符。说我会英语,孟加拉语和北印度语:

> 'a'.next    # => "b"
> '?'.next    # => "?"
> '?'.next    # => "?"
Run Code Online (Sandbox Code Playgroud)

哪个是对的。

现在,我想为prevString类动态定义一个方法。我可以做这个:

String.define_method(:prev) { slice(0..-2) + slice(-1).ord.-(1).chr }
> 'hit'.prev    # => "his"
> 'b'.prev      # => "a"

> '?'.prev
Traceback (most recent call last):
        4: from /home/sourav/.irb:351:in `<main>'
        3: from (irb):17
        2: from (irb):11:in `block in irb_binding'
        1: from (irb):11:in `chr'
RangeError (2325 out of char range)

Run Code Online (Sandbox Code Playgroud)

但是它应该返回以下内容:

> 'b'.prev     # => "a"
> '?'.prev    # => "?"
> '?'.prev    # => "?"
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

eng*_*nky 5

您将必须为此传递编码,因为默认的外部编码为US-ASCII

更改chrchr('UTF-8')会导致"\u0915"对之前的符号正确'?'