Функции Ruby и методы
В языке программирования Ruby, глава 6 (второй абзац) говорится:
Многие языки различают функций, которые не связаны объект и методы, которые вызываются на объекте приемника. Потому что Ruby чисто объектно-ориентированный язык, все методы являются истинными методами и являются связанный, по меньшей мере, с одним объектом.
И затем в середине шестого абзаца:
Оба procs и lambdas являются функциями а не методы, объект.
Я немного смущен этими утверждениями. Является ли Ruby действительно чистым OO и, следовательно, не имеет функций, которые не связаны с объектами (если это допустимое определение чистого OO) или являются procs/lambdas, связанными с объектом Proc? В чем разница между функциями и методами в Ruby?
Любая помощь в анализе и понимании этого будет оценена.
Ответы
Ответ 1
lambda
в Ruby - это объекты класса Proc. Объекты Proc
не принадлежат ни одному объекту. Они вызываются без привязки их к объекту.
Методы - это объекты класса Method
или UnboundMethod
, в зависимости от того, связаны они или не связаны. См. Объяснение здесь. Unbound методы не могут быть вызваны, пока они не привязаны к объекту.
lambda{|x| x}.class # => Proc
lambda{|x| x}.call(123) # => 123
class Foo
def bar(baz)
baz
end
end
puts Foo.new.method(:bar).class # => Method
puts Foo.new.method(:bar).call(123) # => 123
puts Foo.instance_method(:bar).class # => UnboundMethod
puts Foo.instance_method(:bar).call(123) # => throws an exception
Вы можете bind
a UnboundMethod
к объекту, а затем вызвать его. Но вы не можете bind
a Proc
на объект вообще. Однако объекты Proc
могут захватывать локальные переменные в окружающем пространстве, становясь закрытыми.
Ответ 2
Procs и lambdas - оба объекта для себя, с помощью метода call
, который фактически вызывает блок, связанный с proc (или лямбдой). Однако Ruby предоставляет некоторый синтаксический сахар, чтобы вызывать их без явного вызова call
.
Ответ 3
Я думаю, что различие между методами и функция первого порядка, т.е. функции, которые могут передаваться как значения.