显然,method(:method_name).to_proc
有效,但我正在寻找一种更简洁的方法 - 或者即使在技术上做正确的事情,我也不会这样做。
我正在考虑定义to_proc
的混合(只有proc
会更好,但有些天才使它成为Kernel
中的私有方法
module ProcifiedMethods
def to_proc(sym)
method(sym).to_proc
end
end
然后致电
to_proc(:method_name)[*args]
但有人会认为Ruby核心中已经存在类似的内容了吗?
我的一般动机是将功能编程概念与OOP交替使用。在一些没有副作用的mixin中有一个方法吗?好吧......用它作为一个过程!咖喱,构成它,所有其他好东西。
无论如何,这是一般的想法:)
问题:是否有一种更简单,经过战斗测试,理想情况下将红宝石内核转换为触发器的方法? (即method(:method_name).to_proc
)的简写别名。
答案 0 :(得分:4)
如果您使用此proc作为方法参数,则可以使用let viewControllers = navController?.viewControllers
for aViewController in viewControllers! {
if aViewController .isKind(of: (MyClass?.classForCoder)!) {
_ = navController?.popToViewController(aViewController, animated: true)
}
}
一元运算符,例如&
如果在object上定义了方法,那么这也适用:foo(&method(:method_name))
答案 1 :(得分:1)
首先,proc
执行与to_proc
不同的操作。 to_proc
为您提供方法的proc表示。 proc
创建一个给定块的proc(或者如果没有给出块,则使用调用该方法的块)。
其次,method(:name).to_proc
相当简单。您可以定义一种简化它的方法,但是对于它的作用 - 我会说它非常简单。
所以对于直接的问题 - 不,没有这样的方式。
为什么它必须稍微更明确的一个论点是,与纯函数式语言不同,这里的方法(以及proc)与实例绑定。
class Foo
attr_accessor :bar
def calculate(baz)
baz * bar
end
end
foo = Foo.new
pro = foo.method(:calculate).to_proc
foo.bar = 7
pro.call(6) # => 42
foo.bar = 9
pro.call(6) # => 54
答案 2 :(得分:0)
Stefan给出了一个很好的回复,Method
的行为与/ Proc
的方法相同/答案,所以答案是使用Method
作为{的最简单方法{1}}只是使用Proc
来回答Method
,#call
,#[]
以及#curry
所有其他有趣的内容。
这使Proc
对标准FP shennanigans有用。一个例子:
Method
如果有人有兴趣,this is the use case