String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
Có sự khác biệt nào giữa hai phương pháp cưỡng chế này không? Nếu có, bạn có thể chứng minh không?Trong Ruby, sự khác biệt giữa String() và #to_s
String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
Có sự khác biệt nào giữa hai phương pháp cưỡng chế này không? Nếu có, bạn có thể chứng minh không?Trong Ruby, sự khác biệt giữa String() và #to_s
Các docs for the String
method nói:
Chuyển đổi arg vào một String bằng cách gọi phương thức to_s của nó.
Vì vậy, nhìn chung chúng giống nhau, nhưng có một số khác biệt - mặc dù bạn không thể thấy chúng thật. String()
kiểm tra lớp tham số của nó và nếu nó chưa là String
thì gọi số to_s
trên đó. Gọi trực tiếp to_s
có nghĩa là phương pháp được gọi là bất kể.
Hãy xem xét các lớp:
class MyString < String
def to_s
"Overridden to_s method"
end
end
Một thể hiện của MyString
đã là một đối tượng String
, vì vậy đi qua nó như một tham số để String()
sẽ không làm bất cứ điều gì. Tuy nhiên, gọi số to_s
sẽ được trả về Overridden to_s method
.
1.9.3p286 :010 > m = MyString.new 'my string'
=> "my string"
1.9.3p286 :011 > o = String.new 'orig string'
=> "orig string"
1.9.3p286 :012 > String o
=> "orig string"
1.9.3p286 :013 > String m
=> "my string"
1.9.3p286 :014 > o.to_s
=> "orig string"
1.9.3p286 :015 > m.to_s
=> "Overridden to_s method"
Bạn đang khó bao giờ cần phải ghi đè to_s
trên một lớp con String
như thế này, nói chung bạn có thể điều trị String()
và to_s
như giống nhau, nhưng nó có thể là hữu ích để biết những gì đang xảy ra.
String (object) là một phương pháp hạt nhân mà các cuộc gọi #to_s trên đối tượng
Họ nâng cao ngoại lệ khác nhau khi họ thất bại:
bo = BasicObject.new
String(bo)
TypeError: can't convert BasicObject into String
bo.to_s
NoMethodError: undefined method `to_s' for #<BasicObject:0x0003efbfd79c10>
Trình diễn tuyệt vời! –