2010-03-03 22 views
12

Tôi đang nghiên cứu mô hình đối tượng ruby ​​và có một số câu hỏi. Tôi hiểu ý tưởng rằng một đối tượng chỉ lưu trữ các biến mẫu và các phương thức được lưu trữ trong lớp, một đối tượng có tham chiếu đến. Tôi cũng hiểu ý tưởng 'tự' - nó là gì, nó thay đổi thế nào, v.v.Giải thích tốt về mô hình đối tượng ruby ​​- chủ yếu là 'các lớp là đối tượng'?

Tuy nhiên, điều tôi không hiểu là khái niệm 'các lớp là đối tượng'. Có một lời giải thích tốt, trực quan ở đâu không?

(BTW: Tôi đang sử dụng Ruby Object Model and MetaprogrammingMetaprogramming Ruby như hai nguồn lực của tôi Nếu ai cũng có thể đề nghị cái gì khác, đó sẽ là hữu ích..)

Cảm ơn.

+1

Sau một thời gian với Ruby, tôi đã đặt câu hỏi hoàn toàn ngược lại: làm thế nào mà chúng tôi mua vào các ngôn ngữ mà các lớp học KHÔNG phải là đối tượng ... –

+0

Hãy thử "Ruby-Grounded Rubyist" của David Black - http: // www .manning.com/black2/ –

Trả lời

7

Đây là ảnh của tôi tại một.

Trong Ruby, các lớp là đối tượng. Thông thường họ có lớp Class. Ví dụ, chúng ta hãy xem xét các lớp học Foo.

class Foo 
end 

Chắc chắn bạn đã từng thấy điều này trước đây và điều đó không quá thú vị. Nhưng chúng ta cũng có thể đã xác định Foo theo cách này:

Foo = Class.new 

Cũng như bạn muốn tạo ra một mới Foo bằng cách gọi Foo.new, bạn có thể tạo mới Class bằng cách gọi Class.new. Sau đó, bạn đặt cho lớp đó tên Foo bằng cách gán nó, giống như bất kỳ biến nào khác. Thats tất cả để có nó.

5

Khái niệm "lớp là đối tượng" (như tôi hiểu) ngụ ý rằng bất cứ điều gì bạn có thể làm với một đối tượng, bạn có thể làm điều đó với một lớp.

Điều này khác với các ngôn ngữ lập trình khác trong đó lớp và định nghĩa lớp là các tạo tác đặc biệt khác với các đối tượng và thường không thể truy cập được vào thời gian chạy. Ví dụ trong Ruby, bạn có thể sửa đổi bất kỳ đối tượng nào trong thời gian chạy, vì các lớp cũng là các đối tượng bạn có thể sửa đổi lớp đó và thêm các phương thức vào thời gian chạy, xóa các phương thức hoặc thêm và xóa các thuộc tính khi chạy.

Ví dụ:

$ irb 
>> x = Object.new 
=> #<Object:0x1011ce560> 
>> x.to_s 
=> "#<Object:0x1011ce560>" 
>> undef to_s 
=> nil 
>> x.to_s 
NoMethodError: undefined method `to_s' for #<Object:0x1011ce560> 
from (irb):4 
>> 

Đó là không thể trên ngôn ngữ lập trình khác, nơi một sự phân biệt giữa các đối tượng và các lớp học được thực hiện.

Lưu ý: Có lẽ bạn nên hiểu khái niệm cơ bản của Ruby trước khi lập trình meta vì có thể khó hiểu, rằng tôi sẽ làm gì.

+3

Cần lưu ý rằng nhiều ngôn ngữ khác * có * có tính năng này (đáng chú ý là Smalltalk; nhiều ngôn ngữ khác mượn từ đó). –

+3

Thực ra Ruby đã lấy nó từ Smalltalk – OscarRyz

10

Nó có nghĩa là chính xác những gì nó giống như - lớp học là đối tượng. Cụ thể, chúng là các thể hiện của lớp Class, mà chính nó là một lớp con của lớp Module, mà lần lượt là một lớp con của Object, giống như mọi lớp khác trong Ruby. Giống như bất kỳ đối tượng nào khác trong Ruby, một lớp có thể trả lời tin nhắn, có các biến mẫu riêng của nó, v.v.

Ví dụ thực tế, chúng ta hãy private.

class Person 
    attr_accessor :name, :height 
    private 
    attr_accessor :weight 
end 

Trường hợp này cung cấp các phương thức công khai của người để truy cập vào tên và chiều cao của người đó, nhưng người truy cập cho cân nặng của người đó là riêng tư. BUTBUTBUT - thay vì là một từ khóa giống như trong hầu hết các ngôn ngữ, private là một phương pháp thông thường của lớp Mô-đun. Nếu chúng ta muốn, chúng ta có thể định nghĩa lại nó để làm điều gì đó khác biệt cho một hệ thống phân cấp lớp cụ thể.

class RichardStallman 
    def self.private(*args) 
    puts "NO! INFORMATION WAS MEANT TO BE FREE!" 
    end 
end 
+4

Tôi thích trò đùa Stallman. :) –

0

Khi bạn nghĩ về nó, nó hoàn toàn hợp lý cho new là một hàm, phải không? Một hàm tạo và trả về một đối tượng mới. (Không giống như hầu hết các ngôn ngữ khác trong đó new là một số loại toán tử hoặc một cấu trúc ngôn ngữ.)

Đẩy nó hơn nữa, thậm chí hợp lý hơn cho chức năng này new là nó nên là một phương pháp, nếu chúng ta đang nói về một ngôn ngữ OO . Phương pháp của ai? Một phương thức của một đối tượng, chỉ là một loại khác biệt nhỏ của một đối tượng mà chúng ta có thể gọi là "lớp". Vì vậy, tìm kiếm theo cách đó, các lớp học chỉ là các loại đối tượng, đối tượng đặc biệt, trong số các đặc thù khác, có phương thức new và biết cách tạo các đối tượng khác dựa trên hình ảnh của riêng chúng.

1

Nhìn vào bài viết này, bạn có thể tìm thấy nó hữu ích:

The Ruby Object Model - Structure and Semantics

Cá nhân tôi học được rất nhiều về mô hình đối tượng của Ruby bằng cách đọc về Smalltalk một (ví dụ trong tài liệu Squeak). Và tùy thuộc vào mức độ thông thạo của bạn trong C, nguồn MRI khá dễ tiếp cận và mang lại những câu trả lời rõ ràng nhất.

Các vấn đề liên quan