【问题标题】:Why does `[].to_s.empty?` behave differently between ruby 1.9 and 2.0?为什么 `[].to_s.empty?` 在 ruby​​ 1.9 和 2.0 之间表现不同?
【发布时间】:2015-01-19 19:00:02
【问题描述】:

这是 1.9 ruby​​ 中的行为:

[].to_s.empty? #=> false
{}.to_s.empty? #=> false
[].to_s #=> "[]"
{}.to_s #=> "{}"
[43,43].to_s #=> "[43, 43]"
{"fire"=>"water"}.to_s #=> "{\"fire\"=>\"water\"}"

这是 2.0 ruby​​ 中的行为:

[].to_s.empty? #=> true
{}.to_s.empty? #=> true
[].to_s #=> ""
{}.to_s #=> ""
[43,43].to_s #=> "4343"
{"fire"=>"water"}.to_s #=> "firewater"

我想知道 2.0 中 to_s 方法的这种行为变化。

编辑:我很抱歉。我正在结束这个问题。出于某种原因,我以为我正在运行 2.x.x ruby​​,但路径搞砸了。它指向图像上的 1.8.7 版本的 ruby​​。当我修复指向正确 ruby​​ (2.1.4) 的路径时,我看到了正确的行为。

【问题讨论】:

  • 这不是正确的行为。 2.0 的行为应该与 1.9.3 完全相同。检查您是否没有为 ruby​​ 或 irb 加载任何扩展。
  • 具体来说,您测试的是 1.9 的哪个版本?
  • [].to_s 在 2.2、2.1、2.0 和 1.9.3 中是 '[]',所以他们都不应该说 [].to_s 是空的。您的 [43,43].to_s{"fire"=>"water"}.to_s 在 2.0.x 中也很奇怪,那么您的 to_s 方法有什么问题?
  • 那么2.0.x 中的x 是什么?某处是否有to_s 回归到 1.8.7 行为?您确定您使用的是 2.0.x 而不是 1.8.7? 1.8.7 准确地给出了您为 2.0.x 声明的结果。
  • 这看起来根本不对。 RUBY_VERSION 对 2.0.x 测试有什么作用?

标签: ruby ruby-1.9 ruby-2.0


【解决方案1】:

在 2.x 中,这是 [].to_s 的输出

2.1.5 :001 > [].to_s
 => "[]"
2.1.5 :002 > [43,43].to_s
 => "[43, 43]"

鉴于它与您的 Ruby 设置不匹配,您的系统中肯定有一些东西正在改变它。

尝试开始一个简单、清晰的irb 会话。如果它像我上面显示的那样工作,则意味着您的 Ruby 应用程序有问题。

如果它不起作用,则表示您的 Ruby 设置有问题。

不管问题出在哪里,我想知道你为什么要依赖这样的代码

[].to_s.empty?

我找不到上面的代码有意义的单一案例。如果要检查数组中是否存在某些项目,只需使用

[].empty?

如果你想把数组当作字符串,用可能合理的方式进行转换,比如join

[].join("").empty?

【讨论】:

  • 感谢您的回答。我正在使用的机器有一个混乱的环境路径,实际上指向的是一个非常旧版本的 ruby​​ (1.8.7)。
猜你喜欢
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2016-05-28
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多