В чем разница между to_a и to_ary? - PullRequest
39 голосов
/ 27 февраля 2012

В чем разница между to_a и to_ary?

Ответы [ 4 ]

47 голосов
/ 27 февраля 2012

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 и, возможно, другие.

Ссылки:

22 голосов
/ 27 февраля 2012

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

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

12 голосов
/ 27 февраля 2012

Цитируется из веб-пространства 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 
0 голосов
/ 18 мая 2013

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

так что, насколько я вижу, Array # 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...