2012-02-27 41 views

Trả lời

40

to_ary được sử dụng cho ngầm chuyển đổi, trong khi to_a được sử dụng cho explict chuyển đổi.

Ví dụ:

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

Nhà điều hành splat (*) là một hình thức rõ ràng chuyển đổi sang mảng:

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

Mặt khác, chuyển nhượng song song là một hình thức ẩn số chuyển đổi thành mảng:

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

Và như vậy được chụp các thành viên thu thập trong đối số khối:

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

Ví dụ thử nghiệm trên ruby-1.9.3-p0.

Mẫu này dường như được sử dụng trên tất cả ngôn ngữ Ruby, được minh chứng bằng các cặp phương thức như to_sto_str, to_ito_int và có thể nhiều hơn thế.

Tài liệu tham khảo:

+1

Chỉ cần nhận thấy cách to_ary cung cấp cách thức khớp mẫu trong khối :) – Shanthakumar

12

Quoted from gabew's web space:

Calling #to_a sẽ chuyển đổi người nhận một mảng, trong khi #to_ary sẽ không.

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 
19

to_ary cho phép một đối tượng được đối xử như một mảng, trong khi to_a thực sự cố gắng để chuyển đổi các tham số vào một mảng.

to_ary có thể hữu ích cho việc gán song song, trong khi to_a phù hợp hơn cho một chuyển đổi thực tế.

0

to_a, khi kêu gọi một đối tượng trả về một đại diện mảng của obj

Ví dụ

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

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

Hash Ví dụ

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

Một mảng cũng có thể được tạo ra bằng cách sử dụng phương pháp Array(), được cung cấp bởi Kernel, mà cố gắng gọi to_ary, sau đó to_a trên đối số của nó.http://ruby-doc.org/core-2.0/Array.html#method-i-to_ary

nên như xa như tôi có thể thấy, Array # to_ary src chỉ trả về mảng được thông qua tại, như trong

def to_ary 
    return self 
end 

nếu tôi hiểu đúng, to_a được sử dụng để chuyển đổi mảng và làm cho lợi nhuận cuối cùng của nó bằng cách sử dụng to_ary. Nhưng điều này có thể không đúng trong các phiên bản sau theo apidock

to_a Trả về biểu diễn mảng của obj. Đối với các đối tượng của đối tượng lớp và các đối tượng khác không ghi đè rõ ràng phương thức, giá trị trả lại là một mảng chứa tự. Tuy nhiên, hành vi sau này sẽ sớm lỗi thời. http://apidock.com/ruby/Object/to_a

Các vấn đề liên quan