Как Ruby полностью Объектно-ориентирован?

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

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

def foo(text)
  print text
end

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

foo.class

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

foo "hello world"

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

foo.bar(some variables)

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

10
задан Nikhil Chelliah 24 June 2010 в 18:16
поделиться

5 ответов

  • Определенные пользователем глобальные функции (функции верхнего уровня) являются методами экземпляра Object (даже если класс self не является Object).
  • Методы верхнего уровня всегда приватны.
12
ответ дан 3 December 2019 в 14:43
поделиться

Как Википедия утверждает :

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

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

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

11
ответ дан 3 December 2019 в 14:43
поделиться

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

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

foo.class
==> { print text }.class
==> { nil }.class
==> nil.class
==> NilClass
7
ответ дан 3 December 2019 в 14:43
поделиться

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

def foo(text)
  print text
end

, а затем расширьте его:

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

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

2
ответ дан 3 December 2019 в 14:43
поделиться

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

def foo
    puts "foo"
end

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

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

0
ответ дан 3 December 2019 в 14:43
поделиться