Nếu bạn đã sử dụng Ruby một thời gian, bạn có thể tò mò về cách hoạt động của một số thứ.
Một cách để tìm hiểu sâu về nội bộ của Ruby là đọc mã nguồn làm cho nó hoạt động. Ngay cả khi bạn không biết C, bạn vẫn có thể học được một số điều thú vị.
Mã nguồn có thể được tìm thấy trên github repo cho Ruby.
Lý tưởng nhất là bạn muốn sử dụng một công cụ như Codequery cho phép bạn dễ dàng tìm thấy tên lớp và phương thức.
Khám phá các lớp cốt lõi
Hầu hết việc khám phá của bạn sẽ diễn ra trong thư mục gốc. Đó là nơi bạn sẽ tìm thấy mã nguồn cho tất cả các lớp cốt lõi như Object
trong object.c
hoặc Array
trong array.c
.
Hãy xem qua hash.c
.
Nếu cuộn hết xuống dòng 4468, bạn sẽ thấy một số tên quen thuộc.
Hãy bắt đầu với điều này :
rb_cHash =rb_define_class ("Băm", rb_cObject);
Trong dòng này, Hash
lớp đang được định nghĩa bởi rb_define_class
hàm số. Đối số thứ hai (rb_cObject
) là lớp cha của lớp này.
Nếu bạn muốn tìm hiểu quá trình xác định một lớp hoạt động như thế nào, bạn hãy tìm kiếm rb_define_class
.
Phần đầu tiên từ rb_define_class
kiểm tra xem lớp đã được xác định chưa.
if (rb_const_defined (rb_cObject, id)) {// ...}
Bên trong if
đó khối, Ruby thực hiện một số kiểm tra sự tỉnh táo, chẳng hạn như đảm bảo rằng chúng tôi đang làm việc với một lớp đã được xác định.
Nếu lớp không được định nghĩa thì nó sẽ được định nghĩa như thế này:
klass =rb_define_class_id (id, super); st_add_direct (rb_class_tbl, id, klass); rb_name_class (klass, id); rb_const_set (rb_cObject, id, klass); rb_class_inherited (super, klass) / return klass>Bạn có thể đọc định nghĩa cho tất cả các phương pháp này, nhưng tôi nghĩ chúng khá dễ hiểu.
Trong
st_add_direct
, phần ‘st’ có nghĩa là ‘bảng biểu tượng’, và đây chỉ là một bảng băm.rb_const_set
hàm đặt một hằng số trênObject
lớp học, điều này sẽ làm cho lớp học có sẵn ở mọi nơi.Và
rb_class_inherited
gọiinherited
phương thức của lớp cha, bạn có thể tìm tài liệu cho phương thức này tại đây.Phần tiếp theo của mã bao gồm các định nghĩa phương pháp. MRI sử dụng
rb_define_method
để làm điều đó.Đây là một ví dụ :
rb_define_method (rb_cHash, "index", rb_hash_index, 1); rb_define_method (rb_cHash, "size", rb_hash_size, 0); rb_define_method_de (rb_cHash, "length"? , rb_hash_empty_p, 0);Các đối số diễn ra như thế này :
- Đối số đầu tiên là lớp mà phương thức này đang được định nghĩa trên đó
- Đối số thứ hai là tên phương thức, đối số thứ ba là hàm C thực sự triển khai phương thức này
- Đối số cuối cùng là số đối số mà phương thức Ruby này yêu cầu (giá trị âm có nghĩa là đối số tùy chọn)
rb_define_singleton_method
hàm được sử dụng để định nghĩa một phương thức lớp.
rb_define_singleton_method (rb_cHash, "[]", rb_hash_s_create, -1);
Phần thân của rb_define_singleton_method
chỉ là một dòng mã:
rb_define_method (singleton_class_of (obj), name, func, argc);
Nếu bạn muốn tiếp tục khám phá, một tệp tốt để xem là object.c
.
Khám phá Thư viện Chuẩn
Được rồi, vậy là đủ C cho ngày hôm nay!
Làm thế nào về việc đọc một số mã Ruby?
Thư viện chuẩn Ruby được viết bằng Ruby và bạn có thể tìm thấy nó trong /lib
thư mục.
Thư viện chuẩn chứa những thứ như OpenStruct, Base64
mã hóa và Set
cấu trúc dữ liệu.
Một tập hợp tương tự như một mảng, nhưng với thuộc tính đặc biệt là tất cả các phần tử là duy nhất. Nói cách khác, một tập hợp không chứa bản sao.
Nó hoạt động như thế nào? Có bất kỳ thuật toán ưa thích nào đằng sau điều này không?
Nếu chúng ta xem qua set.rb
bạn sẽ nhanh chóng phát hiện ra rằng điều này được hỗ trợ bởi một Hash
đối tượng.
# Thêm đối tượng đã cho vào tập hợp và trả về chính nó. Sử dụng + merge + để # thêm nhiều phần tử cùng lúc .def add (o) @hash [o] =true selfendalias <Vì vậy, nếu bạn thêm một phần tử trùng lặp, không cần phải kiểm tra xem nó đã tồn tại hay chưa, nó sẽ chỉ ghi đè phần tử cũ.
Khám phá Rubinius
Một cách khác để khám phá mã nguồn của Ruby là xem xét các triển khai thay thế như Rubinius.
Mã rubinius được tổ chức theo một cách khác với MRI, vì vậy, để làm được điều này, tôi muốn sử dụng Github và tính năng 'tìm tệp'.
Nếu bạn muốn tìm hiểu thêm về
Enumerable
sau đó bạn chỉ cần nhập 'enumerable' và bạn sẽ thấy tất cả các tệp liên quan.Kết luận
Như bạn đã thấy, bạn có thể học cách Ruby thực hiện mọi thứ mà không cần nỗ lực nhiều. Hãy tiếp tục và tự khám phá và cho mọi người biết những gì bạn đã khám phá!
Nếu bạn thích bài đăng này, đừng quên tham gia bản tin của tôi, chỉ cần gửi email của bạn vào biểu mẫu bên dưới và bạn sẽ nhận được cập nhật miễn phí và nội dung độc quyền.