如何将任何String值转换为其正确的表示形式?

时间:2019-01-04 23:02:01

标签: ruby

我想实现一种将任何给定的 String 值转换为其正确表示形式的方法。以下是一些我所指的示例:

  • “ TRUE”应变为true(TrueClass)
  • “ 1000”应变为1000(整数)
  • 仅应返回“文本”(字符串)

我相信这已经由我提供的代码解决了,尽管我对它的外观不太满意。我认为可以将其修改为更复杂的内容,但我的创造力已达到极限。

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 :(得分:2)

通常,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)。

答案 1 :(得分:0)

YAML.load可能适用于您的用例,但是它比您需要的功能更强大,并且在解析不可信数据时会带来安全漏洞。

它将很好地解析数字,布尔值和字符串,而且具有数组和哈希的语法,并且可以加载任意对象类型,这可能导致任意代码执行...