【问题标题】:How to convert any String value into its proper representation?如何将任何字符串值转换为正确的表示形式?
【发布时间】:2019-01-05 18:38:07
【问题描述】:

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

  • “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

我的问题本质上是:有没有办法提供相同的功能,但返回语句更少,整体代码更少?

【问题讨论】:

  • @baseballllover723,您是否希望读者访问该链接并尝试找出您发布该链接的原因?请在执行此操作时提供上下文。
  • "1.3""{ 1=>2, e\3=>4 }" 等呢?它们会被视为字符串吗?也就是字符串代表一个整数,true还是false,其他都是文本?
  • 我不确定我是否理解你的问题,Cary。我想您是在问我如何处理浮点数,在这种情况下,我会回答我将它们视为 String 对象。我基本上只想区分整数、布尔值和字符串——在这种情况下,其他任何东西都无关紧要。

标签: ruby


【解决方案1】:

一般来说,case 可以很好地替代多个ifs。

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

注意:目前仅支持十进制整数(问题中的代码也支持八进制,但未知是否有意)。如果需要00x 和/或0b 前缀指示的其他基,则根据需要更改正则表达式(并切换回Integer(str))。

【讨论】:

  • 这看起来比我制作的要好得多。谢谢!
  • 八进制、十六进制和二进制数呢? Integer('0b11') 做了正确的事情,但这会通过你的正则表达式。你确定要^$ 吗?您几乎总是希望在 Ruby 正则表达式中使用 \A\z
  • @muistooshort 十六进制和二进制被故意省略,因为它们也被 OP 省略了,我理解问题的重点是如何重写相同的代码。诚然,包含的迹象偏离了这一点。同样,他们也使用^$,但我承认这可能是一个错误,我应该纠正它。 (现在编辑为使用 \A\z 并排除八进制以保持一致性。)
  • 哦,我明白了!我将重写我的表达式以使用 \A\z 代替,因为 String 对象实际上可能包含换行符。
【解决方案2】:

YAML.load 可能适用于您的用例,但它比您需要的更强大,如果您解析不受信任的数据,它可能会引入安全漏洞。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 2021-04-13
    相关资源
    最近更新 更多