2012-12-12 34 views
5

Xem xét mọi thứ trong Ruby là một đối tượng và chúng ta có thể mở irb và gõ những thứ như 4.class"Text".class để xem lớp nào là đối tượng, tại sao if.classunless.class không giá trị trả lại?Lớp học "if/except" vv

Trả lời

10

Xét rằng tất cả mọi thứ trong Ruby là một đối tượng

đó phụ thuộc vào định nghĩa của bạn về "đối tượng" và khắp mọi "điều". "Object" có nghĩa là "thực thể có thể được thao túng bởi các chương trình" (mà tôi sẽ gọi đối tượng từ giờ trở đi), hoặc "giá trị đó là một thành viên của hệ thống đối tượng" (mà tôi sẽ hãy gọi Object từ bây giờ).

Trong Ruby, mọi thứ có thể được điều khiển bởi chương trình (tức là mỗi đối tượng ) cũng là Object, tức là một phiên bản của một lớp. Điều này không giống như Java, ví dụ: trong đó nguyên thủy có thể được điều khiển bởi chương trình (tức là đối tượng theo nghĩa đó), nhưng không phải là Objects. Trong Ruby, sự khác biệt này không tồn tại: mọi đối tượng Object và mỗi Object cũng là đối tượng .

Tuy nhiên, có điều bằng ngôn ngữ, mà không có thể được chế tác bằng các chương trình, vốn không có trường hợp của một lớp học, ví dụ: họ không phải là đối tượng s cũng không Object s. Đây là, ví dụ, phương pháp, biến, cú pháp, danh sách tham số, danh sách đối số, từ khóa.

Lưu ý: bạn có thể sử dụng API phản chiếu của Ruby để cung cấp cho bạn một đối tượng đại diện cho một phương pháp hoặc danh sách tham số, nhưng đối tượng đó chỉ là proxy.

Vì vậy, khi chúng ta nói "tất cả mọi thứ là một đối tượng", những gì chúng ta thực sự có nghĩa là "mỗi đối tượng là một Object", tức là tất cả mọi thứ có thể được điều khiển bởi chương trình cũng là một thành viên của hệ thống đối tượng, hay nói cách khác, không có giá trị nào nằm ngoài hệ thống đối tượng (không giống như các nguyên thủy trong Java). Chúng tôi làm không có nghĩa là mọi thứ tồn tại trong ngôn ngữ cũng có thể được thao tác trong thời gian chạy theo chương trình.

tại sao if.classunless.class cho không có giá trị trả lại

Vâng, trước hết, thậm chí nếuif một đối tượng, những không làm những gì bạn nghĩ rằng họ làm: khi bạn nói điều gì đó giống như foo trong Ruby, điều đó có nghĩa là "dereference biến cục bộ foo" hoặc "gọi phương thức foo với self làm trình thu thập ngầm và không có danh sách đối số". Vì vậy,

if.class 

hoặc là sẽ cung cấp cho bạn các lớp của đối tượng tham chiếu bởi các biến địa phương if hoặc lớp của đối tượng trở theo phương pháp if, nhưng bao giờ lớp của if riêng của mình.

Nhưng từ khóa dòng chảy if kiểm soát không phải là một đối tượng, dù sao (không phải một đối tượng cũng không một Object) vì từ khóa và kiểm soát dòng chảy không phải là đối tượng trong Ruby.

Trong cuốn sách The Ruby Programming Language by Matz and David Flanagan nó nói trên trang 2:

mỗi giá trị là một đối tượng

Lưu ý, nó không nói mặt ở khắp mọi điều, chỉ có mỗi giá trị.

Xem thêm các câu hỏi Is variable is object in ruby?

+0

Giải thích rất tốt, bao gồm câu hỏi được liên kết. Cảm ơn! Để thêm nhiều điều gây nhầm lẫn, tại http://ruby-doc.org/docs/keywords/1.9/Object.html 'if' được liệt kê như là một phương thức của lớp Đối tượng nhưng nếu bạn nhấp vào từ khóa.rb nó sẽ nói" Có, Tôi BIẾT rằng họ không phải là phương pháp. Tôi vừa đặt chúng ở định dạng đó để tạo ra đầu ra RDoc quen thuộc. Vì vậy, 'if' chỉ là một từ khóa mặc dù nó có thể đã được thực hiện như một đối tượng và từ khóa không hoạt động như các đối tượng. – user1894919

4

Vì chúng là từ khóa ngôn ngữ và không phải là đối tượng. Nói chung, mọi thứ bạn có thể gán cho một biến là một đối tượng.

Để chính xác về mặt kỹ thuật: từ khóa như unlesscó thể có một lớp được trình biên dịch/phiên dịch sử dụng (phụ thuộc vào triển khai thực tế), nhưng bạn là người dùng ngôn ngữ sử dụng cho nó và vì vậy nó không tiếp xúc với bạn.

1
1.9.2-p320 :019 > def meth 
1.9.2-p320 :020?> 'meth' 
1.9.2-p320 :021?> end 
=> nil 
1.9.2-p320 :022 > 

Nếu bạn quan sát những dấu hỏi và thụt đầu dòng, khi IRB phát hiện một cái gì đó mà cần tiếp tục, nó indents.

1.9.2-p320 :022 > if.class 
1.9.2-p320 :023?> ... 
1.9.2-p320 :028?> end 
SyntaxError: (irb):22: syntax error, unexpected '.' 
if.class 
^
(irb):28: syntax error, unexpected keyword_end, expecting $end 

1.9.2-p320 :045 > if.if 
1.9.2-p320 :046?> end 
SyntaxError: (irb):45: syntax error, unexpected '.' 
if.if 
^

1.9.2-p320 :060 > str = 'abc' 
=> "abc" 
1.9.2-p320 :061 > str. 
1.9.2-p320 :062 > length 
=> 3 
1.9.2-p320 :063 > 
1.9.2-p320 :083 > if 
1.9.2-p320 :084 >  str 
1.9.2-p320 :085?> puts '>>>' 
1.9.2-p320 :086?> end 
>>> 
=> nil 
1.9.2-p320 :087 > 

Như bạn có thể thấy, IRB không trả lời ngay lập tức, ngay cả khi có lỗi rõ ràng như gửi tin nhắn đến một từ dành riêng. Các ? là dấu hiệu cho thấy nó đang chờ phần còn lại của câu lệnh.

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