使用 `Object#send` 方法作为最佳实践

Usage of `Object#send` method as a best practice

很难识别如下代码的用法:

[:create, :update, :pause].each { |action| send("to_#{action}") }

还有其他原因表明这是反模式吗?

这不是反模式。它是语言的一部分。由于上述原因,您应该避免使用它,但有时它是唯一的选择。我认为在性能方面没有任何重大缺陷。至于保持 OOP,你应该建议切换到 public_send - 这是推荐的方式。

有理由使用它,也有理由避免它。这个简单的例子是一个反模式的例子,因为它是一个固定的数组,这样写会更简洁:

create
update
pause

您需要使用它的情况是数组不一定是静态的,可能会有修改,尤其是 在 DSL 上下文中使用时。

Rails 将此用于 before_validation 处理程序链,例如,它有一个要调用的符号引用或 Proc 函数列表:

before_validation :check_sanity
before_validation lambda { do_something(1) }