1

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

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

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

4

2 回答 2

5

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

于 2016-06-06T02:38:48.950 回答
1

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

create
update
pause

当数组不一定是静态的时,您可以使用它,可能会进行修改,尤其是在 DSL 的上下文中使用时。

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

before_validation :check_sanity
before_validation lambda { do_something(1) }
于 2016-06-06T05:41:22.487 回答