Почему в Ruby нужно принудительно использовать массив в строку, используя to_a, если ясно, что это дополнение String? - PullRequest
0 голосов
/ 22 сентября 2010

Например:

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 не может автоматически преобразовать массив в строку?

Ответы [ 3 ]

8 голосов
/ 22 сентября 2010

Дело не в том, что Ruby не может , а в том, что не будет .Это строго типизированный язык , что означает, что вам нужно самостоятельно позаботиться о преобразовании типов.Это полезно при раннем обнаружении ошибок, возникающих в результате смешивания несовместимых типов, но требует немного большей осторожности и ввода от программиста.

0 голосов
/ 02 октября 2013

Строки являются особым случаем, потому что вы можете использовать интерполяцию строк для неявного вызова 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, вышеприведенный код не покажет, какой именно метод вызывался во время интерполяции.

0 голосов
/ 22 сентября 2010

Вы можете сделать так, чтобы ваш Ruby автоматически конвертировался в String.

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

a = ["Hello", "World"]

"foo" + a.to_string

Я немного использовал Ruby до того, как вышел Rails. Я просто скачал его снова и поиграл, потом увидел твой вопрос. Я могу быть неосведомленным или чокнутым, но эй ... это мой удар в этом.

...