【问题标题】:Ruby functions vs methodsRuby 函数与方法
【发布时间】:2010-10-30 00:44:27
【问题描述】:

Ruby Programming Language,第 6 章(第二段)中,他们声明:

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

然后在第6段的中间:

procs 和 lambdas 都是函数 而不是在一个 对象。

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

在解析和理解这方面的任何帮助将不胜感激。

【问题讨论】:

    标签: ruby function lambda methods


    【解决方案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 对象可以捕获周围范围内的局部变量,成为闭包。

    【讨论】:

    【解决方案2】:

    Procs 和 lambdas 本身都是对象,有一个 call 方法实际上调用与 proc(或 lambda)关联的块。但是,Ruby 提供了一些语法糖来调用它们,而无需显式调用 call

    【讨论】:

    • 是的,proc 和 lambdas 都是 Proc 对象,但是“是函数而不是方法”是什么意思。又有什么区别?
    • 他的意思是第6段中间的句子不准确。
    • 真正的区别在于,几乎普遍地,procs 和 lambdas 仅用于它们相关的“调用”方法。没有人用它们存储额外的方法或值。因此,就像 Kaptajn Kold 所说,我们可以像在其他语言中使用一阶函数一样使用它们,即使它们仍然是真正的对象。
    • 所以从某种意义上说,Procs 和 lambda 在技术上是“方法”,因为 Ruby 中的一切都是一个对象,但实际上它们的行为就像其他语言中的“函数”一样——它们是匿名的代码, '没有绑定到一个特定的对象(除了 Proc 类)?
    【解决方案3】:

    我认为区别在于方法和first order function 即。可以作为值传递的函数。

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2018-01-10
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多