很难识别如下代码的用法:
[:create, :update, :pause].each { |action| send("to_#{action}") }
还有其他原因表明这是一种反模式吗?
很难识别如下代码的用法:
[: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) }