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?
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?
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.
thực sự ... câu trả lời tuyệt vời ... được thực hiện tốt. – RubyDubee
Đó là một trừu tượng bị rò rỉ. http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Levi
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. –