Ruby-функции против методов - PullRequest
27 голосов
/ 30 мая 2009

На языке программирования Ruby , глава 6 (второй абзац) они заявляют:

Многие языки различают функции, которые не связаны объект и методы, которые вызываются на объекте получателя. Потому что Руби чисто объектно-ориентированный язык, все методы являются истинными методами и связан как минимум с одним объектом.

А затем в середине шестого абзаца:

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

Я немного смущен этими утверждениями. Является ли Ruby действительно чистым ОО и, следовательно, не имеет функций, которые не связаны с объектами (если это допустимое определение чистого ОО), или же связанные с объектом Proc процедуры / лямбды? В чем разница между функциями и методами в Ruby?

Буду признателен за любую помощь в разборе и понимании этого.

Ответы [ 3 ]

21 голосов
/ 30 мая 2009

lambda s в Ruby являются объектами класса Proc. Proc объекты не принадлежат ни одному объекту. Они вызываются без привязки их к объекту.

Методы - это объекты класса Method или UnboundMethod, в зависимости от того, связаны они или нет. См. Объяснение здесь . Несвязанные методы нельзя вызывать, пока они не связаны с объектом.

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 и UnboundMethod к объекту, а затем вызвать его. Но вы не можете bind a Proc к объекту вообще. Однако Proc объекты могут захватывать локальные переменные в окружающей области видимости, становясь замыканиями.

5 голосов
/ 30 мая 2009

Я думаю, что различие между методами и функцией первого порядка т.е. функции, которые можно передавать как значения.

5 голосов
/ 30 мая 2009

Procs и lambdas являются объектами сами по себе, с методом call, который фактически вызывает блок, связанный с proc (или lambda) Тем не менее, Ruby предоставляет некоторый синтаксический сахар для их вызова без явного вызова call.

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