Так, мне любопытно относительно того, как Ruby является полностью объектно-ориентированным языком. Я спотыкаюсь одну проблему, которая не действительно ясна мне.
Если я определяю функцию следующим образом
def foo(text)
print text
end
и я определяю функцию за пределами класса, как эта функция является объектом? Я понимаю, что могу звонить
foo.class
И я получаю NilClass. Это означает, что нечто является экземпляром NilClass? И если это, что означает точно, когда я звоню
foo "hello world"
Если нечто является объектом, какой метод - я вызов, когда я делаю оператор как выше. Кроме того, если это объект, делает это означает, что я могу изменить его и добавить, другой метод к нему (скажите, что панель), где я мог возможно сделать следующий statment:
foo.bar(some variables)
Извините, я просто немного смущен по этому вопросу. Любое разъяснение очень ценится!Спасибо!
Object
(даже если класс self
не является Object
). Как Википедия утверждает :
Все методы, определенные вне области действия конкретного объекта, на самом деле являются методами класса Object.
На самом деле Ruby - это «мультипарадигма». Он поддерживает объектно-ориентированную, функциональную, императивную (и некоторые другие) парадигмы.
Быть «полностью объектно-ориентированным» не означает, что вы только поддерживаете объектно-ориентированную парадигму. Пока вы поддерживаете все функции, составляющие объектно-ориентированное программирование (классы, экземпляры, полиморфизм и т. Д.), Вы по-прежнему можете поддерживать дополнительных парадигм и при этом оставаться «полностью объектно-ориентированным».
foo.class
сначала вызывает метод foo
, который возвращает nil
, а затем вызывает метод class
для объекта, возвращенного из foo
, а именно nil
.
В нотации псевдокода, пошаговая оценка кода:
foo.class
==> { print text }.class
==> { nil }.class
==> nil.class
==> NilClass
Вы можете получить метод как объект. Чтобы использовать ваш пример:
def foo(text)
print text
end
, а затем расширьте его:
method_as_object = method(:foo)
method_as_object.call('bar') #=> bar
Обычно, когда вы определяете метод, вы просто определяете его как метод текущей области (которая по умолчанию является классом Object)
Чтобы расширить пример Справедливости, вы можете пойти еще дальше.
def foo
puts "foo"
end
foo.class
==> NilClass
NilClass.class
==> Class
Class.superclass
==> Module
Module.superclass
==> Object
Object.superclass
==> BasicObject
По крайней мере, все является экземпляром класса BasicObject.