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
và "Text".class
để xem lớp nào là đối tượng, tại sao if.class
và unless.class
không giá trị trả lại?Lớp học "if/except" vv
Trả lời
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 là 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.class
vàunless.class
cho không có giá trị trả lại
Vâng, trước hết, thậm chí nếuif
là 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?
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ư unless
có 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.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.
- 1. C#: hàm toán học tổng quát (Min, Max, vv)
- 2. Đúc Lớp tôi để Int64, đôi vv
- 3. php oop - mỗi tệp lớp khác nhau? gói nhập? vv
- 4. Lớp học giống như lớp
- 5. Lớp học kiểu cũ, lớp học kiểu mới và metaclasses
- 6. Lớp học - ví dụ so với phương pháp lớp học
- 7. JavaScript "lớp học"
- 8. Tạo lớp học động
- 9. Generics Java - tham gia lớp học?
- 10. Python 2.6: Lớp bên trong lớp học?
- 11. Nhiều lớp học giả CSS
- 12. thêm lớp học vào collection_select
- 13. Loại lớp học khép kín
- 14. Lớp học bạn bè C++
- 15. Các lớp học Javascript 2.0
- 16. css không chọn lớp học?
- 17. lớp học một phần java
- 18. Nhận phụ huynh lớp học?
- 19. Proguard giữ tên lớp học?
- 20. Nhiều lớp học trong SVG
- 21. Thành viên lớp học "tĩnh"
- 22. cách sắp xếp lớp học?
- 23. Tìm các lớp học có sẵn trong Học phần
- 24. Tạo ra một lớp học trống hoàn toàn để phân biệt nó với một lớp học tốt khác?
- 25. Lớp học truy cập vào lớp học bên trong tư nhân?
- 26. Công cụ để kết hợp các lớp học một phần thành một lớp học?
- 27. Lớp học có loại tự học của lớp khác có ý nghĩa không?
- 28. Sự khác biệt giữa Lớp học và Lớp học <?>
- 29. cấu hình php/lớp học ini tốt nhất?
- 30. Là một lớp học địa phương trong một phương pháp của một lớp học một người bạn của lớp này?
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