1

Ruby 没有一流的功能;尽管它有 procs 和 lambdas,但众所周知,这些都需要大量开销。(Python 有一流的函数,显然没有开销。)我突然想到,可以通过使用匿名类来模拟一流的函数,如下所示:

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

def g(fun); fun; end

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

有谁知道更好的方法?

4

2 回答 2

7

事实上,Ruby 根本没有函数,只有方法。所以如果你想将一个方法传递给另一个方法,你可以

def g(f)
  f.call
end

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

这不如 Python 简洁,但这是 Ruby 必须为在方法调用中省略括号的能力付出的代价。我认为省略括号是让 Ruby 大放异彩的原因之一,因为这使得在纯 Ruby 中实现 DSL 变得更加容易。

于 2016-07-13T23:59:24.707 回答
1

Ruby 有procs 和lambdas(都是Proc类的实例)和Methods,它们都近似于一等函数。Lambda 最接近真正的一流函数:它们在调用时检查参数的数量并创建一个新的调用上下文,以便return从 lambda 中返回。相比之下,proc 只是具体化的代码块;他们不检查参数的数量,并且 areturn导致封闭方法返回,而不仅仅是 proc。

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

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

于 2016-07-14T00:17:53.413 回答