06/04/2021, 14:47

Kiểu dữ liệu Boolean trong Ruby: True, False và Nil - Ruby căn bản

Để 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 ...

Để 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 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à TrueFalse. 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ị TrueFalse ở 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.

"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 đ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

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 PHPRuby 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
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à putsprint

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.

Tạ Quốc Bảo

23 chủ đề

7270 bài viết

0