Ruby Language
Argomenti della parola chiave
Ricerca…
Osservazioni
Gli argomenti delle parole chiave sono stati introdotti in Ruby 2.0 e migliorati in Ruby 2.1 con l'aggiunta degli argomenti delle parole chiave richieste .
Un semplice metodo con un argomento di parole chiave è simile al seguente:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Come promemoria, lo stesso metodo senza argomento parola chiave sarebbe stato:
def say(message = "Hello World")
puts message
end
say
# => "Hello World"
say "Today is Monday"
# => "Today is Monday"
È possibile simulare l'argomento delle parole chiave nelle versioni precedenti di Ruby utilizzando un parametro Hash. Questa è ancora una pratica molto comune, specialmente nelle librerie che fornisce compatibilità con le versioni di Ruby precedenti alla 2.0:
def say(options = {})
message = options.fetch(:message, "Hello World")
puts
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Utilizzo degli argomenti delle parole chiave
Si definisce un argomento parola chiave in un metodo specificando il nome nella definizione del metodo:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
È possibile definire più argomenti di parole chiave, l'ordine di definizione è irrilevante:
def say(message: "Hello World", before: "<p>", after: "</p>")
puts "#{before}#{message}#{after}"
end
say
# => "<p>Hello World</p>"
say message: "Today is Monday"
# => "<p>Today is Monday</p>"
say after: "</p><hr>", message: "Today is Monday"
# => "<p>Today is Monday</p><hr>"
Gli argomenti delle parole chiave possono essere combinati con argomenti posizionali:
def say(message, before: "<p>", after: "</p>")
puts "#{before}#{message}#{after}"
end
say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"
Mescolare argomenti di parole chiave con argomenti posizionali era un approccio molto comune prima di Ruby 2.1, perché non era possibile definire gli argomenti chiave richiesti .
Inoltre, in Ruby <2.0, era molto comune aggiungere un Hash
alla fine di una definizione di metodo da utilizzare per gli argomenti opzionali. La sintassi è molto simile agli argomenti delle parole chiave, al punto che gli argomenti opzionali tramite Hash
sono compatibili con gli argomenti delle parole chiave di Ruby 2.
def say(message, options = {})
before = option.fetch(:before, "<p>")
after = option.fetch(:after, "</p>")
puts "#{before}#{message}#{after}"
end
# The method call is syntactically equivalent to the keyword argument one
say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"
Si noti che il tentativo di passare un argomento di parole chiave non definito comporterà un errore:
def say(message: "Hello World")
puts message
end
say foo: "Hello"
# => ArgumentError: unknown keyword: foo
Argomenti della parola chiave richiesti
Gli argomenti della parola chiave richiesti sono stati introdotti in Ruby 2.1, come miglioramento degli argomenti delle parole chiave.
Per definire un argomento di parole chiave come richiesto, dichiara semplicemente l'argomento senza un valore predefinito.
def say(message:)
puts message
end
say
# => ArgumentError: missing keyword: message
say message: "Hello World"
# => "Hello World"
Puoi anche mescolare gli argomenti delle parole chiave richiesti e non richiesti:
def say(before: "<p>", message:, after: "</p>")
puts "#{before}#{message}#{after}"
end
say
# => ArgumentError: missing keyword: message
say message: "Hello World"
# => "<p>Hello World</p>"
say message: "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"
Utilizzo di argomenti di parole chiave arbitrarie con operatore splat
È possibile definire un metodo per accettare un numero arbitrario di argomenti parola chiave utilizzando l'operatore double splat ( **
):
def say(**args)
puts args
end
say foo: "1", bar: "2"
# {:foo=>"1", :bar=>"2"}
Gli argomenti sono catturati in un Hash
. È possibile manipolare l' Hash
, ad esempio per estrarre gli argomenti desiderati.
def say(**args)
puts args[:message] || "Message not found"
end
say foo: "1", bar: "2", message: "Hello World"
# Hello World
say foo: "1", bar: "2"
# Message not found
L'utilizzo dell'operatore splat con gli argomenti delle parole chiave impedirà la convalida degli argomenti delle parole chiave, il metodo non genererà mai ArgumentError
in caso di parola chiave sconosciuta.
Per quanto riguarda l'operatore standard di splat, puoi convertire nuovamente un Hash
in argomenti di parole chiave per un metodo:
def say(message: nil, before: "<p>", after: "</p>")
puts "#{before}#{message}#{after}"
end
args = { message: "Hello World", after: "</p><hr>" }
say(**args)
# <p>Hello World</p><hr>
args = { message: "Hello World", foo: "1" }
say(**args)
# => ArgumentError: unknown keyword: foo
Questo è generalmente usato quando devi manipolare gli argomenti in entrata e passarli a un metodo sottostante:
def inner(foo:, bar:)
puts foo, bar
end
def outer(something, foo: nil, bar: nil, baz: nil)
puts something
params = {}
params[:foo] = foo || "Default foo"
params[:bar] = bar || "Default bar"
inner(**params)
end
outer "Hello:", foo: "Custom foo"
# Hello:
# Custom foo
# Default bar