使用 `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) }
很难识别如下代码的用法:
[: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) }