+5

Bạn đã thực sự hiểu rõ Self trong ruby?

Trong chuyên mục Ruby và những người bạn lần này, chúng ta cùng làm quen với một người rất nổi tiếng, có mặt trong nhiều ngôn ngữ, đó chính là self. Self là một biến rất quen thuộc, có mặt trong rất nhiều, rất nhiều ngôn ngữ, thân thuộc với các developer, nhưng không phải ai cũng hiểu rõ về nó. Vậy self trong ruby là gì? Bản chất của nó là như thế nào? Hãy cùng nhau phân tích và hiểu rõ hơn về người bạn self qua các ví dụ dưới đây

Self là gì?

Trong ruby, mọi thử đều là object. Các object cung cấp ngữ cảnh thực thi cho code.Bản chất của việc gọi một method chính là việc gửi message giữa object gửi (the sender)và object nhận (the receiver). Và object hiện tại chính là default receiver. Khi mà receiver không được định nghĩa, message sẽ được gửi đến default receiver. Đó chính là Self

Self ở Top Level

Chúng ta thử kiêmr tra sem self trông như thế nào tại top level

puts self

kết quả:

main

Điều này nói rằng Ruby đã tạo ra một object được gọi là main tại top level. Và tất cả code chúng ta viết tại top level sẽ sử dụng main như là người nhận của các method gọi đến.

Vậy main là gì nhỉ? Nếu main là một object, nó phải là một thể hiện của một class nào đó. Chúng ta sẽ kiểm tra sẽ main là thể hiện của class nào nhé

puts	self.class

Kết quả:

Object

Ồ, vậy thì Ruby hiểu điều này như là

main = Object.new

Main có phải là một Receiver Object?

Main tồn tại trên top level, Liệu rằng ta có thể sử dụng main như một object, gọi đến method puts?

main.puts	'hi'

Chúng ta có một kết quả:

NameError: undefined local variable or method	
‘main’ for main:Object

Ruby tạo ra main là một current object ở top level, Nhưng không có một biến nào được gọi là main

main chính là sự thể hiện của self tại top level

Tính "động" của self

Hãy cùng nhau xem các ví dụ dưới đây:

Ví dụ 1:

Kết quả:

Ví dụ 2:

Kết qủa:

Ở toplevel, self là main, nhưng khi thực thi method drive, self lại là object car.

Vậy khi nào SELF thay đổi?

Self tại Top level

Self trong Class

Self trong Module

Tóm lại self sẽ thay đổi tùy theo bổi cảnh mà ta đang sử dụng Còn khi self ở trong một method thì sao nhỉ?

Sau khi nghiên cứu qua một loạt các ví dụ, ta có thể tổng kết lại giá trị của Self trong các trường hợp như sau:

Vị trí của Self Giá trị
Top Level Main
Bên trong Class Class Name
Bên trong Module Module Name
Bên trong method của một Class object thể hiện của Class đó
Bên trong method của một Module object thể hiện của Class mà module mixes
Bên trong một method của Module Class Name của Class đã extends module
Bên trong một class method của module Module Name
Bên trong một class method của một Class Class Name

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí