Computer >> Máy Tính >  >> Lập trình >> Ruby

Thoát khỏi các ký tự trong Ruby

Trong bài đăng này, chúng ta sẽ nói về việc thoát các ký tự trong Ruby. Chúng ta sẽ tìm hiểu cách thoát các ký tự, cách hoạt động và cách tránh thoát hoàn toàn trong một số trường hợp sử dụng. Nếu bạn nghĩ rằng bạn biết tất cả về \ , đảm bảo đọc hết và ngạc nhiên ...

Hãy đi sâu vào với ký tự thoát trong chuỗi.

Bỏ qua dấu ngoặc kép

Khi sử dụng chuỗi trong Ruby, đôi khi chúng ta cần đặt dấu ngoặc kép mà chúng ta đã sử dụng để xác định chuỗi bên trong chính chuỗi đó. Khi làm như vậy, chúng ta có thể thoát ký tự trích dẫn bằng dấu gạch chéo ngược \ biểu tượng.

# Escape quotes in double quoted strings
"Hello \"world\"!"
=> "Hello \"world\"!"
 
# Escape quotes in single quoted strings
'Hello \'world\'!'
=> "Hello 'world'!"

Ở đây, chúng ta có thể thấy rằng Ruby mặc định đặt các chuỗi được trích dẫn kép cho đầu ra và chỉ thoát khỏi các dấu ngoặc kép đó trong đầu ra.

Chuỗi thoát

Bên cạnh dấu ngoặc kép, có nhiều biểu tượng khác mà chúng ta có thể thoát trong chuỗi. Ví dụ:một dòng mới được đại diện bởi \n . Đây được gọi là "chuỗi thoát".

"Hello\nworld"
=> "Hello\nworld"

Những gì được trả lại là chuỗi giống như chúng tôi đã tạo, nhưng như bạn có thể thấy \n được đánh dấu, cho biết đó là một chuỗi thoát. Nếu bây giờ chúng ta in chuỗi này, chúng ta thấy rằng \n không được in, nhưng thay vào đó, một dòng mới thực sự được in.

puts "Hello\nworld"
=> Hello
world

Điều này không hoạt động trong các chuỗi được trích dẫn đơn lẻ. \n trình tự được hiểu là một \n theo nghĩa đen . Trong các chuỗi được trích dẫn kép, bạn sẽ phải thoát khỏi biểu tượng dấu gạch chéo ngược để đạt được kết quả tương tự.

'\n'
=> "\\n"

Ví dụ về các chuỗi thoát khác hoạt động theo cách tương tự là:\t , \s\b , tương ứng đại diện cho một tab, một khoảng trắng và một khoảng trắng.

Dấu ngoặc kép so với và dấu ngoặc kép

Sự khác biệt giữa các chuỗi được trích dẫn đơn và kép trong Ruby là cách các định nghĩa chuỗi thể hiện các chuỗi thoát.

  • Trong gấp đôi các chuỗi được trích dẫn, bạn có thể viết các chuỗi thoát và Ruby sẽ xuất ra ý nghĩa đã dịch của chúng. A \n trở thành một dòng mới.
  • Trong đơn Tuy nhiên, các chuỗi được trích dẫn, các chuỗi thoát được thoát và trả về định nghĩa theo nghĩa đen của chúng. A \n vẫn là một \n .

Tất nhiên, cả hai loại chuỗi đều có các trường hợp sử dụng của chúng. Có thể bạn sẽ sử dụng các chuỗi được trích dẫn kép với các chuỗi thoát để sử dụng ý nghĩa đã dịch của chúng, một dòng mới hoặc một tab.

Dấu ngoặc kép hữu ích để tránh tự thoát khỏi các chuỗi thoát. Hữu ích để chứng minh cách sử dụng của chúng hoặc tránh vô tình sử dụng các chuỗi thoát mà bạn không có ý định.

puts "Line 1\nLine 2"
=> Line 1
Line 2
 
puts 'Using a \n we can indicate a newline.'
=> Using a \n we can indicate a newline.

Thoát nội suy

Ruby hỗ trợ nội suy bên trong chuỗi. Nhưng một lần nữa, không phải tất cả các định nghĩa chuỗi đều được tạo ra như nhau. Phép nội suy chỉ hoạt động trong các chuỗi được trích dẫn kép.

Trong ví dụ mã bên dưới, chúng ta thấy rằng phép nội suy hoạt động trong một chuỗi được trích dẫn kép, nhưng Ruby thoát khỏi chuỗi nội suy trong một chuỗi được trích dẫn duy nhất, khiến nó trở nên vô dụng.

name = "world"
 
"Hello #{name}"
=> "Hello world"
 
'Hello #{name}'
=> "Hello \#{name}"

Hành vi này áp dụng cho hầu hết mọi loại chuỗi "ma thuật". Dấu ngoặc kép hỗ trợ điều đó, dấu ngoặc kép thì không.

Ký hiệu phần trăm cho chuỗi

Ký hiệu phần trăm trong Ruby là thứ lấy cảm hứng từ ngôn ngữ lập trình Perl và cung cấp cho chúng ta nhiều cách viết tắt cho một số định nghĩa kiểu phổ biến.

Hành vi tương tự đối với các chuỗi được trích dẫn đơn và kép cũng áp dụng cho ký hiệu phần trăm.

  • %()%Q() hoạt động giống như một chuỗi được trích dẫn kép.
  • %q() hoạt động giống như một chuỗi được trích dẫn duy nhất.

Vấn đề với ký hiệu phần trăm là bây giờ bạn cần phải thoát khỏi các ký tự trong ngoặc đơn () thay vì dấu ngoặc kép khi dấu ngoặc đơn không cân đối.

Đó là lý do tại sao Ruby cho phép bạn sử dụng các ký hiệu khác cho ký hiệu phần trăm:%[foo] , %{foo} , %-foo- , %?foo? , v.v. Nó thậm chí còn hỗ trợ %"foo"%'foo' .

Ở đây chúng ta thấy rằng Ruby thoát khỏi chuỗi cho chúng ta khi sử dụng ký hiệu phần trăm.

%(Hello "world"!)
=> "Hello \"world\""
 
# With unbalanced parenthesis
%(Hello world\)!)
=> "Hello world)!"
 
# With balanced parenthesis
%(Hello (world)!)
=> "Hello (world)!"

Một lần nữa, các quy tắc tương tự áp dụng ở đây như với các chuỗi được trích dẫn đơn và kép thông thường. Theo mặc định, trình tự thoát và nội suy được thoát trong các chuỗi được trích dẫn đơn lẻ.

name = "world"
 
%(Hello\n "#{name}"!)
=> "Hello\n \"world\"!"
 
%q(Hello\n "#{name}"!)
=> "Hello\\n \"\#{name}\"!"
 
%Q(Hello\n "#{name}"!)
=> "Hello\n \"world\"!"

Thoát ký tự trong biểu thức chính quy

Các ký tự thoát cũng hoạt động trong biểu thức chính quy. Trong biểu thức chính quy, nhiều ký tự đại diện không chỉ là định nghĩa theo nghĩa đen của chúng.

. là một thẻ đại diện cho bất kỳ ký tự nào, dấu ngoặc nhọn [] đại diện cho một phạm vi hoặc một lựa chọn, dấu ngoặc đơn () khớp với một biểu thức, v.v. Để sử dụng các định nghĩa theo nghĩa đen của chúng, chúng ta cũng có thể thoát chúng bằng biểu tượng dấu gạch chéo ngược.

/Hello \[world\]/
=> /Hello \[world\]/
 
/\[world\]/ =~ "Hello [world]"
=> 6

Nếu chúng tôi không thoát khỏi dấu ngoặc, thay vào đó, nó sẽ tìm kiếm bất kỳ ký tự nào giữa các dấu ngoặc và tìm kết quả khớp đầu tiên trong ký tự l trong "Xin chào" ở vị trí 3.

/[world]/ =~ "Hello [world]"
=> 2 # zero index

Để tránh phải thoát khỏi ký hiệu gạch chéo về phía trước / , được sử dụng để xác định biểu thức chính quy, chúng ta có thể sử dụng một ký hiệu phần trăm khác.

%r{/world/}
=> /\/world\//

Sử dụng %r{} chúng ta có thể xác định một biểu thức chính quy nơi chúng ta không phải thoát khỏi dấu gạch chéo. Kết quả là chúng ta có thể thấy rằng Ruby thoát khỏi dấu gạch chéo đối với chúng ta.

Thoát ngắt dòng

Trước đây, chúng tôi đã thoát khỏi chuỗi thoát "dòng mới" \n trong một chuỗi trong Ruby. Bạn có biết rằng bạn cũng có thể thoát khỏi tình trạng ngắt dòng trong chính Ruby không?

Ví dụ:chúng tôi có một dòng rất dài cho một lệnh gọi phương thức và điều này phá vỡ độ dài dòng tối đa của hướng dẫn kiểu mã của chúng tôi.

ruby_method_with_many_arguments "Hello world", split: " ", join: "\n"

Chúng ta có thể đặt các đối số trên các dòng riêng biệt để làm cho mỗi dòng riêng lẻ ngắn hơn. Điều này hoạt động miễn là dòng trước đó kết thúc bằng dấu phẩy , , các toán tử như biểu tượng dấu cộng + hoặc là một phần của lệnh gọi phương thức được đặt trong dấu ngoặc đơn () .

ruby_method_with_many_arguments "Hello world",
  split: " ",
  join: "\n"
 
ruby_method_with_many_arguments(
  "Hello world",
  split: " ",
  join: "\n"
)

Thay vào đó, nếu chúng ta muốn căn chỉnh tất cả các đối số trên cùng một mức thụt lề mà không đặt nó trong dấu ngoặc đơn () chúng ta có thể sử dụng dấu gạch chéo ngược \ để thoát khỏi ngắt dòng.

ruby_method_with_many_arguments \
  my_string,
  split: " ",
  join: "\n"

Những gì chúng tôi làm ở đây không thực sự bảo Ruby thoát khỏi dòng mới, mà là tuyên bố sẽ tiếp tục ở dòng tiếp theo.

Thoát ngắt dòng trong định nghĩa chuỗi

Thoát dòng kết thúc cũng hoạt động cho những thứ như định nghĩa chuỗi. Thông thường, nếu chúng ta có một chuỗi nhiều dòng, chúng ta có thể sử dụng ký hiệu dấu cộng + để kết hợp các chuỗi trên hai dòng.

"foo" +
  "bar"
=> "foobar"

Điều này tạo ra hai chuỗi trên hai dòng và sau đó kết hợp làm một. Vì vậy, nó thực sự tạo ra ba đối tượng chuỗi.

Thay vì sử dụng biểu tượng dấu cộng, chúng ta có thể thoát khỏi dấu ngắt dòng bằng dấu gạch chéo ngược.

"foo" \
  "bar"
=> "foobar"

Kết quả là giống nhau, hay là nó?

Trong ví dụ đầu tiên, chúng tôi thực sự kết hợp hai chuỗi mới, trong khi trong ví dụ thứ hai, Ruby sẽ chỉ tạo một chuỗi. Trình thông dịch Ruby sẽ thấy dấu gạch chéo ngược \ như một phần tiếp theo của định nghĩa chuỗi và chỉ tạo một chuỗi dựa trên hai dòng. Vì vậy, nó thậm chí còn tốt hơn cho việc sử dụng bộ nhớ của ứng dụng.

Kết luận

Việc thoát các ký tự trong Ruby và nhiều ngôn ngữ lập trình khác có thể khá khó hiểu. Đột nhiên, một số kết hợp ký tự nhất định có ý nghĩa khác bên trong chuỗi được trích dẫn kép so với việc được sử dụng bên trong chuỗi được trích dẫn đơn.

Hy vọng rằng hướng dẫn nhỏ này đã giúp bạn hiểu cách thoát các ký tự và chuỗi ký tự trong Ruby đúng cách. Sự khác biệt giữa chuỗi được trích dẫn kép và chuỗi đơn nằm ở đây.

Chuỗi "ma thuật" của chuỗi thoát và phép nội suy chỉ thực sự hoạt động trong chuỗi được trích dẫn kép, nhưng không hoạt động trong chuỗi được trích dẫn đơn.

Cũng có nhiều cách khác để thoát mã trong chính Ruby. Ký hiệu phần trăm giúp chúng ta tránh thoát các ký tự nhất định mọi lúc, trong chuỗi và biểu thức chính quy.

Nhưng dấu gạch chéo ngược cũng rất hữu ích để viết các chuỗi nhiều dòng và tiếp tục một dòng mã Ruby trên dòng tiếp theo. Một thứ mà tôi sử dụng rất nhiều để giữ cho mã của mình sạch sẽ và dễ đọc.

Hãy cho chúng tôi biết tại @AppSignal nếu bạn muốn biết thêm hoặc có câu hỏi cụ thể về cách thoát các ký tự trong Ruby.

Lưu ý thú vị:đối với bài đăng này, được viết bằng Markdown, tôi đã phải sử dụng biểu tượng dấu gạch chéo ngược khá nhiều. Cũng giống như trong Ruby, Markdown cho phép thoát một số ký tự nhất định. Thông thường trong Markdown, bạn không thể thực sự đặt dấu gạch chéo ngược trong một khối mã vì nó tự thoát ra khỏi khối mã. Thay vào đó, tôi đã để nó thoát khỏi một khoảng trống.

`\` # Doesn't work
`\ ` # Works :)