Implizite Konvertierungen
Einige Ruby-Methoden akzeptieren ein oder mehrere Objekte, die entweder
-
einer bestimmten Klasse sind und somit akzeptiert werden.
-
implizit in diese Klasse konvertierbar sind, in diesem Fall konvertiert die aufgerufene Methode das Objekt.
Für jede der relevanten Klassen wird die Konvertierung durch Aufruf einer spezifischen Konvertierungsmethode durchgeführt
-
Array:
to_ary -
Hash:
to_hash -
Integer:
to_int -
String:
to_str
Array-konvertierbare Objekte
Ein Array-konvertierbares Objekt ist ein Objekt, das
-
eine Instanzmethode
to_arybesitzt. -
Die Methode akzeptiert keine Argumente.
-
Die Methode gibt ein Objekt
objzurück, für dasobj.kind_of?(Array)truezurückgibt.
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
-
eine Instanzmethode
to_hashbesitzt. -
Die Methode akzeptiert keine Argumente.
-
Die Methode gibt ein Objekt
objzurück, für dasobj.kind_of?(Hash)truezurückgibt.
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
-
eine Instanzmethode
to_intbesitzt. -
Die Methode akzeptiert keine Argumente.
-
Die Methode gibt ein Objekt
objzurück, für dasobj.kind_of?(Integer)truezurückgibt.
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
-
eine Instanzmethode
to_strbesitzt. -
Die Methode akzeptiert keine Argumente.
-
Die Methode gibt ein Objekt
objzurück, für dasobj.kind_of?(String)truezurückgibt.
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)