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】:

lambdas 在 Ruby 中是 Proc 类的对象。 Proc 对象不属于任何对象。调用它们时没有将它们绑定到对象。

方法是 MethodUnboundMethod 类的对象,具体取决于它们是绑定的还是未绑定的。请参阅说明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

您可以将bindUnboundMethod 分配给一个对象,然后调用它。但是你根本不能 bindProc 一个对象。 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 函数与方法的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 文件的输入与输出

雷林鹏分享:Ruby 文件的输入与输出

Ruby文件的输入与输出

在 Ruby 中使用 2 个助手构建函数的惯用方法

Ruby:为啥 unpack('Q') 给出的结果与手动转换不同?

如何使用 Ruby 将任何模式与任何字符串匹配?