2013-08-15 36 views
16

Có cách nào để đơn giản hóa mã sau không?Làm thế nào để biến một phương thức Ruby thành một khối?

tên tệp là danh sách tên tệp (chuỗi), ví dụ: [ "Foo.txt", "bar.c", "baz.yaml"]

filenames.map { |f| File.size(f) } 

Có cách nào để biến "File.size" vào một proc hoặc chặn? Đối với các phương pháp trên các đối tượng hiện có, tôi có thể thực hiện &:method. Có một cái gì đó tương tự cho các phương pháp cấp mô-đun?

Trả lời

22

Bạn có thể sử dụng Object#method(method_name) (mặc dù AFAIK không phải là thành ngữ):

filenames.map(&File.method(:size)) 
+0

Vâng .. đây là cái tôi sẽ cho .. Nhưng bạn đánh bại tôi .. cảm ơn vì đã trình bày điều này .. * + 1 *. –

+0

Thú vị, tôi đã đoán sai về thứ tự ràng buộc của '&'. – DGM

4
filesize = proc { |f| File.size(f) } 
filenames.map(&filesize) 
+0

+1 Rất mát mẻ. Tại sao tôi không nghĩ đến việc này? Bây giờ tôi có một thủ thuật tái cấu trúc mới tuyệt vời. –

+4

Điều đó không đơn giản hóa nó, nó bổ sung thêm sự phức tạp. –

+2

@ MartinC.Martin Thật vậy, nó không đơn giản hóa nó. Nhưng đó là chính xác những gì bạn hỏi. Câu trả lời này biến biểu thức thành một proc rất đơn giản. Đổ lỗi cho chính mình. Đó là lỗi của anh, không phải của Logan. – sawa

4

stdlib của Pathname cung cấp một cách tiếp cận hướng đối tượng hơn đối với tập tin và thư mục. Có thể có cách để cấu trúc lại filelist của bạn, ví dụ: thay vì:

filenames = Dir.entries(".") 
filenames.map { |f| File.size(f) } 

bạn sẽ sử dụng:

require 'pathname' 
filenames = Pathname.new(".").entries 
filenames.map(&:size) 
+2

Cảm ơn, điều này giải quyết vấn đề thực tế của tôi, mặc dù nó không trả lời tiêu đề của câu hỏi. –

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