2012-11-13 38 views

Trả lời

12

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()to_s như giống nhau, nhưng nó có thể là hữu ích để biết những gì đang xảy ra.

+0

Trình diễn tuyệt vời! –

2

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

3

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> 
Các vấn đề liên quan