2011-07-22 35 views

Trả lời

24

Theo Programming in Lua 2.4 Strings:

Chúng ta có thể phân định chuỗi chữ cũng bằng cách kết hợp hai dấu ngoặc vuông [[...] ]. Các văn bản trong biểu mẫu được đặt trong ngoặc đơn này có thể chạy cho nhiều dòng, có thể lồng ghép và không giải thích các chuỗi thoát. Hơn nữa, biểu mẫu này bỏ qua ký tự đầu tiên của chuỗi khi ký tự này là một dòng mới. Biểu mẫu này đặc biệt thuận tiện cho việc viết các chuỗi có chứa các phần chương trình; ví dụ,

page = [[ 
<HTML> 
<HEAD> 
<TITLE>An HTML Page</TITLE> 
</HEAD> 
<BODY> 
<A HREF="http://www.lua.org">Lua</A> 
[[a text between double brackets]] 
</BODY> 
</HTML> 
]] 

Đây là điều gần gũi nhất với những gì bạn đang yêu cầu, nhưng sử dụng các phương pháp trên giữ newlines nhúng trong chuỗi, vì vậy điều này sẽ không làm việc trực tiếp.

Bạn cũng có thể làm điều này với chuỗi nối (sử dụng ..):

value = "long text that" .. 
     " I want to carry over" .. 
     "onto multiple lines" 
+0

Cảm ơn bạn, [[]] là những gì tôi đang tìm kiếm! – bratao

+2

Tôi muốn bình luận chống lại việc sử dụng '..' quá nhiều: Mỗi kết nối đơn lẻ sinh ra một chuỗi mới, có khả năng gây tổn hại nghiêm trọng đến hiệu suất. Nếu bạn muốn đặt nhiều khối nhỏ với nhau, đặt chúng trong một bảng và sử dụng 'table.concat' là một cách tiếp cận tốt hơn. – jpjacobs

+4

Mỗi concatention mới sinh ra một chuỗi mới, nhưng nhiều concatentations trong một chuỗi được thực hiện tất cả cùng một lúc ==> nhìn vào đầu ra luac cho ở trên; sẽ chỉ có 1 CONCAT opcode. – daurnimator

1

Bạn đã thử các string.sub (s, i [, j]) chức năng. Bạn có thể muốn xem ở đây:

http://lua-users.org/wiki/StringLibraryTutorial

+0

Tôi tự hỏi làm thế nào điều này là hữu ích; câu hỏi OPs là xây dựng một chuỗi dài từ những cái nhỏ hơn và không phải là cách khác xung quanh, đó là những gì mà câu trả lời này - nhận được các chuỗi nhỏ hơn từ một chuỗi lớn hơn 'string.sub'. – legends2k

0

này:

return "Bigggg string 1"\ 
"continuation of string"\ 
"continuation of string"\ 
"End of string" 

C/C++ cú pháp gây ra trình biên dịch để xem nó tất cả như một chuỗi lớn. Nó thường được sử dụng để dễ đọc.

Các Lua tương đương sẽ là:

return "Bigggg string 1" .. 
"continuation of string" .. 
"continuation of string" .. 
"End of string" 

Do lưu ý rằng C/C++ Cú pháp là thời gian biên dịch, trong khi Lua tương đương có khả năng thực hiện các nối trong thời gian chạy (mặc dù trình biên dịch về mặt lý thuyết có thể tối ưu hóa nó). Nó không phải là một vấn đề lớn mặc dù.

3

Tôi đặt tất cả các đoạn trong bảng và sử dụng table.concat trên đó. Điều này tránh việc tạo ra các chuỗi mới tại mỗi lần nối. ví dụ (không đếm trên đầu cho chuỗi trong Lua):

   -- bytes used 
foo="1234".. --   4 = 4 
    "4567".. -- 4 + 4 + 8 = 16 
    "89ab" -- 16 + 4 + 12 = 32 
      -- | | | \_ grand total after concatenation on last line 
      -- | | \_ second operand of concatenation 
      -- | \_ first operand of concatenation 
      -- \_ total size used until last concatenation 

Như bạn có thể thấy, đây phát nổ khá nhanh chóng. Tốt hơn là:

foo=table.concat{ 
"1234", 
"4567", 
"89ab"} 

Sẽ mất khoảng 3 * 4 + 12 = 24 byte.

+0

Bảng nối có thể là tuyệt vời để bảo tồn bộ nhớ, nhưng nó sẽ chậm hơn khoảng 4x so với sử dụng nối chuỗi thuần túy. – devius

13

Hầu hết các câu trả lời ở đây giải quyết vấn đề này tại thời gian chạy và không phải lúc biên dịch.

Lua 5.2 giới thiệu trình tự thoát \z để giải quyết vấn đề này một cách trang nhã mà không phải chịu bất kỳ chi phí nào trong thời gian chạy.

> print "This is a long \z 
>>        string with \z 
>>  breaks in between, \z 
>> and is spanning multiple lines \z 
>> but still is a single string only!" 
This is a long string with breaks in between, and is spanning multiple lines but still is a single string only! 

\z bỏ qua tất cả ký tự tiếp theo trong chuỗi cho đến ký tự không dấu cách đầu tiên. Điều này cũng có tác dụng đối với văn bản chữ không nhiều dòng.

> print "This is a simple \z    string" 
This is a simple string 

Từ Lua 5.2 Reference Manual

Các dãy thoát '\ z' bỏ qua khoảng ký tự sau đây trắng-không gian, bao gồm ngắt dòng; nó đặc biệt hữu ích để phá vỡ và thụt lề một chuỗi ký tự dài thành nhiều dòng mà không thêm các dòng mới và dấu cách vào nội dung chuỗi.

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