方法和过程对象有啥区别?

Posted

技术标签:

【中文标题】方法和过程对象有啥区别?【英文标题】:What is the difference between a method and a proc object?方法和过程对象有什么区别? 【发布时间】:2015-02-04 09:53:33 【问题描述】:

我知道 Ruby 中的方法不是对象,而是 procs 和 lambdas。除此之外,它们之间还有什么区别吗?因为我们都可以绕过。 proc 对象与方法有何不同?

方法:

1.8.7-p334 :017 > def a_method(a,b)
1.8.7-p334 :018?>   puts "a method with args: #a, #b"
1.8.7-p334 :019?>   end
1.8.7-p334 :021 > meth_ref = Object.method("a_method")
 => #<Method: Class(Object)#a_method> 
1.8.7-p334 :022 > meth_ref.call(2,3)

过程对象:

  a = lambda |a, b| puts "#a, #b"
  a.call(2,3)

【问题讨论】:

我不要求 proc 和 lambda。我在问方法和 proc 对象之间的区别。 不了解他们如何将其标记为重复 :( 我错过了很多答案。我的问题有效吗? 不应该是:a = Proc.new | a, b | puts "#a, #b" 我认为问题的标题意味着我们在谈论“Proc[s]”,而不是“lambda”。 【参考方案1】:

简而言之:

Method 对象被“绑定”到一个对象,因此当您使用call 方法时self 指向该对象,而Proc 没有该行为; self 取决于创建/调用 Proc 的上下文。

但是:

您在问题中说“方法不是对象”,但您必须小心区分“方法”和Method

“方法”是一组已定义的表达式,它被赋予名称并放入特定类的方法表中,以便以后查找和执行:

class Foo
  def my_method
    return 123
  end
end

Foo.new.my_method
# => 123

Method 对象(或类似的 UnboundMethod 对象)是通过调用 method / instance_method / 等创建的实际 Ruby 对象,并将“方法”的名称作为参数传递:

my_Foo = Foo.new

my_Method = my_Foo.method(:my_method)
# => #<Method: Foo#my_method>

my_Method.call
# => 123

my_UnboundMethod = Foo.instance_method(:my_method)
# => #<UnboundMethod: Foo#my_method>

my_UnboundMethod.bind(my_Foo).call
# => 123

Proc 对象是一组没有名称的表达式,您可以存储它们以供以后执行:

my_proc = Proc.new  123 
my_proc.call
# => 123

您可能会发现阅读UnboundMethodMethodProc 的RDoc 文档很有用。 RDoc 页面列出了每种类型可用的不同实例方法。

【讨论】:

在哪些情况下我们使用Method来创建方法?【参考方案2】:

块和触发的区别

    过程是对象,块不是 参数列表中最多可以出现一个块

procs 和 lambdas 的区别

    Lambdas 检查参数的数量,而 procs 不检查 Lambda 和 proc 对 return 关键字的处理方式不同

这里解释得很好(我只是从下面的链接中复制的)

http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/

【讨论】:

这里不是要求 proc、lambda 和 block。我想知道方法和proc对象的区别 @Kranthi 对不起。我误会你了。回家后我会尽快解决。 @Verhaeren 还没到家?

以上是关于方法和过程对象有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

java中构造方法和方法有啥区别

VBS和JAVA和C++,有啥区别,有啥差距

Oracle中的“过程名称IS”和“过程名称AS”有啥区别?

存储过程和表值函数有啥区别?

在JAVA中, 静态方法和一般方法有啥区别?

C语言、VB语言都属于高级语言,它们在编程方法上有啥明显的区别?