2010-06-16 38 views
7

Trong Smalltalk, nếu cho chuỗi 'OneTwoThree', tôi muốn xóa phần 'Ba' cuối cùng .e., Trong ký pháp tìm kiếm phương thức Squeak: 'OneTwoThree' . 'Three' . 'OneTwo'.Cách thanh lịch để xóa phần cuối của chuỗi?

Điều tốt nhất tôi có thể đưa ra là:

'OneTwoThree' allButLast: 'Three' size,

nhưng nó không cảm thấy rất Smalltalk-ish, bởi vì nó sử dụng độ dài chuỗi con, chứ không phải là chuỗi con riêng của mình. Làm thế nào bạn sẽ mã nó?

+0

+1 cho bộ sưu tập "bon mot"! –

Trả lời

8
'OneTwoThree' readStream upToAll: 'Three' 
6

Tôi thường sử dụng #copyReplaceAll: với: Phương pháp, nếu chuỗi cuối cùng không được lặp đi lặp lại ở những nơi khác trong chuỗi ban đầu của khóa học:

'OneTwoThree' copyReplaceAll: 'Three' with: '' 
+1

Yup, nhưng điều đó sẽ thay thế TẤT CẢ các lần xuất hiện của 'Ba'. Nhưng có, nó ngắn và ngọt ngào. – nes1983

+0

Nhưng chỉ cho trường hợp của bạn, tôi nghĩ rằng giải pháp của bạn vẫn là tốt nhất. –

1

Nếu bạn cần tất cả mọi thứ chỉ sau sự xuất hiện cuối cùng loại bỏ:

| original cutOut lastEnd currentEnd sửa đổi |

gốc: = 'OneTwoThree'.
cutOut: = 'Ba'.
lastEnd: = 0.
[currentEnd: = lastEnd.
lastEnd: = original indexOf: cutOut startingAt: lastEnd +1.
lastEnd = 0 ] trong khiFalse.

chỉnh sửa: = currentStart> 0 ifTrue: [gốc đầu tiên: currentEnd] ifFalse: [bản gốc]

+0

Mmmm mã này không phải là rất hướng đối tượng. Các tùy chọn được mô tả ở trên là tốt hơn nhiều vì chúng thực sự sử dụng lại mã được cung cấp. Trong smalltalk loại mã thủ tục này được coi là một tội lỗi. –

+0

Vâng, cả hai phương pháp trên đều không làm những gì anh ta hỏi, từ cách tôi diễn giải nó; loại bỏ phần cuối cùng của chuỗi, bắt đầu từ lần xuất hiện cuối cùng của chuỗi khác. readStream upToAll: trả về một chuỗi với mọi thứ sau lần xuất hiện đầu tiên của 'Ba' bị xóa. copyReplaceAll: trả về chuỗi có tất cả các lần xuất hiện của 'Ba' bị xóa và không có gì khác. Vì vậy, trong khi họ sử dụng lại những gì người khác đã tạo ra các phương pháp tiện lợi cho, điều đó không thực sự hữu ích nếu đó không phải là những gì anh ấy đang cố gắng làm :) – Rydier

+0

BTW; nếu bạn cho rằng loại mã đó là "tội lỗi", hãy thử xem xét các thực thi thực tế của copyReplaceAll: with: và upToAll:;) – Rydier

2

Trong dự án Moose, cần có một phương pháp #removeSuffix: mà loại bỏ một hậu tố nhất định, nếu hiện tại.

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