假设我想用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
但两者都很冗长。
答案 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
答案 3 :(得分:0)
我不知道为什么接受的答案被接受了,因为它不是被问到的。该答案将字符串作为参数,而OP想要传递Kernel
。所以我会给出答案。
使用Symbol
至Proc
,您无法做到这一点。我认为你混淆了接收者和争论。 Symbol
到Proc
创建一个proc,它将接收者作为变量,而不是其参数。并且,currying修改了论证的arity;它与接收器无关。
答案 4 :(得分:0)
proc = proc { |*args| Kernel.puts(args) }
或带有lambda
proc = ->(*args) {Kernel.puts(args) }