What's the difference between to_a and to_ary?

Ruby

Ruby Problem Overview


What's the difference between to_a and to_ary?

Ruby Solutions


Solution 1 - Ruby

to_ary is used for implicit conversions, while to_a is used for explict conversions.

For example:

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)>

The splat operator (*) is a form of explicit conversion to array:

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

On the other hand, parallel assignment is a form of implicit conversion to array:

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

And so is capturing collection members in block arguments:

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

Examples tested on ruby-1.9.3-p0.

This pattern seems to be used all over the Ruby language, as evidenced by method pairs like to_s and to_str, to_i and to_int and possibly more.

References:

Solution 2 - Ruby

to_ary allows an object to be treated as an array, whereas to_a actually tries to convert the parameter into an array.

to_ary can be useful for parallel assignment, whereas to_a is more suited for an actual conversion.

Solution 3 - Ruby

Quoted from gabew's web space:

> Calling #to_a will convert the receiver to an Array, while #to_ary will not.

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 

Solution 4 - Ruby

to_a, when called on an object returns an array representation of obj

Examples

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

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

Hash Example

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

> An array can also be created by using the Array() method, provided by Kernel, which tries to call to_ary, then to_a on its argument. http://ruby-doc.org/core-2.0/Array.html#method-i-to_ary

so as far as I can see, the Array#to_ary src just returns the array that is passed in, as in

def to_ary
  return self
end

if I understand correctly, to_a is used for array conversion and makes its final return using to_ary. But this may not be true in future versions according to apidock

> to_a Returns an array representation of obj. For objects of class Object and others that don’t explicitly override the method, the return value is an array containing self. However, this latter behavior will soon be obsolete. http://apidock.com/ruby/Object/to_a

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionhey mikeView Question on Stackoverflow
Solution 1 - RubyMatheus MoreiraView Answer on Stackoverflow
Solution 2 - RubysiameView Answer on Stackoverflow
Solution 3 - RubysgtFloydView Answer on Stackoverflow
Solution 4 - Rubylfender6445View Answer on Stackoverflow