在ruby中将类方法转换为proc的惯用方法

时间:2016-01-02 23:30:42

标签: ruby

假设我想用Proc描述Kernel.puts。我该怎么做?

我可以想到许多可能性;

Proc.new do |*args| Kernel.puts *args end
:puts.to_proc.curry[Kernel] # doesn't work, returns `nil` as puts is varargs

但两者都很冗长。

5 个答案:

答案 0 :(得分:13)

method会成为您想要的吗?它可以让你将方法保存到变量。

2.1.0 :003 > m = Kernel.method(:puts)
 => #<Method: Kernel.puts>
2.1.0 :004 > m.call('hi')
hi

答案 1 :(得分:2)

我想你只想要Object#method

meth = Kernel.method(:puts)
meth["hello"]
# => hello

答案 2 :(得分:1)

您可以将接收器对象作为第一个参数传递,将实际参数作为后续参数传递。

:puts.to_proc.call(Kernel, "Hi")
#=> Hi

我发现这篇文章 - RUBY: SYMBOL#TO_PROC IS A LAMBADASS - 对于Symbol#to_proc

返回的lambda的行为非常有用。

答案 3 :(得分:0)

我不知道为什么接受的答案被接受了,因为它不是被问到的。该答案将字符串作为参数,而OP想要传递Kernel。所以我会给出答案。

使用SymbolProc,您无法做到这一点。我认为你混淆了接收者和争论。 SymbolProc创建一个proc,它将接收者作为变量,而不是其参数。并且,currying修改了论证的arity;它与接收器无关。

答案 4 :(得分:0)

proc = proc {  |*args| Kernel.puts(args) }

或带有lambda

proc = ->(*args) {Kernel.puts(args) }