Sự khác nhau giữa to_a
và to_ary
là gì?Sự khác biệt giữa to_a và to_ary là gì?
Trả lời
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_s
và to_str
, to_i
và to_int
và có thể nhiều hơn thế.
Tài liệu tham khảo:
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
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ế.
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
- 1. to_s so với to_str (và to_i/to_a/to_h so với to_int/to_ary/to_hash) trong Ruby
- 2. Sự khác biệt giữa JavaBean và POJO là gì?
- 3. Sự khác biệt giữa betweeen% INC và @INC là gì?
- 4. Sự khác biệt giữa INTERSECT và WHERE IN là gì?
- 5. Sự khác biệt giữa RoutedCommand và RoutedUICommand là gì?
- 6. Sự khác biệt chính giữa Sinatra và Ramaze là gì?
- 7. Sự khác biệt giữa DBI và DBD là gì?
- 8. Sự khác biệt giữa NSInvocation và chặn là gì?
- 9. Sự khác biệt giữa fn và fn * là gì?
- 10. Sự khác biệt giữa xtype và bí danh là gì?
- 11. Sự khác biệt giữa build.sbt và build.scala là gì?
- 12. Sự khác biệt giữa localname và qname là gì?
- 13. Sự khác biệt giữa Application.ThreadException và AppDomain.CurrentDomain.UnhandledException là gì?
- 14. Sự khác biệt giữa while (true) và loop là gì?
- 15. Sự khác biệt giữa dealloc và viewdidunload là gì?
- 16. Sự khác biệt giữa uint và System.UInt32 là gì?
- 17. Sự khác biệt giữa heuristic và thuật toán là gì?
- 18. Sự khác biệt giữa decodeURIComponent và decodeURI là gì?
- 19. Sự khác biệt giữa \ r và \ n là gì?
- 20. Sự khác biệt giữa phần .got và .got.plt là gì?
- 21. Sự khác biệt giữa ascx và .cshtml là gì?
- 22. Trong Ember.js, sự khác biệt giữa [] và Ember.A ([]) là gì?
- 23. Sự khác biệt giữa Thông báo và pynotify là gì?
- 24. sự khác biệt giữa callback là gì và hứa
- 25. Sự khác biệt giữa Request.ServerVariables ["REMOTE_ADDR"] và Request.UserHostAddress là gì?
- 26. Sự khác biệt giữa .closest() và .parents ('selector') là gì?
- 27. Sự khác biệt giữa isset và empty là gì?
- 28. Sự khác biệt giữa mẫu và đường dẫn là gì?
- 29. Sự khác biệt giữa "gọi" và "gọi" là gì?
- 30. Sự khác biệt giữa khẳng định và static_assert là gì?
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