Как преобразовать любое значение String в его правильное представление? - PullRequest
0 голосов
/ 05 января 2019

Я хотел бы реализовать метод, который преобразует любое заданное значение String в его правильное представление. Вот несколько примеров того, что я имею в виду:

  • «ИСТИНА» должна стать истинной (TrueClass)
  • «1000» должно стать 1000 (целое число)
  • "текст" должен быть просто возвращен (String)

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

def convert(value)
    return true if value =~ /^true$/i
    return false if value =~ /^false$/i
    return value unless value =~ /^[0-9]*$/

    begin
        Integer(value)
    rescue ArgumentError
        nil
    end
end

По сути, у меня вопрос: есть ли способ обеспечить такую ​​же функциональность, но с меньшим количеством операторов возврата и общим количеством кода?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

YAML.load может работать для вашего варианта использования, но он более мощный, чем вам нужно, и может создать дыры в безопасности, если вы анализируете ненадежные данные.

Он отлично разбирает числа, логические значения и строки, но также имеет синтаксис для массивов и хэшей и может загружать произвольные типы объектов, которые могут вызвать выполнение произвольного кода ...

0 голосов
/ 05 января 2019

В общем, case является достойной заменой нескольких if с.

def convert(str)
  case str.downcase
  when /\A[+-]?[0-9]+\z/
    str.to_i
  when 'true'
    true
  when 'false'
    false
  when ''
    nil
  else
    str.clone
  end
end

Примечание: в настоящее время поддерживаются только целые числа в десятичном виде (код в вопросе также поддерживает восьмеричное значение, но неизвестно, является ли оно преднамеренным или нет). При необходимости измените регулярное выражение (и переключитесь обратно на Integer(str)), если требуются другие основания, указанные префиксами 0, 0x и / или 0b.

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