2010-08-07 1 views

ответ

34

Зависит от того, что вы подразумеваете под «всем». Fixnum s, как показали другие. Классы также являются экземплярами класса Class. Методы, операторы и блоки не являются, но могут быть обернуты объектами (Proc). Простое назначение не является, и не может. Заявления вроде while также не являются и не могут. Комментарии, очевидно, также попадают в последнюю группу.

Большинство вещей, которые на самом деле имеют значение, т. Е. Что вы хотели бы манипулировать, являются объектами (или могут быть обернуты в объекты).

+1

+1 Люблю эти встречные примеры. Сказать, что все является объектом, не учитывая ВСЕ, немного промывают мозги :) – Jakob

+0

+1 - Великолепно, вот что я пытался сказать в каком-то другом вопросе, из которого этот вопрос был порожден. – RubyDubee

+0

Почему не 'while' объект? – Ziggy

1

Yup.

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

Чтобы увидеть цепочку наследования:

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

'# ancestors' предоставляет все включенные модули, а не только цепочку наследования. – jtbandes

+0

Кроме того, 'pp' недоступен по умолчанию, по крайней мере, в 1.8.7p174. – jtbandes

+0

Да, я знаю! спасибо. – Dex

4

Да. Fixnum - это класс, который наследует от Integer, который наследует от Numeric, который, наконец, наследует от Object.

Или, почему бы вам просто не спросить об этом? :)

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

Чтение Ruby info и documentation на сайте является хорошей идеей тоже.

2

У Ruby doen't есть какие-либо примитивы (например, int, char и т. Д. В java), поэтому каждое значение (все, что может стоять справа от оператора присваивания) является объектом. Однако контрольные утверждения, методы и другие функции синтаксиса языка не являются.

4

Практически все в Ruby является объектом, за исключением структур управления. Независимо от того, являются ли методы, блок кода или оператором или нет объектом, они представлены как объекты и могут рассматриваться как таковые.

Возьмите блок кода, например:

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

> what_is {} 
Proc 
true 
=> nil 

Или для метода:

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..." 

И операторы (например, +, -, [], < <) реализуются как методы:

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

Для людей, впервые вступивших в программирование, это означает, что в ap что все правила, которые вы можете применить к одному виду Объектов, могут быть распространены на других. Вы можете думать о String, Array, Class, File или любом классе, который вы определяете как поведение во многом таким же образом. Это одна из причин, по которой Ruby легче подобрать и работать с некоторыми другими языками.

Смежные вопросы