to_a和to_ary有什么区别?

时间:2012-02-27 15:17:03

标签: ruby

to_ato_ary之间有什么区别?

4 个答案:

答案 0 :(得分:46)

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_sto_strto_ito_int等方法对所证明的那样,可能更多。

参考文献:

答案 1 :(得分:21)

to_ary允许将对象视为数组,而to_a实际上尝试将参数转换为数组。

to_ary可用于并行分配,而to_a更适合实际转换。

答案 2 :(得分:12)

引自gabew's web space

  

调用#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 

答案 3 :(得分:0)

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

也可以使用Kernel提供的Array()方法创建一个数组,该方法尝试调用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