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

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

2.1

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow