Подтвердить что ты не робот

Какая разница между to_a и to_ary?

Какая разница между to_a и to_ary?

4b9b3361

Ответ 1

to_ary используется для неявных преобразований, а to_a используется для экспликации преобразований.

Например:

class Coordinates
  attr_accessor :x, :y

  def initialize(x, y); @x, @y = x, y end

  def to_a; puts 'to_a called'; [x, y] end

  def to_ary; puts 'to_ary called'; [x, y] end

  def to_s; "(#{x}, #{y})" end

  def inspect; "#<#{self.class.name} #{to_s}>" end
end

c = Coordinates.new 10, 20
# => #<Coordinates (10, 20)>

Оператор splat (*) является формой явного преобразования в массив:

c2 = Coordinates.new *c
# to_a called
# => #<Coordinates (10, 20)>

С другой стороны, параллельное присваивание представляет собой форму неявного преобразования в массив:

x, y = c
# to_ary called
puts x
# 10
puts y
# 20

И так происходит захват членов коллекции в аргументах блока:

[c, c2].each { |(x, y)| puts "Coordinates: #{x}, #{y}" }
# to_ary called
# Coordinates: 10, 20
# to_ary called
# Coordinates: 10, 20

Примеры, проверенные на ruby-1.9.3-p0.

Этот шаблон, по-видимому, используется на всем языке Ruby, о чем свидетельствуют пары методов, такие как to_s и to_str, to_i и to_int и, возможно, больше.

Литература:

Ответ 2

to_ary позволяет обрабатывать объект как массив, тогда как to_a на самом деле пытается преобразовать этот параметр в массив.

to_ary может быть полезна при параллельном назначении, тогда как to_a больше подходит для реального преобразования.

Ответ 3

Цитата из веб-пространство gabew:

Вызов #to_a преобразует ресивер в массив, а #to_ary не будет.

ruby-1.9.2-p290 :001 > class A < Array; end

ruby-1.9.2-p290 :004 > A[].to_a.class
 => Array

ruby-1.9.2-p290 :005 > A[].to_ary.class
 => A 

Ответ 4

to_a, когда вызываемый объект возвращает представление массива obj

Примеры

class Example
  def initialize
      @str = 'example'
  end
end

a = Example.new #=> #<Example:0x105a74af8 @str="example"
a.to_a #=> [#<Example:0x105a6a3a0 @str="example">]

Пример хеширования

h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300  } 
h.to_a   #=> [["c", 300], ["a", 100], ["d", 400]]

Массив также может быть создан с помощью метода Array(), предоставляемого Kernel, который пытается вызвать to_ary, а затем to_a в аргументе. http://ruby-doc.org/core-2.0/Array.html#method-i-to_ary

насколько я могу видеть, массив # to_ary src просто возвращает массив, который передается, как в

def to_ary
  return self
end

Если я правильно понимаю, to_a используется для преобразования массива и делает его окончательный возврат с использованием to_ary. Но это может быть неверно в будущих версиях в соответствии с apidock

to_a Возвращает представление массива obj. Для объектов класса Object и других, которые явно не переопределяют метод, возвращаемое значение представляет собой массив, содержащий self. Однако это последнее поведение скоро будет устаревшим. http://apidock.com/ruby/Object/to_a