2012-02-27 29 views

Trả lời

7

Không, không có cách viết tắt cho điều đó. Bạn có thể xác định một phương pháp:

def really_empty?(x) 
    x.strip.empty? 
end 

và sử dụng method:

array.reject(&method(:really_empty?)) 

hoặc sử dụng một lambda:

really_empty = ->(x) { x.strip.empty? } 
array.reject(&really_empty) 

nhưng tôi sẽ không gọi một trong những người tốt hơn trừ khi bạn có một sử dụng cho really_empty? ở những nơi đủ để tách logic có ý nghĩa.

Tuy nhiên, kể từ khi bạn đang sử dụng Rails, bạn chỉ có thể sử dụng blank? thay vì .strip.empty?:

array.reject(&:blank?) 

Lưu ý rằng nil.blank? là đúng trong khi nil.strip.empty? chỉ trao cho bạn một ngoại lệ vì vậy họ không hoàn toàn tương đương; tuy nhiên, bạn có thể muốn từ chối nil s vì vậy việc sử dụng blank? có thể tốt hơn. blank? cũng trả về giá trị đúng cho false, {}[] nhưng có thể bạn không có các chuỗi đó trong chuỗi của mình.

+1

Bạn cũng có thể xác định true_empty? trên "lớp nội dung mảng" (ví dụ: Chuỗi) và sau đó sử dụng nó như phương pháp trống. Tôi không khuyên điều này, chỉ nói rằng bạn có thể .. – Johannes

2

Nó sẽ là khá đẹp để viết trên như thế nhưng nó không phải là một cú pháp hỗ trợ, cách mà bạn mong muốn phương pháp chuỗi bằng cách sử dụng cú pháp to_proc (& :) là như vậy:

.map(&:strip).reject(&:empty?)

+1

Mặc dù trong tất cả các thực tế chứ không phải là cố gắng để chuỗi chúng lại với nhau như thế, tôi sẽ lựa chọn để sử dụng ví dụ ban đầu của bạn vì nó là. –

+2

Tôi chỉ chạy một thử nghiệm nhanh chóng và thấy rằng làm theo cách ban đầu của bạn nhanh hơn gấp đôi (trên hệ thống của tôi) hơn là làm theo cách viết nhanh (điều này có nghĩa là một mảng tạm thời khác sẽ được phân bổ như một phần của 'map'). –

+0

Gọi 'lazy' trước khi' map' có thể giúp thực hiện. – michau

1

Bạn có thể làm điều đó với các ampex đá quý:

require 'ampex' 
array.reject &X.strip.empty? 
Các vấn đề liên quan