2012-06-27 31 views
5

Trong Ruby 1.9.3 (và có lẽ là phiên bản cũ hơn, không chắc chắn), tôi đang cố gắng tìm ra lý do tại sao phương thức tách # String của Ruby cho tôi kết quả nhất định. Kết quả tôi nhận được dường như phản trực giác từ những gì tôi mong đợi. Dưới đây là ví dụ:Chuỗi có độ dài bằng không được trả về từ String # split

"abcabc".split("b") #=> ["a", "ca", "c"] 
"abcabc".split("a") #=> ["", "bc", "bc"] 
"abcabc".split("c") #=> ["ab", "ab"] 

Ở đây, ví dụ đầu tiên trả về chính xác những gì tôi mong đợi.

Nhưng trong ví dụ thứ hai, tôi nhầm lẫn là tại sao #split trả về một chuỗi có độ dài bằng 0 làm giá trị đầu tiên của mảng được trả về. Lý do cho việc này là gì? Đây là những gì tôi mong đợi thay vào đó:

"abcabc".split("a") #=> ["bc", "bc"] 

Và dọc theo cùng một dòng, làm thế nào không có chuỗi có độ dài bằng không được trả lại trong ví dụ thứ ba? Nếu ví dụ thứ hai trả về một chuỗi có độ dài bằng không vì nó là giá trị đầu tiên, thì ví dụ cuối cùng sẽ trả về giống như giá trị cuối cùng của nó.

Khai sáng cho tôi, tôi còn thiếu gì ở đây ??

EDIT: Nhìn sâu hơn vào nó, tôi nhận ra lý do tại sao đây là hành vi mặc định và tại sao suy nghĩ của tôi hoàn toàn sai. Ví dụ: nếu chúng tôi đã trải qua một tệp CSV, chia tách trên mỗi cột, dữ liệu của chúng tôi sẽ bị loại bỏ vì các cột hàng đầu trống sẽ bị bỏ qua.

Ngoài ra, điều quan trọng cần lưu ý là câu hỏi này không liên quan đến chỉ Ruby - Tôi đang học được rằng nhiều ngôn ngữ khác hoạt động theo cùng một cách chính xác. Tôi chỉ đơn giản là sử dụng Ruby khi tôi biết điều này.

+0

Bạn không nên chia CSV trên dấu phẩy. Nó sẽ cho bạn kết quả xấu trên bất kỳ chuỗi được trích dẫn nào có dấu phẩy được nhúng. Thay vào đó, hãy sử dụng mô-đun CSV tích hợp của Ruby, sẽ làm điều đúng. –

+0

@ người đàn ông tin: Hiểu, tôi chỉ nói về những điểm chung. Cảm ơn! – Threeve

Trả lời

4
"abcabc".split("b") #=> ["a", "ca", "c"] 
"abcabc".split("a") #=> ["", "bc", "bc"] 
"abcabc".split("c") #=> ["ab", "ab"] 

Giả sử bạn đã tách trên dấu phẩy. Bạn mong đợi hành vi nào từ ",bc,bc".split(',')? Nó không khác với việc chia tách 'a'. Đối với ví dụ thứ ba, split bỏ qua các khoảng trống theo sau theo mặc định.

+0

Tách trên dấu phẩy, tôi đoán tôi sẽ mong đợi kết quả của '[" bc "," bc "]'. Nhưng bắt đầu suy nghĩ về cách các tệp CSV hoạt động, hoàn toàn bỏ qua chuỗi trống rỗng hàng đầu sẽ dẫn đến kết quả không chính xác, vì vậy tôi hiểu được "tại sao" ngay bây giờ. – Threeve

5

Các ruby 1.9 documentation nói

Nếu tham số giới hạn được bỏ qua, trailing lĩnh vực rỗng đang bị đàn áp.

Vì vậy, nếu chúng ta lấy ví dụ của bạn:

"abcabc".split("a") #=> ["bc", "bc"] 

Và chúng tôi bao gồm một giá trị giới hạn:

"abcabc".split("a", -1) #=> ["ab", "ab", ""] 

Bạn nhận được các hành vi mong đợi.

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