2011-06-27 19 views
34

Đây là mảng của tôi:Áp dụng phương pháp cho từng yếu tố trong mảng/đếm

array = [:one,:two,:three] 

Tôi muốn áp dụng phương pháp to_s cho tất cả các phần tử mảng của tôi để có được array = ['one','two','three'].

Làm cách nào tôi có thể thực hiện việc này (chuyển đổi từng thành phần của số đếm thành số khác)?

+0

Bản sao có thể có của [Chuyển đổi một mảng các số nguyên thành một mảng các chuỗi trong Ruby?] (Http://stackoverflow.com/questions/781054/convert-an-array-of-integers-into-an-array- of-strings-in-ruby) – Nakilon

Trả lời

57

này sẽ làm việc:

array.map!(&:to_s) 
+2

array.map! (&: to_s) - Bạn cũng không làm việc này với 1.8? –

+0

Nó hoạt động trong Ruby 1.8.7. Tôi sử dụng nó trong các dự án của tôi trên tất cả. –

+0

Biểu tượng # to_proc không có sẵn trong phiên bản 1.8.6, nhưng có sẵn trong phiên bản 1.8.7: http://apidock.com/ruby/Symbol/to_proc. Tôi biết điều này từ kinh nghiệm cá nhân là tốt, vì tôi không sử dụng Rails hoặc thư viện của nó. –

15

Bạn có thể sử dụng map hoặc map! tương ứng, người đầu tiên sẽ trả về một danh sách mới, thứ hai sẽ thay đổi danh sách tại chỗ:

>> array = [:one,:two,:three] 
=> [:one, :two, :three] 

>> array.map{ |x| x.to_s } 
=> ["one", "two", "three"] 
+0

Cảm ơn bạn đã trả lời nhanh chóng và chi tiết! –

7
  • array.map!(&:to_s) sửa đổi mảng ban đầu thành ['one','two','three']
  • array.map(&:to_s) trả về arra y ['one','two','three'].
+0

@sawa: Thực ra, điều đó không đúng. Ruby-On-Rails thực sự là một ngôn ngữ lập trình, với nhiều câu hỏi hơn về Ruby. Nhưng giống như Perl, CLU và SmallTalk, Ruby đã kết hợp các bit tốt nhất của nó vào ngôn ngữ của nó. ;) http://xkcd.com/386/ –

+0

@Andrew Được rồi. Cảm ơn. Tôi đã xóa nhận xét của tôi ngay trước khi bạn đưa ra một số nhận xét. – sawa

+0

Đối với những người tự hỏi tôi đã trả lời một cách hài hước, @sawa về cơ bản hỏi liệu người trả lời có biết Ruby là ngôn ngữ không, và Rails là một framework chạy trên Ruby, vì @sawa nghĩ rằng Symbol # to_proc chỉ là Rails trong 1.8 .7. –

15

Nó đáng chú ý rằng nếu bạn có một mảng của các đối tượng bạn muốn vượt qua cá nhân vào một phương thức với một người gọi khác nhau, như thế này:

# erb 
<% strings = %w{ cat dog mouse rabbit } %> 
<% strings.each do |string| %> 
    <%= t string %> 
<% end %> 

Bạn có thể sử dụng method phương pháp kết hợp với mở rộng khối hành vi để đơn giản hóa:

<%= strings.map(&method(:t)).join(' ') %> 

Nếu bạn không quen thuộc, những gì method làm là đóng gói phương pháp gắn liền với biểu tượng truyền cho nó trong một Proc và trả về nó. Dấu và mở rộng Proc này thành một khối, được chuyển đến map khá độc đáo. Sự trở lại của map là một mảng, và chúng tôi có thể muốn định dạng nó một chút độc đáo hơn, do đó các join.

Thông báo trước là, giống như với Symbol#to_proc, bạn không thể chuyển đối số cho phương thức trợ giúp.

+0

Cảm ơn, đây là một mẹo thực sự tốt đẹp! – antinome

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