Неявные преобразования
Некоторые методы Ruby принимают один или несколько объектов, которые могут быть:
-
Экземплярами заданного класса и поэтому принимаются без изменений.
-
Неявно преобразуемыми в этот класс; в этом случае вызванный метод преобразует объект.
Для каждого соответствующего класса преобразование выполняется вызовом определённого метода преобразования:
-
Array:
to_ary -
Hash:
to_hash -
Integer:
to_int -
String:
to_str
Объекты, преобразуемые в Array
Объект, преобразуемый в Array — это объект, который:
-
Имеет метод экземпляра
to_ary. -
Метод не принимает аргументов.
-
Метод возвращает объект
obj, для которогоobj.kind_of?(Array)возвращаетtrue.
Базовый класс Ruby, удовлетворяющий этим требованиям:
В примерах этого раздела используется метод Array#replace, принимающий аргумент, преобразуемый в Array.
Этот класс можно преобразовать в Array:
class ArrayConvertible
def to_ary
[:foo, 'bar', 2]
end
end
a = []
a.replace(ArrayConvertible.new) # => [:foo, "bar", 2]
Этот класс нельзя преобразовать в Array (нет метода to_ary):
class NotArrayConvertible; end a = [] # Raises TypeError (no implicit conversion of NotArrayConvertible into Array) a.replace(NotArrayConvertible.new)
Этот класс нельзя преобразовать в Array (метод to_ary принимает аргументы):
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)
Этот класс нельзя преобразовать в Array (метод to_ary возвращает объект не типа Array):
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
Объект, преобразуемый в Hash — это объект, который:
-
Имеет метод экземпляра
to_hash. -
Метод не принимает аргументов.
-
Метод возвращает объект
obj, для которогоobj.kind_of?(Hash)возвращаетtrue.
Базовый класс Ruby, удовлетворяющий этим требованиям:
В примерах этого раздела используется метод Hash#merge, принимающий аргумент, преобразуемый в Hash.
Этот класс можно преобразовать в Hash:
class HashConvertible
def to_hash
{foo: 0, bar: 1, baz: 2}
end
end
h = {}
h.merge(HashConvertible.new) # => {:foo=>0, :bar=>1, :baz=>2}
Этот класс нельзя преобразовать в Hash (нет метода to_hash):
class NotHashConvertible; end
h = {}
# Raises TypeError (no implicit conversion of NotHashConvertible into Hash)
h.merge(NotHashConvertible.new)
Этот класс нельзя преобразовать в Hash (метод to_hash принимает аргументы):
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)
Этот класс нельзя преобразовать в Hash (метод to_hash возвращает объект не типа Hash):
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
Объект, преобразуемый в Integer — это объект, который:
-
Имеет метод экземпляра
to_int. -
Метод не принимает аргументов.
-
Метод возвращает объект
obj, для которогоobj.kind_of?(Integer)возвращаетtrue.
Базовые классы Ruby, удовлетворяющие этим требованиям:
В примерах этого раздела используется метод Array.new, принимающий аргумент, преобразуемый в Integer.
Этот пользовательский класс можно преобразовать в Integer:
class IntegerConvertible
def to_int
3
end
end
a = Array.new(IntegerConvertible.new).size
a # => 3
Этот класс нельзя преобразовать в Integer (метод to_int принимает аргументы):
class NotIntegerConvertible
def to_int(x)
3
end
end
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
Array.new(NotIntegerConvertible.new)
Этот класс нельзя преобразовать в Integer (метод to_int возвращает объект не типа Integer):
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
Объект, преобразуемый в String — это объект, который:
-
Имеет метод экземпляра
to_str. -
Метод не принимает аргументов.
-
Метод возвращает объект
obj, для которогоobj.kind_of?(String)возвращаетtrue.
Базовый класс Ruby, удовлетворяющий этим требованиям:
В примерах этого раздела используется метод String::new, принимающий аргумент, преобразуемый в String.
Этот класс можно преобразовать в String:
class StringConvertible
def to_str
'foo'
end
end
String.new(StringConvertible.new) # => "foo"
Этот класс нельзя преобразовать в String (нет метода to_str):
class NotStringConvertible; end # Raises TypeError (no implicit conversion of NotStringConvertible into String) String.new(NotStringConvertible.new)
Этот класс нельзя преобразовать в String (метод to_str принимает аргументы):
class NotStringConvertible
def to_str(x)
'foo'
end
end
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
String.new(NotStringConvertible.new)
Этот класс нельзя преобразовать в String (метод to_str возвращает объект не типа String):
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)
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.