方法和过程对象有啥区别?
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
您可能会发现阅读UnboundMethod
、Method
和Proc
的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 还没到家?以上是关于方法和过程对象有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章