Ruby匿名类作为第一类函数

时间:2016-07-13 22:36:27

标签: ruby first-class-functions

Ruby没有第一类函数;虽然它有procs和lambdas,但这些众所周知地需要很大的开销。 (Python具有一流的功能,显然没有开销。) 我发现第一类函数可以使用匿名类进行模拟,如下所示:

f = Class.new { def self.f; puts 'hi'; end }

def g(fun); fun; end

g(f.f)
# => "hi"

有没有人知道更好的方法?

2 个答案:

答案 0 :(得分:7)

事实上,Ruby根本没有功能,只有方法。因此,如果您想将方法传递给另一个方法,您可以

def g(f)
  f.call
end

g('123'.method(:to_i))

这不像Python那么简洁,但是Ruby必须为在方法调用中省略括号的能力付出代价。我认为省略括号是使Ruby闪耀的事情之一,因为这使得在纯Ruby中实现DSL变得更加容易。

答案 1 :(得分:1)

Ruby有proclambda s(Proc类的两个实例)和Method s,所有这些都是近似的第一类函数。 Lambdas最接近真正的第一类函数:它们在调用时检查参数的数量并创建一个新的调用上下文,使return只从lambda返回。相反,过程只是具体的代码块;他们没有检查他们的参数数量,而return导致封闭的方法返回,而不仅仅是proc。

方法对象允许您将未调用的方法存储在变量中,并使用隐含的调用方。没有创建匿名方法的语法,但是你说的是一流函数,而不是匿名函数。除了调用者之外,他们基本上是lambdas,其身体是引用方法的主体。

我不确定匿名类对你的影响比上述解决方案更好,但它肯定远离真正的一流函数。它更像是在将闭包添加到语言之前我们必须在Java中近似它们的方式。