Ruby函数与方法

Jos*_*all 27 ruby methods lambda function

Ruby Programming Language第6章(第2段)中,他们指出:

许多语言区分没有关联对象的函数和在接收器对象上调用的方法.因为Ruby是纯粹面向对象的语言,所以所有方法都是真正的方法,并且至少与一个对象相关联.

然后在第6段的中间:

procs和lambdas都是函数而不是在对象上调用的方法.

我对这些陈述有点困惑.Ruby是纯粹的纯OO,因此没有与对象无关的函数(如果这是纯OO的有效定义),还是与Proc对象关联的procs/lambdas?Ruby中的函数和方法有什么区别?

任何解析和理解这一点的帮助将不胜感激.

Bri*_*per 21

lambdaRuby中的s是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
Run Code Online (Sandbox Code Playgroud)

您可以bindUnboundMethod一个对象,然后调用它.但你根本不能bind成为Proc一个对象. Proc但是,对象可以捕获周围范围内的局部变量,从而成为闭包.


mip*_*adi 5

Procs和lambdas都是自己的对象call,实际上调用与proc(或lambda)相关联的块的方法.但是,Ruby提供了一些语法糖来调用它们而不需要显式调用call.


Kap*_*old 5

我认为区别在于方法和一阶函数,即.可以作为值传递的函数.