"最简单的"在Ruby中使用方法作为proc的方法

时间:2017-06-23 08:03:11

标签: ruby functional-programming

显然,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)的简写别名。

3 个答案:

答案 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