在Ruby中定义字符串#prev方法

在Ruby中定义字符串#prev方法,ruby,string,encoding,Ruby,String,Encoding,我看到Ruby的String#next可以处理非ASCII字符。 说我懂英语、孟加拉语和印地语: > 'a'.next # => "b" > 'ক'.next # => "খ" > 'क'.next # => "ख" 这是正确的 现在我想为String类动态定义一个prev方法。 我可以这样做: String.define_method(:prev) { slice(0..-2) + slice(-1).ord.-(1).chr } >

我看到Ruby的String#next可以处理非ASCII字符。 说我懂英语、孟加拉语和印地语:

> 'a'.next    # => "b"
> 'ক'.next    # => "খ"
> 'क'.next    # => "ख"
这是正确的

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

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)


有什么方法可以做到这一点吗?

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

chr
更改为
chr('UTF-8')
将导致
“\u0915”
,这对于
之前的符号是正确的ख'

> 'b'.prev     # => "a"
> 'ख'.prev    # => "क"
> 'খ'.prev    # => "ক"