to_a
和to_ary
之间有什么区别?
答案 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_s
和to_str
,to_i
和to_int
等方法对所证明的那样,可能更多。
参考文献:
答案 1 :(得分:21)
to_ary
允许将对象视为数组,而to_a
实际上尝试将参数转换为数组。
to_ary
可用于并行分配,而to_a
更适合实际转换。
答案 2 :(得分:12)
调用#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