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