Self trong Ruby(p1)

Chào các bạn, hôm nay mình xin phép chia sẻ một số kiến thức của bản thân mình về self trong ruby. Đầu tiên để hiểu self là gì chúng ta sẽ cùng tìm hiểu về SenderReceiver trong Ruby nhé.

1. Receiver

  • Receiver là 1 đối tượng nhận Message để thực thi method. Trong các ngôn ngữ lập trình hướng đối tượng, mọi thứ đều được thực hiện bởi việc gửi Message đến 1 đối tượng. Nghe có vẻ hơi trừu tượng và khó hiểu đúng không, mình có 1 ví dụ nho nhỏ giúp các bạn dễ hiểu và dễ hình dung hơn về Receiver sau đây.
  • Như các bạn có thể thấy ở trên, Receiver của chúng ta là số 3. Method times đã được gửi đến Receiver là số 3 thông qua dấu chấm, đó cũng chính là cách gửi Message thông dụng nhất trong ruby. Và chúng ta có kết quả như này.
  • Tiếp theo chúng ta sẽ cùng tìm hiểu Sender là gì nhé.

2. Sender

  • Hiểu đơn giản Receiver là đối tượng nhận Message thì Sender chính là đối tượng gửi Message đó đến cho Receiver. Theo như bản thân mình thì Sender chính là môi trường mà đoạn code được chạy, hơi khó hiểu đúng không hãy cùng xem thử ví dụ nhé. Như trong ví dụ ở trên mình đã chỉ ra ReceiverMessage nhưng lại không hề có Sender, thực ra Sender vẫn tồn tại, chỉ là nó bị ẩn đi mà thôi vì trong OOP phải luôn có 1 Sender gửi 1 Message đến Receiver. Vậy Sender trong trường hợp này là gì, hãy cùng xem nhé.
  • Đầu tiên chúng ta hãy cùng sửa lại đoạn code trên như này, và đây là cái chúng ta có.
  • Self chính là Sender trong trường hợp này, và nó trỏ đến main, vậy main chính là Sender. Có lẽ 1 số bạn thắc mắc main từ đâu ra, mình có khai báo main đâu mà lại có nó, thực ra main do tự chính bản thân Ruby sinh ra, nó chính là 1 instance của class Object và là default SenderTop Level.Chúng ta có thể kiểm tra cái này như sau
  • Vậy nếu chúng ta gọi thẳng đến main thay vì gọi self thì sẽ như thế nào
  • Lỗi rồi, tại sao lại vậy nhỉ? Ruby đã tạo ra default Sender tên là main nhưng thực sự thì không hề có 1 biến nào tên là main cả, nghe hơi vô lí đúng không nhưng đời là thế mà 😃) Chúng ta chỉ có thể truy cập đến main thông qua từ khóa self mà thôi.
  • Vậy là chúng ta đã biết Sender có thể bị ẩn đi và không thấy rõ ràng được, nhưng có cách để bạn có thể tìm ra được Sender, hãy luôn hỏi 2 câu hỏi sau:
    • Message hay chính là method đó có nguồn gốc từ đâu ra
    • Đối tượng nào sở hữu scope khi chương trình đang chạy hay chính là môi trường mà đoạn code được chạy ở đâu
  • Khi trả lời được 2 câu hỏi trên bạn sẽ xác định được Sender là gì.

3. Tổng kết

  • Mình đã giới thiệu với các bạn 1 chút kiến thức cơ bản về ReceiverSender trong Ruby, phần tiếp theo chúng ta sẽ cùng thảo luận tiếp về self, Cảm ơn mọi người đã đọc.
  • Bài viết có tham khảo từ cuốn sách Ruby Basic của tác giả Bala Paranj