如果我有 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 中,
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。