Skip to content

Instantly share code, notes, and snippets.

@Pimentoso
Last active December 11, 2019 14:11
Show Gist options
  • Save Pimentoso/87ab970c6ce7348a263d646887fcc5d7 to your computer and use it in GitHub Desktop.
Save Pimentoso/87ab970c6ce7348a263d646887fcc5d7 to your computer and use it in GitHub Desktop.
Ruby 2.7 keyword argument

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment