2010-08-07 26 views

Trả lời

34

Phụ thuộc vào ý bạn là "mọi thứ". Fixnum s, như những người khác đã chứng minh. Các lớp học cũng như các trường hợp của lớp Class. Phương thức, toán tử và khối không, nhưng có thể được bao bọc bởi các đối tượng (Proc). Nhiệm vụ đơn giản là không, và không thể. Các tuyên bố như while cũng không thể và không thể. Nhận xét rõ ràng cũng thuộc nhóm thứ hai.

Hầu hết mọi thứ thực sự là vấn đề, tức là bạn muốn thao tác, là đối tượng (hoặc có thể được bao bọc trong đối tượng).

+1

+1 Yêu thích các ví dụ ngược lại này. Nói rằng tất cả mọi thứ là một đối tượng mà không xem xét tất cả mọi thứ là hơi tẩy não :) – Jakob

+0

+1 - Tuyệt vời đó là những gì tôi đã cố gắng để nói trong một số câu hỏi khác, từ đó câu hỏi này đã được sinh ra. – RubyDubee

+0

Tại sao không phải 'while' là một đối tượng? – Ziggy

1

Yup.

> Fixnum.is_a?(Object) #=> true 

Để xem chuỗi thừa kế:

> pp Fixnum.ancestors 
[Fixnum, 
Integer, 
Precision, 
Numeric, 
Comparable, 
Object, 
    ... 
Kernel] 
=> nil 
+0

'# tổ tiên' cung cấp tất cả các mô-đun đi kèm, không chỉ là chuỗi thừa kế. – jtbandes

+0

Ngoài ra, 'pp' không có sẵn theo mặc định, ít nhất là trong 1,8,7p174. – jtbandes

+0

Vâng, tôi biết! cám ơn. – Dex

4

Yes. Fixnum là một lớp, được kế thừa từ Integer, được kế thừa từ Numeric, cuối cùng được kế thừa từ Object.

Hoặc, tại sao bạn không hỏi? :)

1.is_a? Object # => true 
1.class # => Fixnum 
Fixnum.is_a? Object # => true 

Đọc Ruby infodocumentation trên trang web cũng là một ý kiến ​​hay.

2

Ruby doen't có bất kỳ nguyên thủy (như int, char, vv trong java), do đó, mọi giá trị (bất cứ điều gì có thể ngồi bên phải của một câu lệnh gán) là một đối tượng. Tuy nhiên, các câu lệnh kiểm soát, phương thức và các tính năng khác của cú pháp ngôn ngữ thì không.

4

Thực tế mọi thứ trong Ruby là một đối tượng, ngoại trừ cấu trúc điều khiển. Có hoặc không nằm trong phạm vi một phương thức, khối mã hoặc toán tử là hoặc không phải là một đối tượng, chúng được biểu diễn dưới dạng Đối tượng và có thể được nghĩ như vậy.

Hãy khối mã ví dụ:

def what_is(&block) 
    puts block.class 
    puts block.is_a? Object 
end 

> what_is {} 
Proc 
true 
=> nil 

Hoặc cho một Phương pháp:

class A 
    def i_am_method 
    "Call me sometime..." 
    end 
end 

> m = A.new.method(:i_am_method) 
> m.class 
Method 
> m.is_a? Object 
true 
> m.call 
"Call me sometime..." 

Và các nhà khai thác (như +, -, [], < <) đều được thực hiện như phương pháp:

class String 
    def + 
    "I'm just a method!" 
    end 
end 

Đối với những người tham gia lập trình lần đầu tiên, điều này có ý nghĩa gì trong ap ý thức thực tế là tất cả các quy tắc mà bạn có thể áp dụng cho một loại đối tượng có thể được mở rộng cho những loại khác. Bạn có thể nghĩ về một String, Array, Class, File hoặc bất kỳ Class nào mà bạn định nghĩa là hành xử theo cùng một cách. Đây là một trong những lý do tại sao Ruby dễ dàng nhận và làm việc với hơn một số ngôn ngữ khác.

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