Kiểu dữ liệu Boolean trong Ruby: True, False và Nil
Để tiếp tục với chuỗi bài tìm hiểu các kiểu dữ liệu trong Ruby thì trong bài viết lần này mình xin phép giới thiệu cho các bạn về kiểu Boolean và Nil Object trong Ruby.
Boolean là kiểu dữ liệu rất quan trọng, nó được dùng rất nhiều trong những lệnh kiểm tra điều kiện như if else, vì vậy bạn phải hiểu và phân biệt được khái niệm cũng như cách sử dụng nó trong Ruby nhé.
1. Boolean trong Ruby
Boolean là kiểu dữ liệu logic, tồn tại hai giá trị duy nhất đó là True và False. Nếu bạn từng làm việc với các ngôn ngữ khác thì sẽ không còn quá xa lạ nữa.
Có một lưu ý khi sử dụng kiểu Boolean đó là không được để các giá trị True và False ở trong dấu ngoặc kép hay là dấu ngoặc đơn, vì nếu chúng ta viết như thế thì kiểu dữ liệu của nó sẽ là kiểu String chứ không phải Boolean.
Bài viết này được đăng tại [free tuts .net]
"true".class => String 'true'.class => String
Mình có một ví dụng đơn giản về kiểu dữ liệu Boolean này
bool = [true, false].sample if bool puts "Return value true" else puts "Return value false" end
Như ví dụ ở trên thì bước đầu tiên mình khởi tạo một biết bool với giá trị ngẫu nhiên là True hoặc False. Ở đây mình sử dụng hàm sample trong Ruby, đây là hàm sẽ giúp chúng ta lấy một giá trị ngẫu nhiên từ trong một mảng cho trước.
Sau đó mình check điều kiện nếu bool có giá trị là true thì sẽ nhảy và if và sai thì vào else.
Lưu ý:
Có một lưu ý đối với các bạn mới tiếp xúc với ngôn ngữ lập trình Ruby thì chúng ta không cần dấu đóng mở ngoặc ở những câu điều kiện, các hàm... và cũng không cần dấu chấm phẩy ở cuối như các ngôn ngữ khác vẫn thường làm. Ruby giúp chúng ta ngắn gọn code nhất có thể. Tất nhiên là nếu bạn sử dụng dấu ngoặc đơn hay dấu chấm phẩy thì code của bạn sẽ vẫn chạy. Nhưng thường thường mình thấy khi code Ruby người ta sẽ không sử dụng dấu ngoặc đơn cũng như dấu chấm phẩy.
Đối với việc không sử dụng dấu chấm phẩy cuối đoạn cũng sẽ hạn chế tối đa những lỗi không mong muốn nếu như chúng ta lỡ quên.
Có một điều đặc biệt đối với kiểu dữ liệu Boolean là chúng ta sẽ không có Boolean class như Integer class, String class... Thay vào đó chúng ta có 2 boolean objects chính là True và False.
Trong đó
- True là đối tượng của TrueClass
- False là đối tượng của FalseClass
Để kiểm tra thuộc class nào các bạn cứ auto gõ .class là được
true.class => TrueClass false.class => FalseClass
Hai class này đều là thuộc Object class chứ không phải cùng thuộc một class Boolean chung như Fixnum và Bignum của class Integer.
TrueClass.ancestors # => [TrueClass, Object, Kernel, BasicObject] FalseClass.ancestors # => [FalseClass, Object, Kernel, BasicObject]
Lý do mà tại sao tác giả của ngôn ngữ Ruby lại tách ra thành 2 class riêng biệt thì có thể hiểu một cách đơn giản nhất đó là 2 object này không cùng chung mục đích. Thì mình có 2 đoạn code như thế này về TrueClass và FalseClass
class TrueClass def &(other) other end def |(_) self end def ^(other) !other end def to_s 'true' end end
và
class FalseClass def &(_) self end def |(other) other end def ^(other) other end def to_s 'false' end end
Như chúng ta thấy ở 2 đoạn code trên dễ dàng thấy được 2 class này định nghĩa các toán tử của nó như &, |, ^ hay to_s được định nghĩa với những mục đích hoàn toàn khác nhau nên việc viết tách chúng ta thành 2 object của 2 class khác nhau là hoàn toàn dễ hiểu.
2. Nil Object trong Ruby
Khi làm việc với những ngôn ngữ lập trình khác, ắt hẳn nhiều người sẽ biết đến giá trị NULL , thế nhưng trong ngôn ngữ lập trình Ruby thì khái niệm này được gọi là nil. Nil là đối tượng để miêu tả sự không có, hay là không tồn tại của một biến ví dụ như
- Khi một biến không có giá trị
- Gọi đến phần tử không tồn tại trong mảng
- Gọi đến phần tử không tồn tại trong hashes
Nil là một đối tượng thuộc class NilClass.
nil.class => NilClass
Để so sánh cách sử dụng nil với NULL mình sẽ so sánh giữ code PHP và Ruby cho các bạn nhé
Đối với PHP
if ($item == null) { echo "Item null" } else { echo "Item not null" }
Đối với Ruby
if item.nil? puts "nil" else puts "not nil" end
Thay vì chúng ta kiểm tra một giá trị có bằng NULL bằng cách sử dụng toán tử ==, thì ở Ruby để kiểm tra xem 1 giá trị có nil không chúng ta sẽ sử dụng nil? để kiểm tra giá trị của biến đó có tồn tại hay không.
a = [1,2,3,4] => [1, 2, 3, 4] a[5].nil? // do a[5] không hề tồn tại nên khi kiểm tra giá trị có phải là nil hay không kết quả sẽ là true => true b = 1 // b tồn tại giá trị 1 nên khi kiểm tra nil sẽ trả về false => 1 b.nil? => false
Chúng ta có thể gọi nil? trên bất cứ đối tượng nào, kể cả gọi tới chính đối tượng nil
nil.nil? => true
Một vài tình huống đặc biệt mà kết quả trả về nil
Khi chúng ta gọi một biến instance mà chưa gán giá trị cho nó, mặc định kết quả trả về nil. Nếu chúng ta làm tương tự với biến local hay biến class sẽ lỗi ngay nhé chứ không phải trả về nil đâu :D
@x => nil v => Traceback (most recent call last): 4: from /home/quangphu/.rbenv/versions/2.6.5/bin/irb:23:in `<main>' 3: from /home/quangphu/.rbenv/versions/2.6.5/bin/irb:23:in `load' 2: from /home/quangphu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>' 1: from (irb):34 NameError (undefined local variable or method `v' for main:Object)
Và 2 method giá trị cũng trả về nil nữa là puts và print
irb(main):035:0> puts "hello" hello => nil irb(main):036:0> print "hello" hello=> nil
Truthiness
Trong Ruby, ngoài false mang gía trị false giá thì còn nil cũng mang gía trị false, còn lại tất cả đều mang giá trị true kể cả số 0.
if nil p "nil" else p "not nil" end => "not nil"
0 cũng mang giá trị true
if 0 puts 123 end 123 => nil
Như đoạn code trên thì nếu 0 là true thì in ra 123.
3. Kết luận
Vậy trong bài này mình đã giới thiệu được tới các bạn kiểu dữ liệu Boolean và Nil Object trong Ruby. Đây sẽ là 1 trong những kiến thức nền tảng của Ruby để sau này chúng ta có thể làm việc được với ngôn ngữ này.