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
и, возможно, другие.
Ссылки: