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"
2.0

È 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

2.1

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow