0

例如:

ruby-1.9.2-p0 > a = ['hello', 'world']
 => ["hello", "world"] 

ruby-1.9.2-p0 > "foo" + a
TypeError: can't convert Array into String
    from (irb):3:in `+'
    from (irb):3
    from /Users/peter/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'

ruby-1.9.2-p0 > "foo" + a.to_s
 => "foo[\"hello\", \"world\"]" 

ruby-1.9.2-p0 > puts "foo" + a.to_s
foo["hello", "world"]

为什么 Ruby 不能自动将数组转换为字符串?

4

3 回答 3

8

不是 Ruby不能,更多的是它不会。它是一种强类型语言,这意味着您需要自己处理类型转换。这有助于及早发现因混合不兼容类型而导致的错误,但需要程序员多加注意和打字。

于 2010-09-22T04:12:18.003 回答
0

字符串是一种特殊情况,因为您可以使用字符串插值来to_s隐式调用:

obj = Object.new.tap {|o|
  def o.to_s
    'object!'
  end
  def o.inspect
    '[object]'
  end
}

"foo: " + obj  # TypeError
"foo: #{obj}"
=> "foo: object!"

我重新定义inspect以表明to_s正在被调用,而不是inspect. 在 ruby​​ 1.9 上,Object#inspect调用to_s,所以如果我不重新定义inspect,上面的代码不会清楚地显示在插值过程中实际调用了哪个方法。

于 2013-10-02T16:45:44.760 回答
-3

您可以让您的 Ruby 自动转换为字符串。

class Array
  def to_string
    self.unshift("").join(" ")
  end
end

a = ["Hello", "World"]

"foo" + a.to_string

在 Rails 出现之前,我使用了 Ruby 一段时间。我刚刚重新下载了它并在玩,然后看到了你的问题。我可能是无知或疯子,但嘿......这是我的刺。

于 2010-09-22T07:11:03.317 回答