2010-03-30 31 views
8

Khi tôi gõ này:Tại sao không phải là "lặp lại" * 3` giống như "3 *" lặp lại "" trong Ruby?

puts 'repeat' * 3 

tôi nhận được:

>> repeat repeat repeat 

Nhưng nó không làm việc nếu tôi làm điều này:

puts 3 * 'repeat' 

Tại sao?

+3

Đó là một trừu tượng bị rò rỉ. http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Levi

+5

Tôi muốn tranh luận rằng nó không phải là một trừu tượng bị rò rỉ, không có lý do gì để giả định rằng * là giao hoán cho chuỗi và fixnum. –

Trả lời

28

Trong Ruby, khi bạn gọi a * b, bạn đang thực sự gọi một phương thức có tên là * trên a. Hãy thử điều này, ví dụ:

a = 5 
=> 5 
b = 6 
=> 6 
a.*(b) 
=> 30 

c = "hello" 
=> "hello" 
c.*(a) 
=> "hellohellohellohellohello" 

Như vậy <String> * <Fixnum> hoạt động tốt, bởi vì phương pháp * trên String hiểu làm thế nào để xử lý các số nguyên. Nó phản ứng bằng cách nối một số bản sao của chính nó lại với nhau.

Nhưng khi bạn làm 3 * "repeat", nó sẽ gọi * trên Fixnum với đối số String. Điều đó không hiệu quả, bởi vì phương pháp * của Fixnum hy vọng sẽ thấy một loại số khác.

+0

thực sự ... câu trả lời tuyệt vời ... được thực hiện tốt. – RubyDubee

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