Ruby匿名类作为第一类函数

use*_*217 1 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"
Run Code Online (Sandbox Code Playgroud)

有谁知道更好的方法?

Aet*_*rus 7

实际上,Ruby根本没有函数,只有方法.因此,如果您想将方法传递给另一个方法,则可以

def g(f)
  f.call
end

g('123'.method(:to_i))
Run Code Online (Sandbox Code Playgroud)

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