Ruby – String

3.9/5 - (62 votes)

Trong phần này chúng ta sẽ tìm hiểu kỹ hơn về kiểu dữ liệu String.

String là một chuỗi các kí tự được bọc trong cặp dấu nháy đơn hoặc nháy kép.

puts 'Python'
puts "Ruby"

Trong ví dụ trên chúng ta sử dụng cả 2 loại dấu nháy để tạo string.

Python
Ruby

Nếu bạn muốn in ra cả ký tự dấu nháy thì có 2 cách:

puts "There are many stars" 
puts "He said, \"Which one is your favourite?\""

puts 'There are many stars'
puts 'He said, "Which one is your favourite?"'

Cách thứ nhất là đặt trước dấu nháy ký tự \ và Ruby sẽ in ra dấu nháy đó. Cách thứ 2 là trộn dấu nháy đơn với dấu nháy kép, chẳng hạn như chúng ta bọc string bằng cặp dấu nháy đơn và bên trong chúng ta cho in ra dấu nháy kép.

There are many stars.
He said, "Which one is your favourite?"

Ký tự thoát

Ký tự thoát là các ký tự đặc biệt dùng để điều khiển string chứ không được in ra màn hình.

puts "one\ntwo\nthree\nfour"
puts "bbb\raaa" 
puts "Joan\b\b\bane" 
puts "Towering\tinferno" 

Kí tự \n có nghĩa là xuống dòng, bất kì kí tự nào nằm sau \n đều được xuống dòng. Kí tự \r đưa dấu nháy trên màn hình về vị trí đầu dòng.  Kí tự \t cách một đoạn dài bằng một dấu tab giống như khi chúng ta gõ nút tab, kí tự \b xóa một kí tự đứng trước nó.

one
two
three
four
aabbb
Jane
Towering      inferno

Nếu muốn in ra cả ký tự \ thì chúng ta đưa vào là \\.

puts "Escape character \\"
Escape character \

Lấy từng phần tử của string

Chúng ta có thể lấy từng phần tử của string.

msg = "Ruby language"

puts msg["Ruby"]
puts msg["Python"]

puts msg[0]
puts msg[-1]

puts msg[0, 3]
puts msg[0..9]
puts msg[0, msg.length]

Để có thể lấy các phần tử của string thì chúng ta sử dụng cặp dấu ngoặc vuông [] vừa đưa vào bên trong đó chỉ số, khoảng hoặc một string khác.

puts msg["Ruby"]

Khi đưa vào một string bên trong cặp dấu [] thì Ruby sẽ tìm chuỗi đó trong chuỗi gốc, nếu tìm thấy thì in ra chuỗi, nếu không thì in ra chuỗi rỗng.

puts msg[0]

Nếu đưa vào một con số nào thì chúng ta được kí tự tại vị trí đó, chuỗi trong Ruby được đánh số từ 0.

puts msg[-1]

Ruby cũng hỗ trợ chỉ số âm, đưa vào số âm thì sẽ được kí tự từ cuối string.

puts msg[0, 3]

Khi đưa vào 2 chữ số cách nhau bởi dấu phẩy, ví dụ [i, n] thì chúng ta lấy được n kí tự từ vị trí i.

puts msg[0..9]

Chúng ta cũng có thể đưa vào một khoảng giá trị, [0..9] sẽ lấy về chuỗi kí tự từ vị trí 0 đến vị trí 9.

puts msg[0, msg.length]

Phương thức length trả về độ lớn của chuỗi nên dòng trên có nghĩa là lấy toàn bộ chuỗi.

Ruby

R
e
Rub
Ruby langu
Ruby language

Truyền biến vào string

Chúng ta có thể truyền giá trị của các biến khác vào string để hiển thị, biến được truyền vào có dạng #{<tên biến>}. Ví dụ:

#!/usr/bin/ruby

name = "Jane"
age = 17

puts "#{name} is #{age} years old"

Giá trị của biến nameage sẽ được hiển thị tương ứng.

Jane is 17 years old

Chúng ta cũng có thể thực hiện các biểu thức với các biến được truyền vào:

x = 5
y = 6

puts "#{x} x #{y} = #{x*y}"
5 x 6 = 30

Nối chuỗi

Nối chuỗi tức là tạo một chuỗi từ các chuỗi con.

lang = "Ruby" + " programming" + " languge"
puts lang

lang = "Python" " programming" " language"
puts lang

lang = "Perl" << " programming" << " language"
puts lang

lang = "Java".concat(" programming").concat(" language")
puts lang

Có rất nhiều cách để nối một chuỗi. Để nối một chuỗi thì chúng ta có thể dùng toán tử cộng +, viết 2 chuỗi đứng liền nhau, dùng toán tử <<,  hoặc dùng phương thức concat().

Ruby programming languge
Python programming language
Perl programming language
Java programming language

So sánh chuỗi

Ruby hỗ trợ một số toán tử và phương thức giúp so sánh chuỗi một cách dễ dàng.

puts "12" == "12"
puts "aa" == "ab"
puts "Ruby".eql? "Jan"

Chúng ta có thể so sánh chuỗi bằng toán tử == hoặc phương thức eql?. Kết quả trả về True nếu 2 chuỗi giống nhau và ngược lại.

true
false
false

Ngoài ra Ruby còn có toán tử <==> dùng để so sánh chuỗi, toán tử này không trả về True hay False mà trả về 1, 0, -1:

  • 1: chuỗi bên trái lớn hơn chuỗi bên phải
  • -1: chuỗi bên trái bé hơn chuỗi bên phải
  • 0: hai chuỗi bằng nhau

Chuỗi a được gọi là bé hơn chuỗi b nếu kí tự tương ứng của chuỗi a có thứ tự cao hơn kí tự tương ứng bên chuỗi b trong bảng mã ASCII. Ví dụ, khi so sánh "a" <==> "b" thì kí tự a nằm trước kí tự b trong bảng mã ASCII nên a sẽ lớn hơn b. Nếu 2 kí tự bằng nhau thì Ruby sẽ tiếp tục so sánh kí tự tiếp theo của 2 chuỗi cho đến hết.

puts "a" <==> "b"
puts "b" <==> "a"
puts "a" <==> "a"
-1
1
0

Các phương thức trong String

String cũng là một đối tượng trong Ruby do đó các đối tượng string có các phương thức hữu ích mà chúng ta có thể sử dụng.

Ví dụ 1:

word = "Methods"

puts "Size of #{word}: #{word.size}"

puts word.include? "tho"
puts word.include? "od"

puts

puts word.empty?
word.clear
puts word.empty?

Trong đoạn code trên chúng ta sử dụng 4 phương thức của đối tượng string.

puts "Size of #{word}: #{word.size}"

Phương thức size lấy số lượng kí tự có trong string.

puts word.include? "tho"

Đoạn code trên dùng phương thức include?, phương thức này cho biết chuỗi “tho” có nằm trong chuỗi “Methods” hay không.

puts word.empty?
word.clear

Phương thức empty? cho biết string có rỗng hay không, phương thức clear sẽ xóa toàn bộ string.

Size of Methods: 7
true
true

false
true

Ví dụ 2:

ruby = "Ruby"

puts ruby.upcase
puts ruby.downcase
puts ruby.capitalize
puts ruby.swapcase

Ruby có 4 phương thức để chuyển kí tự qua lại giữa chữ hoa với chữ thường. Phương thức upcase chuyển toàn bộ string thành in hoa. Phương thức downcase là chuyển thành chữ in thường. Phương thức capitalize viết hoa chữ cái đầu trong string, còn lại viết thường. Phương thức swapcase chuyển kí tự hoa thành thường và ngược lại.

RUBY
ruby
Ruby
rUBY

Ví dụ 3:

str1 = "ruby.com"
str2 = "python.com"

puts str1.start_with? "ruby"
puts str2.start_with? "ruby."

puts str1.end_with? ".com"
puts str2.end_with? ".com"

Trong ví dụ trên, phương thức start_with? cho biết chuỗi str1str2 có bắt đầu bằng chuỗi “ruby” hay không. Ngược lại, phương thức end_with? cho biết chuỗi có kết thúc bằng chuỗi “.com” hay không.

true
false
true
true

Ví dụ 4:

msg = "Ruby\nPython"

puts msg
puts msg.inspect

Phương thức inspect sẽ in các ký tự thoát ra luôn chứ không dùng để điều khiển chuỗi nữa.

Ruby
Python
"Ruby\nPython"

Định dạng chuỗi

Định dạng chuỗi là hiển thị chuỗi theo nhiều cách khác nhau bằng cách chèn các chuỗi đặc tả. Chuỗi đặc tả có kí tự bắt đầu là kí tự % được đặt bên trong cặp dấu nháy đơn hoặc nháy kép cùng với chuỗi gốc.

Chuỗi đặc tả có dạng sau đây:

%[cờ][độ lớn][độ chính xác]<tên đặc tả>

Trong đó cờ, độ lớnđộ chính xác là các tham số tùy chọn, không có cũng được. Tên đặc tả là kiểu hiển thị của dữ liệu. Chúng ta sẽ xem các ví dụ dưới đây.

Ví dụ 1:

puts "There are %d oranges in the basket." % 12
puts "There are %d oranges and %d apples in the basket." % [12, 10]
puts "Speed: %f km/h" % 62.1
puts "Name: %s" % "iPhone 5"

Khi chúng ta đặt %d bên trong chuỗi thì khi dịch Ruby sẽ hiểu là phải đưa một số nguyên vào vị trí đó thay thế cho chuỗi %d. Các tham số sẽ được đưa vào sau dấu % phía sau chuỗi. Ngoài ra chúng ta cũng có thể đưa vào nhiều tham số bằng cách đặt chúng trong cặp dấu [] và ngăn cách nhau bởi dấu phẩy.

Đặc tả %d hiển thị số nguyên, %f là số chấm động, %s là hiển thị một chuỗi.

There are 12 oranges in the basket.
There are 12 oranges and 10 apples in the basket.
Speed: 62.100000 km/h
Name: iPhone 5

Ví dụ 2:

puts "%d" % 300
puts "%x" % 300
puts "%o" % 300
puts "%b" % 300
puts "%e" % (5/3.0)

Kiểu số nguyên có thể được hiển thị trên nhiều hệ cơ số khác nhau. Chẳng hạn %d là hệ 10, %x là hệ 16, %o là hệ 8, %b là hệ nhị phân (hệ 2), %e là hiển thị theo kiểu số mũ.

300
12c
454
100101100
1.666667e+00

Tham số độ chính xác là một con số đứng giữa kí tự % và kí tự đặc tả, tham số này có nhiều ý nghĩa khác nhau với từng kiểu dữ liệu khác nhau.

Đối với số nguyên thì độ chính xác là số lượng chữ số được hiển thị, nếu giá trị không đủ thì Ruby sẽ tự động chèn thêm các chữ số 0 vào trước, mặc định thì tham số này là 1 tức là không chèn thêm vào.

Đối với số thực thì là số lượng chữ số được hiển thị nằm sau phần thập phân.

Đối với kiểu chuỗi thì độ chính xác có nghĩa là số lượng kí tự cần được hiển thị.

Ví dụ 3:

puts 'Height: %f %s' % [177.3, 'cm']
puts 'Height: %.1f %s' % [177.3, 'cm']

puts "%d" % 16
puts "%.5d" % 16

puts "%s" % "Ruby"
puts "%.5s" % "Python"

Trong ví dụ trên, %.1f tức là hiển thị 1 chữ số sau phần thập phân. Mặc định Ruby hiển thị 6 chữ số sau phần thập phân nên nếu không đủ thì Ruby sẽ tự động chèn thêm các số 0 vào trước.

Tương tự, mặc định Ruby hiển thị độ chính xác là 1 với số nguyên, nhưng nếu chúng ta thiết lập là %.5d thì Ruby sẽ tự chèn thêm các số 0 vào trước cho đủ 5 chữ số.

%.5s cũng giống 2 kiểu trên ở chỗ là sẽ chỉ cho phép hiển thị 5 chữ cái, nếu số lượng chữ cái quá nhiều thì các chữ cái sau cùng sẽ bị lược bỏ, nhưng nếu không đủ số lượng thì Ruby cũng chẳng chèn thêm kí tự nào vào.

Height: 177.300000 cm
Height: 177.3 cm
16
00016
Ruby
Pytho

Ví dụ 4: Tham số độ lớn quy định số lượng kí tự tối thiểu cần được hiển thị ra.

puts "%d" % 1
puts "%d" % 12
puts "%d" % 123
puts "%d" % 1234
puts "%d" % 12345

puts "%10d" % 1
puts "%10d" % 12
puts "%10d" % 123
puts "%10d" % 1234
puts "%10d" % 12345

Tham số độ lớn nằm trước dấu chấm trong chuỗi đặc tả. Nếu dữ liệu không đủ số lượng kí tự thì Ruby sẽ tự động chèn thêm các khoảng trống vào phía trước chuỗi, ngoài ra chúng ta cũng có thể ghi số âm và Ruby sẽ đưa các kí tự khoảng trống vào phía sau chuỗi.

1
12
123
1234
12345
         1
        12
       123
      1234
     12345

Tham số cờ quy định một số kiểu hiển thị khác mà chúng ta sẽ xem sau đây.

Ví dụ 5:

puts "%010d" % 1
puts "%010d" % 12
puts "%010d" % 123
puts "%010d" % 1234
puts "%010d" % 12345

puts "%-10d" % 1
puts "%-10d" % 12
puts "%-10d" % 123
puts "%-10d" % 1234
puts "%-10d" % 12345

Cờ 0 sẽ chèn thêm một số lượng số 0 vào trước số thay vì chèn khoảng trống. Cờ dấu trừ “-” sẽ canh lề trái các chữ số.

0000000001
0000000012
0000000123
0000001234
0000012345
1 
12 
123 
1234 
12345

Ngoài ra còn có các cờ khác như dấu *, +, #, b, d, u, x…. bạn có thể tìm hiểu thêm tại đây.

0 0 votes
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

1 Comment
Inline Feedbacks
View all comments
Trọng
Trọng
6 năm trước

Em xem lại giúp e phần So sánh chuỗi nha,
puts “a” “b” chứ a nhỉ 😉