Определение метода String # prev в Ruby - PullRequest
2 голосов
/ 08 июля 2019

Я видел, что Ruby's String # next может обрабатывать символы не ASCII. Сказав, что я знаю английский, бенгальский и хинди:

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

Что верно.

Теперь я хочу динамически определить метод prev для класса String. Я могу сделать это:

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)

Но он должен вернуть следующее:

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

Есть ли способ сделать это?

1 Ответ

5 голосов
/ 08 июля 2019

Вы должны будете передать кодировку для этого, потому что внешняя кодировка по умолчанию - US-ASCII.

Изменение chr на chr('UTF-8') приведет к "\u0915", что является правильным для символа до 'ख'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...