rubí 2.7.3p183
Aquí está la situación, este método:
def send_request(url, payload = {}, internal_proxy: true) ...y esta llamada
send_request('random_address', { foo: :bar })me devuelve:
Traceback (most recent call last): 5: from C:/Ruby27-x64/bin/irb.cmd:31:in `<main>' 4: from C:/Ruby27-x64/bin/irb.cmd:31:in `load' 3: from C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/irb-1.2.6/exe/irb:11:in `<top (required)>' 2: from (irb):4 1: from (irb):1:in `send_request' ArgumentError (unknown keyword: :foo)Entiendo que está tratando de hacer coincidir los parámetros opcionales, pero ¿por qué? ¿No debería la variable 'carga útil' recibir el parámetro? Traté de buscar una explicación, pero parece que no puedo encontrar ninguna.
Solía usar la variable internal_proxy como carga útil;
def send_request(url, payload = {}, internal_proxy = true)pero rubocop me avisa;
Use keyword arguments when defining method with boolean argument. (convention:Style/OptionalBooleanParameter)¿El hash en el primer parámetro no opcional siempre cuenta como argumento de palabra clave? Si es así, ¿cómo puedo obtener el comportamiento esperado que mencioné anteriormente? (a menos que sea una mala práctica por alguna razón)
¿Es esto un error, o hay una razón para esto?
En Ruby < 3.0, si el último argumento es un hash y el método que se llama acepta argumentos de palabras clave, siempre se convierte en argumentos de palabras clave.
Ruby 3.0 soluciona esto.
Debería actualizar a Ruby 3.0 si puede, o pensar en una API diferente.
Una posible solución para su problema es cambiar el orden de sus parámetros de la siguiente manera:
def send_request(url, internal_proxy: true, **payload) p payload p 'fooo' end send_request('asd', {foo: :bar}) send_request('asd') El código anterior debería realizar el comportamiento que está buscando. Además, la introducción del símbolo doble (**) recopila todas las palabras clave adicionales con nombre como un parámetro hash. La primera llamada imprimirá el hash {foo: :bar} y la segunda llamada imprimirá un hash vacío {} puede probar el fragmento anterior aquí