Tôi đang tìm kiếm một mảng tương đương String#split
trong Ruby Core và ngạc nhiên khi thấy rằng nó không tồn tại. Có một cách thanh lịch hơn sau đây để tách một mảng thành mảng phụ dựa trên một giá trị?Chia mảng thành mảng phụ dựa trên giá trị
class Array
def split(split_on=nil)
inject([[]]) do |a,v|
a.tap{
if block_given? ? yield(v) : v==split_on
a << []
else
a.last << v
end
}
end.tap{ |a| a.pop if a.last.empty? }
end
end
p (1..9).to_a.split{ |i| i%3==0 },
(1..10).to_a.split{ |i| i%3==0 }
#=> [[1, 2], [4, 5], [7, 8]]
#=> [[1, 2], [4, 5], [7, 8], [10]]
Sửa: Đối với những người quan tâm, những "thực tế" Vấn đề mà gây ra yêu cầu này có thể được nhìn thấy trong this answer, nơi tôi đã sử dụng @ câu trả lời fd của dưới đây để thực hiện.
Vâng, bằng Python bạn có thể chuyển đổi nó thành một chuỗi (giá trị tách biệt nhau bằng dấu phẩy hoặc một cái gì đó), chia đó, và sau đó quay trở lại vào một danh sách. Dunno nếu đó là một lựa chọn trong Ruby. –
@Rafe Nó sẽ là, nhưng chỉ khi nội dung chỉ là chuỗi. Thậm chí sau đó, điều đó khó có thể được coi là thanh lịch. : p – Phrogz
@Phrogz nếu chúng là số mà nó cũng hoạt động tốt. Bạn chỉ cần làm '','. Tham gia ([str (x) cho x trong list_of_nums])', sau đó chia nhỏ trên bất cứ điều gì, sau đó tham gia lại và chia trên dấu phẩy. Chức năng, vâng, tao nhã, eh không. –