ruby - 你能用 lambda 或仿函数迭代一组声明的函数吗?

问题描述 投票:0回答:1

如果我有 n 个函数,在 ruby 中:

def a
    puts "a"
end

def b
    puts "b"
end

有什么方法可以像

一样进行迭代
[a,b].each do |x|
    puts "running #{x.name}
    run a
end

我有一个想法是我可以注册一个函子数组什么的,或者 lambda 可以帮忙吗?

感谢您的帮助, 凯文

ruby lambda functor
1个回答
0
投票

在符号数组上调用对象#send

在 Ruby 中,

def
关键字定义对象方法而不是函数。 Ruby 最接近函数的是块、过程和 lambda,但“函数”在 Ruby 中并不是真正的一流概念。

方法存在于一个对象上,但如果您在顶级命名空间中声明它们(例如在类之外),那么它们将附加到一个特殊的顶级绑定,该绑定有点像全局命名空间。它不是,真的,但是当试图从其他语言推理 Ruby 时,它是一个有用的类比。

此外,当您定义一个方法时,Ruby 会为该方法返回一个 Symbol。在定义方法时,您可以在像 irb 这样的交互式 REPL 中看到这一点,因为 Ruby 在定义方法时返回一个 Symbol。虽然有一些方法可以将方法名称作为 String 调用,但在 Ruby 内部将方法和类名称存储为 Symbol 对象,所以这就是我要演示的内容。例如:

def a
    puts "a"
end
#=> :a

有了这些知识,就可以很容易地迭代一组方法并使用 Object#send 调用它们。例如:

def a
    p "a"
end

def b
    p "b"
end

[:a, :b].map { send _1 }
#=> ["a", "b"]

请注意,#puts 总是返回 nil,因此当您想要 return 映射生成的值而不是简单地将它们发送到终端时,使用 Kernel#p 更有意义。如果您更愿意返回

[nil, nil]
,那么请继续并保留#puts。

© www.soinside.com 2019 - 2024. All rights reserved.