Riassunto brevemente: in ruby 2.6 o precedenti, i keyword argument erano solo zucchero sintattico per estrarre facilmente argomenti da un hash che si passa come ultimo argomento al metodo. Ruby 2.7 e successivi faranno distinzione netta da argument normali e keyword argument. In pratica:
def metodo(param1:, param2: param3:)
puts "#{param1}/#{param2}/#{param3}"
end
params = {param1: 'a', param2: 'b', param3: 'c'}
metodo(params) # funziona su ruby 2.6, ma non si puo' piu' fare, warning su ruby 2.7, errore su ruby 3
metodo({param1: 'a', param2: 'b', param3: 'c'}) # nemmeno questo si puo' piu' fare
metodo(param1: 'a', param2: 'b', param3: 'c') # tutto ok funziona dappertutto
In pratica gli oggetti hash passati come argomenti saranno usati proprio come oggetti hash.
Il warning che viene dato e':
warning: The last argument is used as the keyword parameter
Pezza:
metodo(**params) # usare il doppio splat operator
Non cambia nulla per gli argomenti che accettano un hash, si puo' ancora passare l'hash senza graffe.
def metodo(options = {})
puts options
end
params = {param1: 'a', param2: 'b', param3: 'c'}
metodo(params) # tutto ok
metodo({param1: 'a', param2: 'b', param3: 'c'}) # tutto ok
metodo(param1: 'a', param2: 'b', param3: 'c') # tutto ok
Cosa fare:
- accertarsi che tutte le chiamate a metodi che hanno keyword arguments non vengano fatti con le graffe
- usare l'operatore ** se proprio ce n'e' bisogno ma io eviterei
- cercare di non fare mischioni brutti nelle firme dei metodi
def metodo(obbligatorio, facoltativo = {}) # ok
def metodo(obbligatorio, facoltativo: {}) # ok
def metodo(obbligatorio, facoltativo = {}, keyword:) # ok ma fa schifissimo, non mescolare argomenti normali e keywords