2012-06-03 21 views
6

Tôi đã tìm thấy khối mã này trên Wikipedia như là một ví dụ về một quine (chương trình tự in) trong Ruby.Hiểu ruby ​​quine

puts <<2*2,2 
puts <<2*2,2 
2 

Tuy nhiên, tôi không hiểu cách hoạt động. Đặc biệt, những gì tôi không nhận được là khi tôi xóa dòng cuối cùng, tôi nhận được lỗi này:

syntax error, unexpected $end, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END

Điều gì xảy ra trong các dòng đó?

Trả lời

6

Cú pháp <<something bắt đầu một đây-tài liệu, vay mượn từ UNIX vỏ thông qua Perl - về cơ bản là một chuỗi ký tự nhiều dòng bắt đầu trên dòng sau << và kết thúc khi một dòng bắt đầu bằng something.

Vì vậy, về mặt cấu trúc, chương trình được chỉ làm điều này:

puts str*2,2 

... đó là, in hai bản sao của str tiếp theo là số 2.

Nhưng thay vì biến str, đó là bao gồm chuỗi chữ thông qua tài liệu tại đây có văn bản kết thúc cũng là chữ số 2:

puts <<2*2,2 
puts <<2*2,2 
2 

Vì vậy, nó in ra hai bản sao của chuỗi puts <<2*2,2, tiếp theo là 2. (Và vì phương pháp được sử dụng để in chúng ra là puts, mỗi thứ trong số đó nhận được một dòng mới được nối tự động.)

+0

Nhưng nếu điểm cuối của chuỗi là "cái gì đó" sau '< <', không phải là trình tự' 2 * 2,2', và trình tự tương tự được sử dụng trong dòng cuối cùng để kết thúc nó? – SasQ

+0

Ưu tiên của '<<' chặt hơn '*', vì vậy '<< 2 * 2' là" chuỗi được biểu diễn bằng tài liệu 2 chấm dứt sau đây, nhân với 2 "thay vì" chuỗi được biểu thị bằng các ký tự sau 2 * 2 chấm dứt tài liệu ở đây. " –

1

Trong ruby, bạn có thể xác định chuỗi với

str = <<DELIMITER 
    long string 
    on several 
    lines 
DELIMITER 

Tôi cho rằng từ đây, bạn có thể đoán phần còn lại :)

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