Parece una pregunta ridículamente simple, pero ¿cuál es la forma más corta/más idiomática de reescribir esto en Ruby?¿Cuál es la forma más corta/más idiomática de determinar si una variable es cualquiera de una lista de valores?
if variable == :a or variable == :b or variable == :c or variable == :d # etc.
vi esta solución:
if [:a, :b, :c, :d].include? variable
pero esto no siempre es funcionalmente equivalente - Creo Array#include?
se ve en realidad para ver si el objeto variable está contenida en la lista; no tiene en cuenta que el objeto puede implementar su propia prueba de igualdad con def ==(other)
.
Según lo observado por los comentaristas útiles a continuación, esa explicación no es correcta. include?
usa ==
pero usa el método ==
de los elementos en la matriz. En mi ejemplo, son los símbolos, en lugar del método ==
de la variable. Eso explica por qué no es equivalente a mi primer ejemplo de código.
(Tomemos, por ejemplo, Rails Mime::Type
aplicación: request.format == :html
puede devolver cierto, pero [:html].include?(request.format)
volverá falso, como request.format
es una instancia de Mime :: Tipo, no un símbolo.)
los mejores que he hasta ahora es:
if [:a, :b, :c, :d].select {|f| variable == f}.any?
pero me parece un poco engorroso. ¿Alguien tiene mejores sugerencias?
creo que el "Cualquier" sintaxis parece bastante limpio. Pero, soy C# y tt solo refleja cómo se ve LINQ, así que estoy predispuesto. –
La documentación dice: Array # include? Devuelve verdadero si el objeto dado está presente en uno mismo (es decir, si cualquier objeto == un Objeto), de lo contrario es falso. – khelll
Me pregunto si la implementación de un método isOneOf? (Array) en la clase Object no se considera una buena práctica en ruby, es decir, meterse con las clases base (obviamente, no tengo experiencia con ruby) ... de todos modos, sería estar bien si alguien puede publicar tal método .... – opensas