Daily Archives: 27/04/2016

Ruby – Biểu thức

Biểu thức bao gồm toán tử và toán hạng. Toán tử là một kí tự đặc biệt thực hiện các phép tính toán trên các toán hạng và trả về một giá trị nào đó. Hầu hết các toán tử trong lập trình đều bắt nguồn từ toán học. Các toán tử khác nhau có các mức độ ưu tiên khác nhau. Toán hạng là các tham số đầu vào cho toán tử, trong lập trình thì toán hạng chính là các biến hoặc các giá trị.

Đây là bảng danh sách các toán tử của Ruby:

Tên Kí hiệu
Lấy thuộc tính, phương thức :: .
Thao tác mảng [ ] [ ]=
Lấy lũy thừa **
Toán tử phủ định, đảo bit, tăng, giảm ! ~ + -
Toán tử nhân, chia, chia lấy phần dư * / %
Toán tử cộng, trừ + -
Toán tử dịch bit << >>
Toán tử thao tác bit AND &
Toán tử thao tác bit OR ^ |
Toán tử so sánh hơn kém > >= < <=
Toán tử so sánh bằng <=> == === != =~ !~
Toán tử logic AND &&
Toán tử logic OR ||
Toán tử tạo phạm vi .. ...
Toán tử điều kiện ?:
Toán tử gán = += -= *= **= /= %= &= |= ^= <<= >>= ||= &&=
Phủ định not
Toán tử logic OR, AND or and

Các toán tử trong cùng một dòng có độ ưu tiên như nhau. Các toán tử ở các hàng trên có độ ưu tiên cao hơn các hàng dưới. Các toán tử có thể làm việc với một, hai hoặc ba toán hạng. Tùy vào từng trường hợp mà Ruby sẽ chọn toán tử nào để dùng vì có một số toán tử có kí hiệu giống nhau nhưng có ý nghĩa khác nhau.

Dấu của số

Chúng ta có 2 toán tử thay đổi dấu của số là +-. Ví dụ:

puts +2
puts -2

Dấu cộng chỉ định số đó là số nguyên dương, dấu trừ là số nguyên âm, nhưng cũng giống như trong toán hocj, dấu + có thể bỏ.

a = 1

puts a
puts -(a)
puts -(-(a))

Cũng giống như toán học, 2 dấu trừ sẽ chuyển thành dấu cộng.

1
-1
1

Toán tử gán

Toán tử gán sẽ gán giá trị cho biến, như chúng ta đã biết biến có nhiệm vụ lưu trữ giá trị. Toán hạng nằm phía bên phải sẽ được gán cho toán hạng nằm bên trái.

x = 1
puts x 

Chúng ta gán biến x có giá trị 1.

x = x + 1
puts x # prints 2

Trong lập trình toán hạng cũng có thể là một phép toán khác, trong ví dụ trên biến x được gán giá trị là x + 1.

1 = x; # Error

Chúng ta không thể gán một biến vào một giá trị, như thế là không hợp lệ, dòng code trên sẽ báo lỗi.

Toán tử lấy thuộc tính, phương thức

Đây là các toán tử có mức độ ưu tiên cao nhất, tức là trong một biểu thức thì chúng sẽ được thực hiện đầu tiên.

Toán tử :: có ý nghĩa là lấy hằng số, module hoặc một lớp được định nghĩa bên trong một lớp khác:

class MyMath
    Pi = 3.1415926535    
end

module People
    Name = "People"
end 

puts MyMath::Pi
puts People::Name

Trong đoạn code trên chúng ta có một lớp và một module, để lấy hằng số từ một lớp (hoặc module) thì chúng ta ghi tên lớp, sau đó là dấu :: rồi tên hằng, như thế các hằng số có tên giống nhau nhưng được đặt trong các lớp khác nhau sẽ không bị xung đột.

3.1415926535
People

Toán tử . truy xuất thuộc tính và phương thức của một đối tượng:

class Person
    
   def initialize name, age
       @name = name
       @age = age       
   end
   
   def info
       "#{@name} is #{@age} years old"
   end
    
end

p = Person.new "Jane", 17
puts p.info

Trong ví dụ trên chúng ta định nghĩa lớp Person có 2 phương thức do chúng ta định nghĩa. Chúng ta sử dụng toán tử . để truy xuất 2 phương thức này.

p = Person.new "Jane", 17
puts p.info

Chúng ta gọi phương thức new và phương thức info, phương thức new sẽ gọi đến phương thức initialize mà chúng ta đã viết, phương thức info sẽ trả về một chuỗi.

Jane is 17 years old

Toán tử toán học

Bao gồm các toán tử sau đây.

Kí hiệu Tên
+ Cộng
- Trừ
* Nhân
/ Chia
% Chia lấy phần dư
** Lũy thừa

Ví dụ:

a = 1
b = 2
c = 3

puts a + b + c
puts c - a
puts a * b
puts c / 3
puts c % a
puts c ** a

Các toán tử toán học giống y hệt như các phép toán trong toán học vậy.

puts c % a

Toán tử % chia hai số rồi lấy phần dư, ví dụ 9 chia 4 được 2 dư 1 thì toán tử này trả về 1.

6
2
2
1
0
3

Ví dụ 2:

puts 5 / 2

puts 5 / 2.0
puts 5.0 / 2
puts 5.to_f / 2

Trong ví dụ này chúng ta thực hiện phép chia trên số nguyên và số thực.

puts 5 / 2

Khi chúng ta thực hiện phép chia 2 số nguyên thì kết quả trả về là số nguyên.

puts 5 / 2.0
puts 5.0 / 2
puts 5.to_f / 2

Nếu một trong 2 toán hạng là số thực thì kết quả trả về là một số thực, ngoài ra chúng ta có thể dùng phương thức to_f để chuyển một số nguyên thành một số thực.

2
2.5
2.5
2.5

Ví dụ 3:

puts 5.div 2.0
puts 5.fdiv 2
puts 5.quo 2
puts 5.0.quo 2.0

Ngoài toán tử / thì chúng ta còn có các phương thức div, fdivquo cũng thực hiện phép chia.

puts 5.div 2.0

Phương thức div thực hiện phép chia số nguyên và trả về số nguyên cho dù toán hạng có là số thực.

puts 5.fdiv 2

Phương thức fdiv thì lại trả về số thực mặc dù toán hạng có là số nguyên.

puts 5.quo 2
puts 5.0.quo 2.0

Phương thức quo sẽ thực hiện phép chia và trả về số hữu tỉ dưới dạng phân số nếu các toán hạng là số nguyên, nếu một trong hai toán hạng là số thực thì trả về số thực.

2
2.5
5/2
2.5

Toán tử logic

Ruby có các toán tử logic sau:

Kí hiệu Tên
&& AND
|| OR
! negation

Toán tử logic sẽ trả kết quả về là một đối tượng boolean, tức là chỉ có true hoặc false. Ngoài 3 toán tử &&, ||! thì còn có 3 toán tử có tác dụng tương tự nhưng độ ưu tiên thấp hơn là and, ornot.

Ngoài ra các toán tử so sánh hay quan hệ cũng trả về một giá trị boolean:

x = 1
y = 2

puts x == y
puts y > x

if y > x then
    puts "y is greater than x"
end

Trong đoạn code trên chúng ta sử dụng toán tử so sánh == và toán tử quan hệ >.

puts x == y
puts y > x

Cả 2 dòng trên sẽ trả về kết quả là một giá trị boolean.

if y > x then
    puts "y is greater than x"
end

Các toán tử quan hệ thường được dùng trong câu lệnh điều kiện if, trong đoạn code trên phương thức puts sẽ được thực thi nếu biểu thức trong if trả về true.

Ví dụ 1:

puts true && true
puts true && false
puts false && true
puts false && false

Toán tử && trả về true nếu cả 2 toán hạng đều có giá trị là true.

true
false
false
false

Ví dụ 2:

puts true || true
puts true || false
puts false || true
puts false || false

Toán tử || trả về true nếu một trong 2 toán hạng là true, ngược lại trả về false.

true
true
true
false

Ví dụ 3:

puts !0
puts !1
puts !true
puts !false

puts ! (4<3)
puts ! "Ruby".include?("a")

Toán tử ! sẽ đảo ngược giá trị true thành false và ngược lại.

false
false
false
true
true
true

Khi Ruby thực hiện toán tử ||&& thì các toán hạng sẽ lần lượt được đánh giá, nếu toán hạng đầu tiên đủ điều kiện để đưa ra kết quả thì dừng lại chứ không xem xét tới các toán hạng phía sau nữa. Ví dụ trong biểu thức true || false thì Ruby chỉ cần nhìn thấy toán hạng đầu tiên là true thì sẽ trả về true luôn chứ không xem xét toán hạng thứ hai là true hay false.

Toán tử so sánh

Đây là các toán tử so sánh lớn hơn, bé hơn:

Kí hiệu tên
< bé hơn
<= bé hơn hoặc bằng
> lớn hơn
>= lớn hơn hoặc bằng

Ví dụ:

p 1 < 2 p 2 > 3
p 3 >= 3

Trong đoạn code trên, phép toán 1 < 2 trả về true, phép toán 2 > 3 trả về false. Phép toán 3 >= 3 trả về true.

Toán tử thao tác bit

Con người chúng ta thường làm việc với hệ cơ số 10 vì mặc nhiên chúng ta có 10 ngón tay, 10 ngón chân nên rất dễ tính toán, máy tính thì lại không như vậy, máy tính chỉ hiểu được hệ cơ số 2 – tức hệ nhị phân. Bạn cần nắm rõ cách hoạt động của các phép toán thao tác trên bit trước khi đi vào tìm hiểu thêm vì ở đây mình sẽ chỉ giải thích sơ lược qua các ví dụ.

Trong Ruby có các toán tử thao tác bit sau:

Kí hiệu ý nghĩa
~ Đảo ngược bit
^ Phép XOR
& Phép AND
| Phép OR
<< Dịch trái 1 bit
>> Dịch phải 1 bit

Thường thì chúng ta cũng ít khi dùng các toán tử này.

Ví dụ:

puts ~ 7   # prints -8 
puts ~ -8  # prints 7

puts 6 & 3  # prints 2
puts 3 & 6  # prints 2

puts 6 ^ 3  # prints 5
puts 3 ^ 6  # prints 5

puts 6 | 3  # prints 7
puts 3 | 6  # prints 7

puts 6 << 1  # prints 12
puts 1 << 6 # prints 64 puts 6 >> 1  # prints 3
puts 1 >> 6  # prints 0

Phép đảo ngược bit ~ sẽ chuyển tất cả các bit từ 0 sang 1 và ngược lại. Trong ví dụ này, 7 trong hệ 10 là 0111 trong hệ 2,  đảo ngược lại sẽ là 1000, mặc định Ruby làm việc với số nguyên có dấu, mà bit đầu tiên là bit xác định có dấu hay không nên 1000 trong hệ 2 sẽ là -8 trong hệ 10.

puts ~ 7   # prints -8 
puts ~ -8  # prints 7

Toán tử & sẽ thực hiện phép AND 2 số, trong đó nếu có cả 2 bit đều là 1 thì kết quả là 1, ngược lại là 0. Trong ví dụ này 6 & 30110 & 0011 = 0010, tức là số 2 trong hệ 10.

puts 6 & 3  # prints 2
puts 3 & 6  # prints 2

Toán tử ^ thực hiện phép XOR, nếu 2 bit giống nhau thì kết quả là 0, khác nhau thì là 1. Trong ví dụ này 6 ^ 3 tương đương 0110 ^ 0011 = 0101 là 5 trong hệ 10.

puts 6 ^ 3  # prints 5
puts 3 ^ 6  # prints 5

Toán tử | thực hiện phép OR, nếu một trong 2 bit là 1 thì kết quả là 1, ngược lại nếu cả 2 bit là 0 thì kết quả là 0. Ở đây 6 | 3 tương đương 0110 | 0011 = 0111 là 7 trong hệ 10.

puts 6 | 3  # prints 7
puts 3 | 6  # prints 7

Toán tử << dịch 1 bit sang trái, toán tử >> dịch 1 bit sang phải, ví dụ 6 << 1 tức là dịch 0110 sang 1 bit, thành 1100 tức 12 trong hệ 10, nếu tiếp tục dịch 12 << 1 thì được 11000 tức là 24 trong hệ 10. Nghĩa là phép dịch bit trái sẽ nhân số đó lên 2 lần. Tương tự phép dịch bit phải chia số đó cho 2.

puts 6 << 1  # 12
puts 1 << 6 # 64 puts 6 >> 1  # 3
puts 1 >> 6  # 0

Toán tử hợp

Toán tử hợp ở đây nghĩa là gộp các toán tử với toán tử gán = để thực hiện tính toán và gán giá trị luôn.

Ví dụ:

a = 0

a = a + 1
a += 1
puts a


b = 0

b = b - 8
b -= 8
puts b

Toán tử += có nghĩa là cộng rồi gán, chẳng hạn a += 1 tức là a + 1 rồi gán vào biến a, phép toán này tương đương với a = a + 1.

Đây là các toán tử hợp có trong Ruby:

-=   *=  **=  /=   %=   &=   |=   <<= >>= 

Mức độ ưu tiên của các toán tử

Mức độ ưu tiên toán tử cho biết trong một biểu thức thì toán tử nào sẽ được thực hiện trước.

3 + 5 * 5  # Result: 28

Ví dụ như trong biểu thức gồm có phép nhân và phép cộng thì phép nhân được thực hiện trước và phép cộng được thực hiện sau.

(3 + 5) * 5  # Result: 40

Để tăng độ ưu tiên thì chúng ta bọc biểu thức trong cặp dấu ngoặc tròn ()Các biểu thức trong cặp dấu ngoặc tròn sẽ được thực thi trước.

9 / 3 * 3   # Result: 9

Các toán tử có độ ưu tiên bằng nhau sẽ được thực hiện từ trái sang phải, giống hoàn toàn với toán học.

Toán tử phạm vi

Ruby có 2 toán tử phạm vi, dùng để tạo các đối tượng thuộc dạng danh sách trong một phạm vi nào đó, thường là phạm vi số hoặc kí tự.

p (1..3).to_a
p (1...3).to_a

p ('a' .. 'l').to_a

Toán tử i..j tạo danh sách các phần tử từ i tới j, bao gồm cả j, toán tử i...j tạo danh sách các phần tử từ i tới j nhưng không bao gồm j, tức là từ i tới j-1.

p ('a' .. 'l').to_a

Chúng ta có thể đưa vào dãy số hoặc dãy kí tự. Phương thức to_a sẽ chuyển danh sách này về kiểu mảng.

[1, 2, 3]
[1, 2]
["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"]

Toán tử điều kiện

Toán tử này trả về một trong 2 biểu thức tùy thuộc vào giá trị biểu thức điều kiện mà chúng ta đề ra. Cú pháp:

biểu thức điều kiện ? biểu thức 1 : biểu thức 2

Có pháp trên có nghĩa là nếu biểu thức điều kiệntrue thì thực hiện biểu thức 1, nếu false thì thực hiện biểu thức 2. Ví dụ:

age = 32

adult = age >= 18 ? true : false

if adult then
    puts "Adult"
else
    puts "Not adult"
end

Trong ví dụ trên chúng ta in ra các string khác nhau tùy vào giá trị của biến adult.

adult = age >= 18 ? true : false

Biến adult sẽ có giá trị là true nếu biến age lớn hơn 18, ngược lại adultfalse.

Adult

Ruby – String

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.