Elixir - Chuỗi

Các chuỗi trong Elixir được chèn vào giữa dấu ngoặc kép và chúng được mã hóa bằng UTF-8. Không giống như C và C ++ trong đó các chuỗi mặc định được mã hóa ASCII và chỉ có thể có 256 ký tự khác nhau, UTF-8 bao gồm 1.112.064 điểm mã. Điều này có nghĩa là mã hóa UTF-8 bao gồm nhiều ký tự có thể có khác nhau. Vì các chuỗi sử dụng utf-8, chúng ta cũng có thể sử dụng các ký hiệu như: ö, ł, v.v.

Tạo một chuỗi

Để tạo một biến chuỗi, chỉ cần gán một chuỗi cho một biến -

str = "Hello world"

Để in cái này ra bảng điều khiển của bạn, chỉ cần gọi IO.puts và chuyển cho nó biến str -

str = str = "Hello world" 
IO.puts(str)

Chương trình trên tạo ra kết quả sau:

Hello World

Chuỗi trống

Bạn có thể tạo một chuỗi trống bằng cách sử dụng chuỗi ký tự, "". Ví dụ,

a = ""
if String.length(a) === 0 do
   IO.puts("a is an empty string")
end

Chương trình trên tạo ra kết quả sau.

a is an empty string

Nội suy chuỗi

Nội suy chuỗi là một cách để xây dựng một giá trị Chuỗi mới từ hỗn hợp các hằng số, biến, ký tự và biểu thức bằng cách bao gồm các giá trị của chúng bên trong một ký tự chuỗi. Elixir hỗ trợ nội suy chuỗi, để sử dụng một biến trong một chuỗi, khi viết nó, hãy bọc nó bằng dấu ngoặc nhọn và thêm vào trước dấu ngoặc nhọn bằng một'#' ký tên.

Ví dụ,

x = "Apocalypse" 
y = "X-men #{x}"
IO.puts(y)

Điều này sẽ lấy giá trị của x và thay thế nó bằng y. Đoạn mã trên sẽ tạo ra kết quả sau:

X-men Apocalypse

Kết nối chuỗi

Chúng ta đã thấy việc sử dụng nối chuỗi trong các chương trước. Toán tử '<>' được sử dụng để nối các chuỗi trong Elixir. Để nối 2 chuỗi,

x = "Dark"
y = "Knight"
z = x <> " " <> y
IO.puts(z)

Đoạn mã trên tạo ra kết quả sau:

Dark Knight

Chiều dài chuỗi

Để có được độ dài của chuỗi, chúng tôi sử dụng String.lengthchức năng. Chuyển chuỗi làm tham số và nó sẽ hiển thị cho bạn kích thước của nó. Ví dụ,

IO.puts(String.length("Hello"))

Khi chạy chương trình trên, nó tạo ra kết quả sau:

5

Đảo ngược một chuỗi

Để đảo ngược một chuỗi, hãy chuyển nó vào hàm String.reverse. Ví dụ,

IO.puts(String.reverse("Elixir"))

Chương trình trên tạo ra kết quả sau:

rixilE

So sánh chuỗi

Để so sánh 2 chuỗi, chúng ta có thể sử dụng toán tử == hoặc ===. Ví dụ,

var_1 = "Hello world"
var_2 = "Hello Elixir"
if var_1 === var_2 do
   IO.puts("#{var_1} and #{var_2} are the same")
else
   IO.puts("#{var_1} and #{var_2} are not the same")
end

Chương trình trên tạo ra kết quả sau:

Hello world and Hello elixir are not the same.

Khớp chuỗi

Chúng ta đã thấy việc sử dụng toán tử đối sánh chuỗi = ~. Để kiểm tra xem một chuỗi có khớp với một regex hay không, chúng ta cũng có thể sử dụng toán tử so khớp chuỗi hoặc String.match? chức năng. Ví dụ,

IO.puts(String.match?("foo", ~r/foo/))
IO.puts(String.match?("bar", ~r/foo/))

Chương trình trên tạo ra kết quả sau:

true 
false

Điều này cũng có thể đạt được bằng cách sử dụng toán tử = ~. Ví dụ,

IO.puts("foo" =~ ~r/foo/)

Chương trình trên tạo ra kết quả sau:

true

Hàm chuỗi

Elixir hỗ trợ một số lượng lớn các hàm liên quan đến chuỗi, một số hàm được sử dụng nhiều nhất được liệt kê trong bảng sau.

Sr.No. Chức năng và Mục đích của nó
1

at(string, position)

Trả về grapheme tại vị trí của chuỗi utf8 đã cho. Nếu vị trí lớn hơn độ dài chuỗi, thì nó trả về nil

2

capitalize(string)

Chuyển đổi ký tự đầu tiên trong chuỗi đã cho thành chữ hoa và phần còn lại thành chữ thường

3

contains?(string, contents)

Kiểm tra xem chuỗi có chứa bất kỳ nội dung đã cho nào không

4

downcase(string)

Chuyển đổi tất cả các ký tự trong chuỗi đã cho thành chữ thường

5

ends_with?(string, suffixes)

Trả về true nếu chuỗi kết thúc bằng bất kỳ hậu tố nào đã cho

6

first(string)

Trả về grapheme đầu tiên từ chuỗi utf8, nil nếu chuỗi trống

7

last(string)

Trả về grapheme cuối cùng từ chuỗi utf8, nil nếu chuỗi trống

số 8

replace(subject, pattern, replacement, options \\ [])

Trả về một chuỗi mới được tạo bằng cách thay thế các lần xuất hiện của mẫu trong chủ đề bằng thay thế

9

slice(string, start, len)

Trả về một chuỗi con bắt đầu từ điểm bắt đầu offset và có độ dài len

10

split(string)

Chia một chuỗi thành các chuỗi con tại mỗi lần xuất hiện khoảng trắng Unicode với khoảng trắng đầu và cuối bị bỏ qua. Các nhóm khoảng trắng được coi là một lần xuất hiện duy nhất. Sự phân chia không xảy ra trên khoảng trắng không đứt quãng

11

upcase(string)

Chuyển đổi tất cả các ký tự trong chuỗi đã cho thành chữ hoa

Binaries

Một nhị phân chỉ là một chuỗi các byte. Binaries được xác định bằng cách sử dụng<< >>. Ví dụ:

<< 0, 1, 2, 3 >>

Tất nhiên, những byte đó có thể được tổ chức theo bất kỳ cách nào, ngay cả trong một chuỗi không làm cho chúng trở thành một chuỗi hợp lệ. Ví dụ,

<< 239, 191, 191 >>

Các chuỗi cũng là các mã nhị phân. Và toán tử nối chuỗi<> thực sự là một toán tử nối nhị phân:

IO.puts(<< 0, 1 >> <> << 2, 3 >>)

Đoạn mã trên tạo ra kết quả sau:

<< 0, 1, 2, 3 >>

Lưu ý ký tự ł. Vì điều này được mã hóa utf-8, biểu diễn ký tự này chiếm 2 byte.

Vì mỗi số được biểu diễn trong hệ nhị phân có nghĩa là một byte, khi giá trị này tăng lên từ 255, nó sẽ bị cắt bớt. Để ngăn chặn điều này, chúng tôi sử dụng công cụ sửa đổi kích thước để chỉ định số lượng bit mà chúng tôi muốn lấy. Ví dụ -

IO.puts(<< 256 >>) # truncated, it'll print << 0 >>
IO.puts(<< 256 :: size(16) >>) #Takes 16 bits/2 bytes, will print << 1, 0 >>

Chương trình trên sẽ tạo ra kết quả sau:

<< 0 >>
<< 1, 0 >>

Chúng ta cũng có thể sử dụng công cụ sửa đổi utf8, nếu một ký tự là điểm mã thì nó sẽ được tạo trong đầu ra; khác các byte -

IO.puts(<< 256 :: utf8 >>)

Chương trình trên tạo ra kết quả sau:

Ā

Chúng tôi cũng có một chức năng được gọi là is_binarykiểm tra xem một biến đã cho có phải là một nhị phân hay không. Lưu ý rằng chỉ các biến được lưu trữ dưới dạng bội số của 8bit mới là mã nhị phân.

Chuỗi bit

Nếu chúng ta xác định một hệ nhị phân bằng cách sử dụng công cụ sửa đổi kích thước và chuyển cho nó một giá trị không phải là bội số của 8, chúng ta sẽ có một chuỗi bit thay vì một nhị phân. Ví dụ,

bs = << 1 :: size(1) >>
IO.puts(bs)
IO.puts(is_binary(bs))
IO.puts(is_bitstring(bs))

Chương trình trên tạo ra kết quả sau:

<< 1::size(1) >>
false
true

Điều này có nghĩa là biến bskhông phải là một nhị phân mà là một chuỗi bit. Chúng ta cũng có thể nói rằng nhị phân là một chuỗi bit trong đó số bit chia hết cho 8. So khớp mẫu hoạt động trên các mã nhị phân cũng như chuỗi bit theo cùng một cách.