2013-05-07 34 views
6

Tôi khá mới đối với Ruby, nhưng khi tôi đang tìm tài liệu về Ruby, tôi cũng tìm thấy một số mã nguồn C đã được đưa vào tài liệu. Trong hầu như tất cả các tài liệu tham khảo, tôi tìm thấy các VALUE và tôi khá chắc chắn của nó một struct. Nhưng các thuộc tính của VALUE struct này là gì và điều này thực sự đang làm gì?Loại "VALUE" trong các tệp nguồn Ruby là gì?

+3

Bất kỳ đối tượng Ruby nào được biểu thị nội bộ trong C dưới dạng loại 'VALUE'. – sawa

+1

Đây là chi tiết về triển khai của Ruby. Là một nhà phát triển * Ruby *, bạn không cần phải lo lắng về nó; triển khai C cơ bản có rất ít việc làm với lập trình trong Ruby. – meagar

+1

Tuy nhiên, nếu bạn muốn sử dụng kiến ​​thức này, và có một số C cơ bản, tất cả đều rất dễ tiếp cận. Đó là cách hầu hết các phần mở rộng Native làm việc trong thực tế. Xem http://media.pragprog.com/titles/ruby3/ext_ruby.pdf và/hoặc http://guides.rubygems.org/c-extensions/ –

Trả lời

3

Trong C, các biến có loại và dữ liệu không có loại. Ngược lại, các biến của Ruby không có kiểu tĩnh và dữ liệu tự có các loại, vì vậy dữ liệu sẽ cần được chuyển đổi giữa các ngôn ngữ.

Dữ liệu trong Ruby được thể hiện bằng loại C `VALUE '. Mỗi dữ liệu VALUE có loại dữ liệu của nó.

Để lấy dữ liệu C từ một giá trị, bạn cần phải:

1. Xác định kiểu dữ liệu của giá trị

2. Chuyển đổi các giá trị vào dữ liệu C

Đối xem thêm thông tin tại đây: Basic Knowledge

+0

Ok, vì vậy bây giờ tôi nhận được nó. Mỗi kiểu dữ liệu trong Ruby có kiểu dữ liệu tương ứng trong C (hoặc, chúng được chuyển thành dạng như vậy), phải không? – Sazid

+0

@Sazid Nếu bạn đọc tài liệu tôi liên kết, mọi thứ sẽ bị xóa. Tôi tin. –

9

Bạn có thể xem định nghĩa cho VALUE trong file header ruby/ruby.h:

#if defined HAVE_UINTPTR_T && 0 
typedef uintptr_t VALUE; 
... 
#elif SIZEOF_LONG == SIZEOF_VOIDP 
typedef unsigned long VALUE; 
...  
#else 
# error 
#endif 

Vì vậy, giá trị chỉ là một con trỏ đến một đối tượng. Như được mô tả trong liên kết của Priti, có một macro TYPE() trong cùng một tệp có thể được sử dụng để xác định loại dữ liệu được trỏ đến bởi một VALUE.

+1

Cảm ơn bạn đã chỉ ra tệp tiêu đề :) – Sazid