Implizite Konvertierungen

Einige Ruby-Methoden akzeptieren ein oder mehrere Objekte, die entweder

Für jede der relevanten Klassen wird die Konvertierung durch Aufruf einer spezifischen Konvertierungsmethode durchgeführt

Array-konvertierbare Objekte

Ein Array-konvertierbares Objekt ist ein Objekt, das

Die Ruby-Kernklasse, die diese Anforderungen erfüllt, ist

Die Beispiele in diesem Abschnitt verwenden die Methode Array#replace, die ein Array-konvertierbares Argument akzeptiert.

Diese Klasse ist Array-konvertierbar

class ArrayConvertible
  def to_ary
    [:foo, 'bar', 2]
  end
end
a = []
a.replace(ArrayConvertible.new) # => [:foo, "bar", 2]

Diese Klasse ist nicht Array-konvertierbar (keine to_ary-Methode)

class NotArrayConvertible; end
a = []
# Raises TypeError (no implicit conversion of NotArrayConvertible into Array)
a.replace(NotArrayConvertible.new)

Diese Klasse ist nicht Array-konvertierbar (Methode to_ary nimmt Argumente entgegen)

class NotArrayConvertible
  def to_ary(x)
    [:foo, 'bar', 2]
  end
end
a = []
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
a.replace(NotArrayConvertible.new)

Diese Klasse ist nicht Array-konvertierbar (Methode to_ary gibt kein Array zurück)

class NotArrayConvertible
  def to_ary
    :foo
  end
end
a = []
# Raises TypeError (can't convert NotArrayConvertible to Array (NotArrayConvertible#to_ary gives Symbol))
a.replace(NotArrayConvertible.new)

Hash-konvertierbare Objekte

Ein Hash-konvertierbares Objekt ist ein Objekt, das

Die Ruby-Kernklasse, die diese Anforderungen erfüllt, ist

Die Beispiele in diesem Abschnitt verwenden die Methode Hash#merge, die ein Hash-konvertierbares Argument akzeptiert.

Diese Klasse ist Hash-konvertierbar

class HashConvertible
  def to_hash
    {foo: 0, bar: 1, baz: 2}
  end
end
h = {}
h.merge(HashConvertible.new) # => {:foo=>0, :bar=>1, :baz=>2}

Diese Klasse ist nicht Hash-konvertierbar (keine to_hash-Methode)

class NotHashConvertible; end
h = {}
# Raises TypeError (no implicit conversion of NotHashConvertible into Hash)
h.merge(NotHashConvertible.new)

Diese Klasse ist nicht Hash-konvertierbar (Methode to_hash nimmt Argumente entgegen)

class NotHashConvertible
  def to_hash(x)
    {foo: 0, bar: 1, baz: 2}
  end
end
h = {}
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
h.merge(NotHashConvertible.new)

Diese Klasse ist nicht Hash-konvertierbar (Methode to_hash gibt kein Hash zurück)

class NotHashConvertible
  def to_hash
    :foo
  end
end
h = {}
# Raises TypeError (can't convert NotHashConvertible to Hash (ToHashReturnsNonHash#to_hash gives Symbol))
h.merge(NotHashConvertible.new)

Integer-konvertierbare Objekte

Ein Integer-konvertierbares Objekt ist ein Objekt, das

Die Ruby-Kernklassen, die diese Anforderungen erfüllen, sind

Die Beispiele in diesem Abschnitt verwenden die Methode Array.new, die ein Integer-konvertierbares Argument akzeptiert.

Diese benutzerdefinierte Klasse ist Integer-konvertierbar

class IntegerConvertible
  def to_int
    3
  end
end
a = Array.new(IntegerConvertible.new).size
a # => 3

Diese Klasse ist nicht Integer-konvertierbar (Methode to_int nimmt Argumente entgegen)

class NotIntegerConvertible
  def to_int(x)
    3
  end
end
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
Array.new(NotIntegerConvertible.new)

Diese Klasse ist nicht Integer-konvertierbar (Methode to_int gibt kein Integer zurück)

class NotIntegerConvertible
  def to_int
    :foo
  end
end
# Raises TypeError (can't convert NotIntegerConvertible to Integer (NotIntegerConvertible#to_int gives Symbol))
Array.new(NotIntegerConvertible.new)

String-konvertierbare Objekte

Ein String-konvertierbares Objekt ist ein Objekt, das

Die Ruby-Kernklasse, die diese Anforderungen erfüllt, ist

Die Beispiele in diesem Abschnitt verwenden die Methode String::new, die ein String-konvertierbares Argument akzeptiert.

Diese Klasse ist String-konvertierbar

class StringConvertible
  def to_str
    'foo'
  end
end
String.new(StringConvertible.new) # => "foo"

Diese Klasse ist nicht String-konvertierbar (keine to_str-Methode)

class NotStringConvertible; end
# Raises TypeError (no implicit conversion of NotStringConvertible into String)
String.new(NotStringConvertible.new)

Diese Klasse ist nicht String-konvertierbar (Methode to_str nimmt Argumente entgegen)

class NotStringConvertible
  def to_str(x)
    'foo'
  end
end
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
String.new(NotStringConvertible.new)

Diese Klasse ist nicht String-konvertierbar (Methode to_str gibt keinen String zurück)

class NotStringConvertible
  def to_str
    :foo
  end
end
# Raises TypeError (can't convert NotStringConvertible to String (NotStringConvertible#to_str gives Symbol))
String.new(NotStringConvertible.new)