Modules, Classes, and Objects trong ruby
Bài đăng này đã không được cập nhật trong 8 năm
Trong chủ đề lần này, tôi sẽ đề cập đến các bạn vấn đề không hề mới, nhưng có tính nền tảng cơ bản và rất quan trọng. Làm thế nào để phân biệt được các khái niệm Modules
Classes
Objects
trong ruby?
Điều đầu tiên tôi muốn nhắc lại ở đây là Ruby
là object-oriented programming language
. Điều đó có nghĩa là một khởi tạo trong Ruby
được gọi là class, điều đó cho phép bạn cấu trúc chương trình của mình một cách riêng biệt. Sử dụng Class, bạn có thể thêm tính nhất quán cho chương trình của bạn. Và bạn có thể sử dụng để xây dựng một cách minh bạch. Ít nhất, đó là theo lý thuyết.
Và bây giờ, tôi sẽ chia sẻ với các bạn về ngôn ngữ hướng đối tượng của classes, and objects sử dụng những gì bạn đã biết về hashes và modules.
Modules
như là hashes
Bạn biết làm thế nào để tạo mới và sử dụng một hash, và đó là cách để map đến một thứ khác. Điều đó có nghĩa là nếu bạn có 1 hash với key là apple
và bạn muốn get giá trị của nó.
mystuff = {'apple' => "I AM APPLES!"}`
puts mystuff['apple']
Vẫn giữ tư tưởng get X from Y
chúng ta sẽ liên tưởng đến modules cũng có cơ chế tương tự.
Những điều cần nhớ về modules:
-
Các hàm trong ruby thường được đặt bên trong một block
module .. end
. -
Bạn import file đó
-
Bạn có thể truy cập vào các functions hoặc các biến trong modules bằng dấu
.
(dot).
Tiếp theo, tưởng tượng bạn đang có một module và đặt tên là mystuff.rb
và một hàm apple
:
module MyStuff
def MyStuff.apple()
puts "I AM APPLES!"
end
end
Để dùng lại module trên, chúng ta có thể require
module trên và truy cập đến hàm apple
:
require "./mystuff.rb"
MyStuff.apple()
Chúng ta cũng có thể put vào một biến, đặt tên là tangerine
:
module MyStuff
def MyStuff.apple()
puts "I AM APPLES!"
end
TANGERINE = "Living reflection of a dream"
end
Chúng ta cũng có thể truy cập đến module trên bằng cách:
require "./mystuff.rb"
MyStuff.apple()
puts MyStuff::TANGERINE
Chúng ta có một đặc điểm rất chung về ruby:
- Lấy một cặp key = value là một kiểu đóng gói
- Lấy giá trị thông qua key's name.
Trong trường hợp của hash, cú pháp là [key]
, còn trong trường hợp của module là .key
. Còn những thứ khác đều gần như giống nhau.
Classes
lại giống nhưModules
Bạn có thể tưởng tượng, Modules
như một dạng đặc biệt của Hash
, bạn có thể lưu trữ và truy cập thông qua .
Ruby cũng cung cấp một kiểu cấu trúc khác cũng phục vụ các mục đích tương tự, gọi là class
.
Một class là cách để nhóm các functions và data và được đóng gói mà bạn cũng có thể truy cập đến thông qua hành động .
Chúng ta tạo ra một class cũng giống như mystuff
module.
class MyStuff
def initialize()
@tangerine = "And now a thousand years between"
end
attr_reader :tangerine
def apple()
puts "I AM CLASSY APPLES!"
end
end
Nhìn qua có vẻ phức tạp hơn cách thức hoạt động của module. Tuy nhiên, bạn nên hiểu, làm thế nào một "mini-module" với MyStuff
lại có thể có function apple
được khởi tạo như thế. Điều đó có thể làm bạn bối rối, bởi hàm initialize
và sử dụng @tangerine
để settings biến instance tangerine
.
Phép khởi tạo này chính là điểm khác nhau giữa Class và Module.
Tôi sẽ giải thích vì sao ở đây lại dùng class
thay vì dùng module
. Đó là vì bạn có thể lấy class MyStuff
và sử dụng chúng cho rất nhiều thứ, nhưng mà với con số hàng triệu trong một khoảng thời gian, điều đó cũng không gây trở ngại đến mỗi phần tử khác. Khi bạn thực hiện import một module thì chỉ có một phần tử chương trình, tức là không có phép toán tạo mới nếu bạn không thực hiện phép hack nào khác =))
- Object lại giống như
require
.
Nếu Class giống như 'mini-module', thì Object lại có khái niệm tương tự như require
cho Class. Đó là create
. Khi bạn khởi tạo một class đó chính là bạn đang gọi Object.
Bạn khởi tạo một class bằng cách gọi function new
:
1. thing = MyStuff.new()
2. thing.apple()
3. puts thing.tangerine
Dòng thứ nhất là hành động khởi tạo, giống như việc gọi một function. Chúng ta sẽ phân tích trình tự của Ruby:
-
Ruby tìm kiếm
MyStuff
và các class mà nó được định nghĩa. -
Ruby tạo ra một
empty object
với tất cả các functions xác định bằngdef
vì bạn sử dụngMyStuff.new()
. -
Ruby sau đó sẽ tìm nếu bạn gọi đến hàm khởi tạo, và tạo ra một empty object.
-
Khi gọi đến hàm khởi tạo của
MyStuff
, sau đó khai báo biến@tangerine
, và@tangerine
trở thành một phần của object. Ruby thường sử dụng@
and$
để xác định biến được cấp phát.$
là biến global, ví dụ$stdin
thì sẽ được gọi ở tất cả mọi nơi.@
thường được định nghĩa cho một object. -
Ở đây, ta định nghĩa
@tagerine
là lời một bài hát. -
Ruby sẽ cập nhật giá trị mới nhất cho biến.
Tựu chung lại:
Class như một bản thiết kế hoặc là các định nghĩa để tạo nên các mini-modules.
Khởi tạo nghĩa là làm việc tạo mới các mini-modules và các require cùng lúc. Tức là tạo ra một object và đồng thời cho object các quyền require các function đã định nghĩa trong class.
Kết quả của quá trình khởi tạo mini-modules gọi là object, sau đó gán các giá trị mới cho object đó và thực hiện các thao tác với nó.
All rights reserved