方法和过程对象有什么区别?

11

我知道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)

Proc对象:

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

1
我不是在问proc和lambda。我在问方法和proc对象之间的区别。 - Kranthi
1
没有理解怎么能标记为重复 :( 我错过了很多答案。我的问题有效吗? - Kranthi
难道不应该是: a = Proc.new{ | a, b | puts "#{a}, #{b}" } 我认为问题的标题意味着我们正在谈论“Proc[s]”,而不是“lambda”。 - Jordan Stewart
2个回答

8
简而言之,一个“方法”对象被“绑定”到一个对象上,因此当您调用该方法时,“self”指向该对象,而“Proc”没有这种行为;“self”取决于创建/调用“Proc”的上下文。
但是,请注意区分“method”和“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

您可能会发现阅读RDoc文档对于 UnboundMethod, Method, 和 Proc 有所帮助。RDoc页面列出了每种类型可用的不同实例方法。


在什么情况下我们使用 Method 来创建一个方法? - Kranthi

1

2
这里我不是在问过程、lambda和块。我想知道方法和proc对象之间的区别。 - Kranthi
@Kranthi 对不起,我误解了你的意思。我一回到家就会修正我的答案。 - Verhaeren
5
@Verhaeren 还没有到家吗? - Ajay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接