Spec-Zone.ru › Ruby 3.4

Неявные преобразования

Некоторые методы 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

В примерах этого раздела используется метод 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

В примерах этого раздела используется метод 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, удовлетворяющие этим требованиям:

  • Integer

  • Float

  • Complex

  • Rational

В примерах этого раздела используется метод 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

В примерах этого раздела используется метод 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API