Để hiểu xem bạn có nên sử dụng/triển khai to_s
/to_str
, hãy xem một số ví dụ. Nó được tiết lộ để xem xét khi phương pháp này thất bại.
1.to_s # returns "1"
Object.new.to_s # returns "#<Object:0x4932990>"
1.to_str # raises NoMethodError
Object.new.to_str # raises NoMethodError
Như chúng ta có thể thấy, to_s
là hạnh phúc để biến bất kỳ đối tượng thành một chuỗi. Mặt khác, to_str
đặt ra lỗi khi tham số của nó không giống như một chuỗi.
Bây giờ, hãy xem Array#join
.
[1,2].join(',') # returns "1,2"
[1,2].join(3) # fails, the argument does not look like a valid separator.
Nó rất hữu ích mà Array#join
chuyển thành chuỗi các mục trong mảng (bất cứ điều gì họ thực sự đang có) trước khi gia nhập chúng, vì vậy Array#join
cuộc gọi to_s
trên chúng.
Tuy nhiên, dấu phân tách được cho là chuỗi - ai đó đang gọi [1,2].join(3)
có thể đang phạm sai lầm. Đây là lý do tại sao Array#join
gọi to_str
trên dấu phân cách.
Nguyên tắc tương tự dường như giữ cho các phương pháp khác. Cân nhắc to_a
/to_ary
trên băm:
{1,2}.to_a # returns [[1, 2]], an array that describes the hash
{1,2}.to_ary # fails, because a hash is not really an array.
Nói tóm lại, đây là cách tôi nhìn thấy nó:
- gọi
to_s
để có được một chuỗi mô tả các đối tượng.
- gọi
to_str
để xác minh rằng một đối tượng thực sự hoạt động như một chuỗi.
- triển khai
to_s
khi bạn có thể tạo chuỗi mô tả đối tượng của mình.
- triển khai
to_str
khi đối tượng của bạn hoàn toàn có thể hoạt động giống như một chuỗi.
Tôi nghĩ trường hợp khi bạn có thể tự mình thực hiện to_str
thì có thể là lớp ColoredString
- một chuỗi có màu gắn liền với nó. Nếu có vẻ rõ ràng đối với bạn, việc chuyển dấu phẩy màu đến join
không phải là lỗi và phải dẫn đến "1,2"
(mặc dù chuỗi đó không được tô màu), sau đó làm triển khai to_str
trên ColoredString.
Andrew, cảm ơn. Nhưng theo nghĩa thực tế, điều đó có nghĩa là "những lớp học đó hoạt động như dây?" Điều đó có nghĩa là chúng thực hiện các phương thức giống như Strings? Và những gì khác sẽ to_str trở lại khác hơn là tự nếu đối tượng đã hoạt động như một chuỗi? –
@JeffStorey Có. Trừ khi lớp của bạn có thể được thay thế cho/bởi một String, bạn không nên thực hiện 'to_str'. Việc thực thi chuỗi 'to_s' và' to_str' của chuỗi làm điều đó: tự trả về. Việc thực hiện 'to_str' là một cách để xác nhận rằng bạn hành động giống như một String. Nhiều phương thức cốt lõi sử dụng 'to_str' theo cách này. Bài đăng trên blog mà tôi trích dẫn là đáng đọc ':)'. –
Andrew, cảm ơn. Tôi đã đọc bài đó và tôi vẫn chưa rõ lắm. Có bao giờ một thời gian mà bạn có thể thực hiện to_str? Đó là phần tôi thực sự bối rối về ... Tôi không thể nghĩ ra một ví dụ thực tế một cách dễ dàng. –