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"
2,0

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

2.1

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow