- vừa được xem lúc

Instance variable và class variable - Instance variable và class instance variable trong Ruby

0 0 17

Người đăng: Nguyễn Xuân Tài

Theo Viblo Asia

Hello các bác, "nại nà iem đêy" 🤡

Chắc khi các bác học về Ruby cũng đã hiểu khái niệm class variable và instance variable rồi. Cách thức hoạt động của nó như thế nào, phạm vi hoạt động ra sao. Cơ mà trong instance variable lại chia ra thành 2 kiểu đó là class instance và object instance. Giờ thấy rối não chưa 🤡. Bài viết hôm nay của em sẽ giải thích về 3 loại variables ở trên, phạm vi hoạt động của nó như thế nào.

1. Instance variable

Instance variable được khai báo với syntax như sau @ + variable_name, chẳng hạn như @product. Instance variable chỉ hoạt động trong phạm vi object của nó. Các instance variables của object này độc lập với instance variables của object kia.

1.a Object instance variable

Object instance variable là instance variable được khai báo trong instance method. Nó có thể được hoạt động ở bất kì instance method nào của object đó.

class Product def initialize(name) @name = name end def name @name end def set_name(value) @name = value end
end product1 = Product.new("Audi")
product1.name # => Audi
product2 = Product.new("Mercedes")
product2.name # => Mercedes
product2.set_name("Honda")
product2.name # => Honda
product1.name # => Audi

Có thể thấy, dù product1product2 đều có instance là @name, nhưng 2 instances này là độc lập với nhau. Việc thay đổi @name của product2 không hề gây ảnh hưởng đến @name của @name của product1

1.b Class instance variable

Trong Ruby, một class thực chất cũng chỉ là một object của class Class. Và class instance variables cũng KHÔNG phải object instance variables. Các class instances chỉ hoạt động trong các class method. Vì thế, @name được khai báo trong instance method không phải là @name được khai báo trong class method.

class Product def initialize(name) @name = name end def name @name end def self.name @name end def self.set_name(value) @name = value end end object_product = Product.new("Audi")
object_product.name # => Audi
Product.name # => nil
Product.set_name("Liberty")
Product.name # => Liberty
object_product.name # => Audi 

Như ví dụ trên, dù @name đã được khai báo ở object_product nhưng khi gọi method Product.name thì kết quả trả về là nil. Vì dù nó có trùng tên biến, nhưng thực tế 2 instances này lại nằm trên 2 vùng nhớ khác nhau được quản lý bởi 2 object khác nhau.

2. Class variable

Class variable được khai báo với prefix @@. Ví dụ: @@class_variable, @@status. Nó có thể hoạt động trong toàn bộ phạm vi class mà nó được khai báo và cả các class kế thừa. Class variable được chia sẻ với tất cả object của class đó

 class Product @@name = "BWM" def self.name @@name end def self.set_name(value) @@name = value end def name @@name end def set_name(value) @@name = value end end Product.name # => BWM
object_product = Product.new
object.name # => BWM
Product.set_name("Yamaha")
Product.name # => Yamaha
object_product.name # => Yamaha
object_product.set_name("Honda")
Product.name # => Honda

Có một lưu ý: class variable hoạt động trong cả các class kế thừa. Nghĩa là các class con của Product cũng sẽ có thể sử dụng hoặc thay đổi giá trị của @@name được khai báo ở class Product. Vì thế hãy cân nhắc khi sử dụng kiểu variable này

Tổng kết

Hiểu được phạm vi hoạt động của các loại variable trong class một một điều rất quan trọng. Nó giúp chúng ta tránh được các bug gây ra do khó kiểm soát được phạm vi hoạt động của variable.

Cảm ơn các bác đã đọc hết bài viết của em, nếu các bác có ý kiến gì thì cứ nhiệt tình đóng góp để em cải thiện thêm nhé.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Bài toán tìm đường đi ngắn nhất với giải thuật Dijkstra

Với các bạn sinh viên chuyên ngành công nghệ thông tin, chắc không lạ gì với bài toán tìm đường đi ngắn nhất (Shortest Path Problems) trong đồ thị trọng số nữa. Ở bài viết lần này, mình sẽ làm 3 việc:.

0 0 135

- vừa được xem lúc

Tôi cá là bạn không biết những điều này - Ruby on rails ( Phần 2)

Các bạn có thể theo dõi phần 1 ở đây :. https://viblo.asia/p/toi-ca-la-ban-khong-biet-nhung-dieu-nay-ruby-on-rails-phan-1-WAyK8DDeKxX. 5.

0 0 222

- vừa được xem lúc

Những thay đổi trong ruby 3.0

. 2020 là một năm lớn đối với cộng đồng Ruby. Những người sáng lập Ruby có một món quà thực sự tuyệt vời cho chúng ta vào giáng sinh với việc phát hành Ruby 3.

0 0 47

- vừa được xem lúc

Có gì đặc biệt trong phiên bản Ruby 3x3 ?

Hello guys, chắc hẳn thời gian vừa rồi chúng ta cũng đã nghe qua thông tin Ruby sắp cho ra mắt Ruby version 3, hay còn được gọi là ruby 3x3, vậy liệu Ruby version 3 này có gì mới, và có những update nào đáng phải kể đến, và tại sao mọi người lại gọi nó là ruby version 3x3, thì trong bài ngày hôm nay

0 0 43

- vừa được xem lúc

Cách sử dụng class Time & Date trong Ruby (Phần 1)

Time là một class trong Ruby, nó sẽ giúp chỉnh sửa format, trích xuất thông tin một cách hiệu quả theo ý của bạn. . Topic hôm nay chúng ta có gì nào. .

0 0 97

- vừa được xem lúc

Ruby 3.0 có gì mới

Ruby 3.0.0 đã được ra mới được ra mắt vào tháng 12/2020, mục tiêu của bản 3.0.

0 0 41