Какая разница между to_a
и to_ary
?
Какая разница между to_a и to_ary?
Ответ 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