Tengo un método, donde quiero usar parámetros de palabras clave y declaraciones de caso/cuándo, donde preferí usar símbolos:
def navigate_to(page:) case page when :inbox # some code when :archive # some code else # some code end end¿Es esta la sintaxis correcta al llamar al método?
navigate_to page: :inbox El : : parece un poco extraño.
La sintaxis del argumento de palabra clave es:
key: value Si la clave es la page y el valor es el símbolo :inbox de entrada, de hecho tiene:
page: :inboxTambién podría usar un argumento posicional en su lugar:
def navigate_to(page) # same as your code end navigate_to :inboxSí, la sintaxis correcta es navigate_to page: :inbox .
Si bien esto es Ruby común, es corto y equivalente para varias cosas diferentes. Primero, los frenos.
En realidad estás llamando:
navigate_to(page: :inbox)En segundo lugar, el patrón de argumento de palabra clave se origina a partir de hashes como argumentos. Antes de que hubiera argumentos de palabras clave, una forma común sería pasar un hash[1], así:
def navigate_to(options) page = options[:page] end navigate_to({ page: :inbox }) Pero cuando el último argumento en una llamada de método es un hash, uno puede omitir el {} .
Y por último, las claves reales en el hash. Hace un tiempo (1.8 -> 1.9 IIRC) se introdujo una versión corta para lo siguiente:
{ :page => 'Some Value' } , es decir, { page: 'Some Value' } . Cuando Some Value es un símbolo, se convierte en { page: :inbox } .
Entonces, tomando todo eso:
navigate_to page: :inboxSe origina de:
navigate_to({ :page => :inbox })Podría tener más sentido leerlo así, o saber que proviene de eso.
Y conozco Ruby, ni ruby-ist, como llaves, () , como se puede ver en el alucinante DSL de, por ejemplo, rspec, pero puedo aconsejar especialmente a los nuevos desarrolladores que las agreguen. A menudo hace que el código sea más comprensible.
navigate_to(page: :inbox) es probablemente más fácil de entender que navigate_to page: :inbox de entrada , especialmente cuando comienzas a llamar a través de otros métodos: navigate_to page page_from_session :user .
[1] Pero, para enfatizar, eso no es realmente lo que está sucediendo aquí. Los argumentos de palabras clave y los argumentos hash difieren, ahora que tenemos argumentos de palabras clave. esto solo muestra por qué la sintaxis es así.