2009-05-27 34 views
39

Nếu tôi chạy tập tin này là "ruby x.rb ':"Chính" trong Ruby là gì?

class X 
end 
x = X.new 

gì là điều được gọi là' X.new"?

Đây có phải là đối tượng/quy trình/v.v. không?

+1

tôi cảm thấy như câu hỏi này có thể được hưởng lợi từ bối cảnh này: http://stackoverflow.com/questions/916795 – mipadi

+3

Được hỏi bởi cùng một người. LOL – Randolpho

Trả lời

46

Mọi thứ trong Ruby xảy ra trong ngữ cảnh của một số đối tượng. Đối tượng ở cấp cao nhất được gọi là "chính". Về cơ bản nó là một thể hiện của Object với thuộc tính đặc biệt mà bất kỳ phương thức nào được định nghĩa có được thêm vào như là các phương thức instance của Object (vì vậy chúng có sẵn ở khắp mọi nơi).

Vì vậy, chúng ta có thể làm cho một kịch bản bao gồm toàn bộ các:

puts object_id 
@a = 'Look, I have instance variables!' 
puts @a 

và nó sẽ in "105.640" và "Hãy nhìn xem, tôi có các biến ngay lập tức!".

Đây không phải là điều bạn thường cần quan tâm, nhưng ở đó.

+1

Một số câu trả lời khác đang nói rằng "thông dịch viên ruby" đang gọi phương thức mới. Nhưng tôi nghĩ bạn đang nói rằng có một bước trung gian trước khi điều đó xảy ra. Và đó là một thể hiện của Object được tạo ra và tất cả việc thực hiện được trung gian thông qua đối tượng đó. Tôi thực sự chỉ cố gắng điền vào chỗ trống trong sự hiểu biết của tôi về cách thức "mới" được truyền như một thông báo cho đối tượng X. Từ những gì bạn đang nói có vẻ như chính (Object instance) chuyển phương thức mới dưới dạng một thông báo cho cá thể X Class. Tôi có tiến gần hơn không? – lorz

+0

Vâng, tôi đoán về mặt kỹ thuật bạn có thể nói đó là thông dịch viên Ruby làm * mọi thứ *, vì đó là những gì thực sự thực thi mã của bạn. Nhưng từ quan điểm của ngôn ngữ, có, mô tả của bạn có vẻ chính xác. Ở cấp cao nhất, khi bạn bắt đầu nhập vào Ruby, bạn đang ở trong bối cảnh của đối tượng đó. Hầu hết mọi người không sử dụng cấp cao nhất như một đối tượng, nhưng nó là một. – Chuck

+2

Lưu ý: Câu trả lời này hơi lỗi thời. Phương thức được định nghĩa trong không gian tên 'main' bây giờ được thêm một cách kỳ diệu vào' BasicObject', lớp con này phân lớp 'Object' là của Ruby 1.9. – steel

3

Đó là lớp X. Bạn đang gọi phương thức "mới" tạo đối tượng lớp X. Vì vậy, nếu bạn chạy văn bản này dưới dạng tập lệnh, Ruby:

  • tạo lớp X mới là lớp con của đối tượng và tự động (như một lớp con của đối tượng) thừa kế một số phương pháp, trong đó new là một.
  • thiết lập tên x
  • gọi phương thức new trên lớp mới X, tạo đối tượng thể hiện X; x lấy một tham chiếu đến đối tượng đó.
+0

tôi nghĩ anh ta đang đề cập đến một điểm vào của một số loại. – Geo

2

Đó là thông dịch viên ruby ​​chạy dòng

x = X.new 

Như với nhiều ngôn ngữ kịch bản, kịch bản được giải thích từ trên xuống dưới hơn là có một phương pháp điểm vào tiêu chuẩn giống như hầu hết ngôn ngữ biên dịch.

+0

Vâng, tôi nghĩ rằng người hỏi câu hỏi này đã đề cập đến 'chính' từ quan điểm của một lập trình viên C.Mọi người khác ở đây dường như đang nghĩ về đối tượng cấp cao nhất có tên là 'main' trong Ruby, điều này không hoàn toàn giống nhau. – Ajedi32

1

Như Charlie Martin đã nói, X.new là một cuộc gọi đến hàm tạo trên lớp X, trả về một đối tượng kiểu X, được lưu trữ trong biến x.

Dựa trên tiêu đề của bạn, tôi nghĩ bạn đang tìm kiếm thêm một chút. Ruby không cần một cái chính, nó thực thi mã theo thứ tự mà nó thấy. Vì vậy, phụ thuộc phải được bao gồm trước khi chúng được gọi.

Vì vậy, chính của bạn là bất kỳ mã kiểu thủ tục nào được viết bên ngoài lớp hoặc định nghĩa mô-đun.

+1

Làm ruby ​​-e "tự đặt". Nó sẽ in "chính". Đó là đối tượng ngữ cảnh cấp cao nhất. – Chuck

+0

quan điểm của tôi đơn giản là bạn không khai báo một phương pháp chính, vì áp phích ban đầu dường như ngụ ý trong câu hỏi của anh ta. –

12

Trình gọi cấp cao nhất là đối tượng chính, thuộc đối tượng lớp.

Hãy thử chương trình ruby ​​này:

p self 
p self.class