Ruby 函数与方法
Posted
技术标签:
【中文标题】Ruby 函数与方法【英文标题】:Ruby functions vs methods 【发布时间】:2010-10-30 00:44:27 【问题描述】:在Ruby Programming Language,第 6 章(第二段)中,他们声明:
许多语言区分 没有关联的函数 被调用的对象和方法 在接收器对象上。因为红宝石是 纯面向对象的语言,所有 方法是真正的方法并且是 与至少一个对象相关联。
然后在第6段的中间:
procs 和 lambdas 都是函数 而不是在一个 对象。
我对这些陈述有点困惑。 Ruby 是真正的纯 OO,因此没有与对象无关的函数(如果这是纯 OO 的有效定义),还是 procs/lambdas 与 Proc 对象相关联? Ruby中的函数和方法有什么区别?
在解析和理解这方面的任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:lambda
s 在 Ruby 中是 Proc 类的对象。 Proc
对象不属于任何对象。调用它们时没有将它们绑定到对象。
方法是 Method
或 UnboundMethod
类的对象,具体取决于它们是绑定的还是未绑定的。请参阅说明here。未绑定的方法在绑定到对象之前无法调用。
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
和 Proc
一个对象。 Proc
对象可以捕获周围范围内的局部变量,成为闭包。
【讨论】:
方法不是对象。Object#method
返回一个Method
,但另外一个方法不是Method
。 ***.com/questions/2602340/…【参考方案2】:
Procs 和 lambdas 本身都是对象,有一个 call
方法实际上调用与 proc(或 lambda)关联的块。但是,Ruby 提供了一些语法糖来调用它们,而无需显式调用 call
。
【讨论】:
是的,proc 和 lambdas 都是 Proc 对象,但是“是函数而不是方法”是什么意思。又有什么区别? 他的意思是第6段中间的句子不准确。 真正的区别在于,几乎普遍地,procs 和 lambdas 仅用于它们相关的“调用”方法。没有人用它们存储额外的方法或值。因此,就像 Kaptajn Kold 所说,我们可以像在其他语言中使用一阶函数一样使用它们,即使它们仍然是真正的对象。 所以从某种意义上说,Procs 和 lambda 在技术上是“方法”,因为 Ruby 中的一切都是一个对象,但实际上它们的行为就像其他语言中的“函数”一样——它们是匿名的代码, '没有绑定到一个特定的对象(除了 Proc 类)?【参考方案3】:我认为区别在于方法和first order function 即。可以作为值传递的函数。
【讨论】:
以上是关于Ruby 函数与方法的主要内容,如果未能解决你的问题,请参考以下文章