【问题标题】:Most concise way to test string equality (not object equality) for Ruby strings or symbols?测试 Ruby 字符串或符号的字符串相等性(不是对象相等性)的最简洁方法?
【发布时间】:2009-11-10 19:01:48
【问题描述】:

我总是这样做来测试 Ruby 中的字符串相等性:

if mystring.eql?(yourstring)
 puts "same"
else
 puts "different"
end

这是在不测试对象相等性的情况下执行此操作的正确方法吗?

我正在寻找基于字符串内容测试字符串的最简洁方法。

加上括号和问号,这看起来有点笨拙。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    根据http://www.techotopia.com/index.php/Ruby_String_Concatenation_and_Comparison

    做任何一个

    mystring == yourstring

    mystring.eql? yourstring

    是等价的。

    【讨论】:

      【解决方案2】:

      您的代码示例没有扩展您的部分主题,即符号,因此部分问题没有得到解答。

      如果你有两个字符串,foo 和 bar,并且两者都可以是字符串或符号,你可以测试相等性

      foo.to_s == bar.to_s
      

      在已知类型的操作数上跳过字符串转换会更有效一些。所以如果 foo 总是一个字符串

      foo == bar.to_s
      

      但几乎可以肯定的是,不值得代表调用者要求任何额外工作。

      在 Ruby 2.2 之前,避免将不受控制的输入字符串用于比较目的(与字符串或符号),因为符号不会被垃圾收集,因此您可能会因资源耗尽而拒绝服务。将符号的使用限制为您控制的值,即代码中的文字和受信任的配置属性。

      Ruby 2.2 introduced garbage collection of symbols.

      【讨论】:

      • foo.intern == bar.intern 会更好——平均而言,实习字符串比从符号创建字符串更有效。 (如果给定的字符串之前已经被实习过,它只返回符号。)
      • 实际上我认为从字符串中创建符号只是为了节省一些比较是一个好主意,因为如果字符串不匹配,它会泄漏符号。符号不会被垃圾收集,因此如果您不打算保留它们,则不应创建它们,否则您会创建一个用于拒绝服务攻击的向量。
      • 天啊,我没想到。谢谢,我已根据您的评论修改了答案。
      • 这需要重申:“避免实习不受控制的输入字符串 [...] 因为符号不是垃圾收集”。谢谢@Sheldonh。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      相关资源
      最近更新 更多