Spec-Zone.ru › Ruby 3.3

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

Некоторые методы Ruby принимают один или несколько объектов, которые могут быть:

  • Определённого класса, и поэтому принимаются как есть.

  • Неявным образом преобразуемые к этому классу, в этом случае вызываемый метод преобразует объект.

Для каждого из соответствующих классов преобразование выполняется путём вызова определённого метода преобразования:

  • Массив: to_ary

  • Хэш: to_hash

  • Целое число: to_int

  • Строка: to_str

Объекты, преобразуемые в массив

Объект, преобразуемый в массив, — это объект, который:

  • Имеет метод экземпляра to_ary.

  • Метод не принимает аргументов.

  • Метод возвращает объект obj, для которого obj.kind_of?(Array) возвращает true.

Базовый класс Ruby, удовлетворяющий этим требованиям, — это:

  • Array

Примеры в этом разделе используют метод 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.

Базовый класс Ruby, удовлетворяющий этим требованиям, — это:

  • Hash

Примеры в этом разделе используют метод 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.

Базовые классы Ruby, удовлетворяющие этим требованиям, — это:

  • Integer

  • Float

  • Complex

  • Rational

Примеры в этом разделе используют метод 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.

Базовый класс Ruby, удовлетворяющий этим требованиям, — это:

  • String

Примеры в этом разделе используют метод 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.

Spec-Zone.ru

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