Ruby Language
Trefwoord argumenten
Zoeken…
Opmerkingen
Trefwoordargumenten werden geïntroduceerd in Ruby 2.0 en verbeterd in Ruby 2.1 met de toevoeging van vereiste trefwoordargumenten.
Een eenvoudige methode met een trefwoordargument ziet er als volgt uit:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Ter herinnering, dezelfde methode zonder trefwoordargument zou zijn geweest:
def say(message = "Hello World")
puts message
end
say
# => "Hello World"
say "Today is Monday"
# => "Today is Monday"
U kunt trefwoordargumenten in vorige Ruby-versies simuleren met behulp van een Hash-parameter. Dit is nog steeds een veel voorkomende praktijk, vooral in bibliotheken die compatibiliteit biedt met pre-2.0 Ruby-versies:
def say(options = {})
message = options.fetch(:message, "Hello World")
puts
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Gebruik trefwoordargumenten
U definieert een trefwoordargument in een methode door de naam op te geven in de methodedefinitie:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
U kunt meerdere trefwoordargumenten definiëren, de volgorde van de definities is niet relevant:
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>"
Trefwoordargumenten kunnen worden gemengd met positionele argumenten:
def say(message, before: "<p>", after: "</p>")
puts "#{before}#{message}#{after}"
end
say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"
Het combineren van trefwoordargument met positioneel argument was een veel voorkomende aanpak vóór Ruby 2.1, omdat het niet mogelijk was om vereiste trefwoordargumenten te definiëren.
Bovendien was het in Ruby <2.0 heel gebruikelijk om aan het einde van een methodedefinitie een Hash
toe te voegen voor optionele argumenten. De syntaxis lijkt sterk op trefwoordargumenten, tot het punt waarop optionele argumenten via Hash
compatibel zijn met Ruby 2-trefwoordargumenten.
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>"
Houd er rekening mee dat als u probeert een niet-gedefinieerd trefwoordargument door te geven, er een fout optreedt:
def say(message: "Hello World")
puts message
end
say foo: "Hello"
# => ArgumentError: unknown keyword: foo
Vereiste trefwoordargumenten
Vereiste trefwoordargumenten werden geïntroduceerd in Ruby 2.1, als een verbetering van trefwoordargumenten.
Om een trefwoordargument te definiëren zoals vereist, declareert u het argument zonder een standaardwaarde.
def say(message:)
puts message
end
say
# => ArgumentError: missing keyword: message
say message: "Hello World"
# => "Hello World"
U kunt ook vereiste en niet-vereiste zoekwoordargumenten combineren:
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>"
Willekeurige trefwoordargumenten gebruiken met splat-operator
U kunt een methode definiëren om een willekeurig aantal trefwoordargumenten te accepteren met de operator dubbele splat ( **
):
def say(**args)
puts args
end
say foo: "1", bar: "2"
# {:foo=>"1", :bar=>"2"}
De argumenten worden vastgelegd in een Hash
. U kunt de Hash
manipuleren, bijvoorbeeld om de gewenste argumenten te extraheren.
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
Het gebruik van de splat-operator met trefwoordargumenten voorkomt validatie van trefwoordargumenten, de methode zal nooit een ArgumentError
genereren in het geval van een onbekend trefwoord.
Wat de standaard splat-operator betreft, u kunt een Hash
opnieuw omzetten in trefwoordargumenten voor een methode:
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
Dit wordt meestal gebruikt wanneer u inkomende argumenten moet manipuleren en doorgeven aan een onderliggende methode:
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