Ruby Language
Keyword-Argumente
Suche…
Bemerkungen
Schlüsselwortargumente wurden in Ruby 2.0 eingeführt und in Ruby 2.1 durch das Hinzufügen erforderlicher Schlüsselwortargumente verbessert.
Eine einfache Methode mit einem Schlüsselwortargument sieht wie folgt aus:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Zur Erinnerung wäre die gleiche Methode ohne Keyword-Argument gewesen:
def say(message = "Hello World")
puts message
end
say
# => "Hello World"
say "Today is Monday"
# => "Today is Monday"
Sie können Schlüsselwortargumente in früheren Ruby-Versionen mithilfe eines Hash-Parameters simulieren. Dies ist immer noch eine sehr verbreitete Praxis, insbesondere in Bibliotheken, die Kompatibilität mit Ruby-Versionen vor 2.0 bieten:
def say(options = {})
message = options.fetch(:message, "Hello World")
puts
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Schlüsselwortargumente verwenden
Sie definieren ein Schlüsselwortargument in einer Methode, indem Sie den Namen in der Methodendefinition angeben:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Sie können mehrere Schlüsselwortargumente definieren. Die Reihenfolge der Definitionen ist irrelevant:
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>"
Schlüsselwortargumente können mit Positionsargumenten gemischt werden:
def say(message, before: "<p>", after: "</p>")
puts "#{before}#{message}#{after}"
end
say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"
Das Mischen von Schlüsselwortargumenten mit Positionsargumenten war vor Ruby 2.1 ein sehr verbreiteter Ansatz, da erforderliche Schlüsselwortargumente nicht definiert werden konnten .
In Ruby <2.0 war es außerdem üblich, am Ende einer Methodendefinition einen Hash
hinzuzufügen, um optionale Argumente zu verwenden. Die Syntax ist den Schlüsselwortargumenten sehr ähnlich, bis zu dem Punkt, an dem optionale Argumente über Hash
mit Ruby-2-Schlüsselwortargumenten kompatibel sind.
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>"
Beachten Sie, dass der Versuch, ein nicht definiertes Schlüsselwortargument zu übergeben, zu einem Fehler führt:
def say(message: "Hello World")
puts message
end
say foo: "Hello"
# => ArgumentError: unknown keyword: foo
Erforderliche Schlüsselwortargumente
Erforderliche Schlüsselwortargumente wurden in Ruby 2.1 als Verbesserung der Schlüsselwortargumente eingeführt.
Um ein Schlüsselwortargument nach Bedarf zu definieren, deklarieren Sie das Argument einfach ohne Standardwert.
def say(message:)
puts message
end
say
# => ArgumentError: missing keyword: message
say message: "Hello World"
# => "Hello World"
Sie können auch erforderliche und nicht erforderliche Schlüsselwortargumente kombinieren:
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>"
Verwenden beliebiger Schlüsselwortargumente mit dem Splat-Operator
Sie können eine Methode definieren, um eine beliebige Anzahl von Schlüsselwortargumenten mit dem Double-Splat- Operator ( **
) zu akzeptieren:
def say(**args)
puts args
end
say foo: "1", bar: "2"
# {:foo=>"1", :bar=>"2"}
Die Argumente werden in einem Hash
erfasst. Sie können den Hash
, um beispielsweise die gewünschten Argumente zu extrahieren.
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
Die Verwendung eines Splat-Operators mit Schlüsselwortargumenten verhindert die Validierung von Schlüsselwortargumenten. Die Methode löst niemals ein ArgumentError
aus, wenn das Schlüsselwort unbekannt ist.
Wie beim Standard-Splat-Operator können Sie einen Hash
für eine Methode erneut in Schlüsselwortargumente konvertieren:
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
Dies wird im Allgemeinen verwendet, wenn Sie eingehende Argumente bearbeiten und an eine zugrunde liegende Methode übergeben müssen:
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