Все ли является объектом в рубине? - PullRequest
13 голосов
/ 07 августа 2010

Является ли все в ruby ​​объектом? Включает ли это Fixnum s?

Ответы [ 6 ]

37 голосов
/ 07 августа 2010

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

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

4 голосов
/ 04 мая 2014

Практически все в 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..."

И операторы (например, +, -, [], <<) реализованы как методы: </p>

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

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

4 голосов
/ 07 августа 2010

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

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

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

Чтение Ruby info и документации на веб-сайте также является хорошей идеей.

2 голосов
/ 07 августа 2010

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

1 голос
/ 07 августа 2010

Да.

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

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

> pp Fixnum.ancestors
[Fixnum,
 Integer,
 Precision,
 Numeric,
 Comparable,
 Object,
  ...
 Kernel]
 => nil 
1 голос
/ 07 августа 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...