Как Ruby полностью объектно-ориентирован? - PullRequest
10 голосов
/ 24 июня 2010

Итак, мне интересно, как Ruby является полностью объектно-ориентированным языком.Я натыкаюсь на одну проблему, которая мне не совсем понятна.

Если я определяю функцию следующим образом

def foo(text)
  print text
end

и определяю функцию вне класса, как эта функция является объектом?Я понимаю, что могу позвонить

foo.class

И я получаю NilClass.Значит ли это, что foo является экземпляром NilClass?И если это так, что это означает именно тогда, когда я вызываю

foo "hello world"

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

foo.bar(some variables)

Извините, я немногозапутался в этом вопросе.Любое разъяснение очень ценится!Спасибо!

Ответы [ 6 ]

12 голосов
/ 24 июня 2010
  • Определяемые пользователем глобальные функции (функции верхнего уровня) являются методами экземпляра Object (даже если класс self не Object).
  • Методы верхнего уровнявсегда приватно.
11 голосов
/ 24 июня 2010

Как Википедия заявляет :

Все методы, определенные вне области действия конкретного объекта, на самом деле являются методами класса Object.

Руби на самом деле является «мультипарадигмой». Он поддерживает объектно-ориентированные, функциональные, императивные (и некоторые другие) парадигмы.

Быть «полностью объектно-ориентированным» не означает, что вы только поддерживает объектно-ориентированную парадигму. Пока вы поддерживаете все функции, составляющие объектно-ориентированное программирование (классы, экземпляры, полиморфизм и т. Д.), Вы все равно можете поддерживать дополнительные парадигмы и при этом оставаться «полностью объектно-ориентированными».

7 голосов
/ 24 июня 2010

foo.class сначала вызывает метод foo, который возвращает nil, а затем вызывает метод class для объекта, возвращенного из foo, а именно nil.

В псевдокодовой нотации, шаг за шагом оценивая код:

foo.class
==> { print text }.class
==> { nil }.class
==> nil.class
==> NilClass
2 голосов
/ 28 июня 2010

Вы можете получить метод как объект.Чтобы использовать ваш пример:

def foo(text)
  print text
end

и затем разверните его:

method_as_object = method(:foo)
method_as_object.call('bar') #=> bar

Обычно, когда вы определяете метод, вы просто определяете его как метод текущей области (который по умолчанию является классом Object)

0 голосов
/ 31 августа 2011

<<a href="https://stackoverflow.com/questions/7250523/is-class-declaration-an-eyewash-in-ruby-is-everything-really-object-oriented"> Является ли объявление класса средством для ухода за глазами в рубине?Все ли действительно объектно-ориентировано? >

Следующая ссылка лучше всего объясняет, насколько ruby ​​полностью ориентирован на объекты, так что базовые конструкции, такие как класс Someclass, создают объекты из объектов.

0 голосов
/ 24 июня 2010

Чтобы расширить пример Справедливости, вы можете пойти еще дальше.

def foo
    puts "foo"
end

foo.class
==> NilClass
NilClass.class
==> Class
Class.superclass
==> Module
Module.superclass
==> Object
Object.superclass
==> BasicObject

Все является экземпляром класса BasicObject, по крайней мере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...