Ruby Language
Nyckelordargument
Sök…
Anmärkningar
Sökordsargument introducerades i Ruby 2.0 och förbättrades i Ruby 2.1 med tillägg av nödvändiga sökordargument.
En enkel metod med ett nyckelordargument ser ut som följande:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Som en påminnelse skulle samma metod utan sökordsargument ha varit:
def say(message = "Hello World")
puts message
end
say
# => "Hello World"
say "Today is Monday"
# => "Today is Monday"
Du kan simulera nyckelordargument i tidigare Ruby-versioner med en Hash-parameter. Detta är fortfarande en mycket vanlig praxis, särskilt i bibliotek som ger kompatibilitet med pre-2.0 Ruby-versioner:
def say(options = {})
message = options.fetch(:message, "Hello World")
puts
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Med hjälp av nyckelordargument
Du definierar ett nyckelordargument i en metod genom att ange namnet i metoddefinitionen:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Du kan definiera flera sökordargument, definitionsordningen är 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>"
Sökordsargument kan blandas med positionsargument:
def say(message, before: "<p>", after: "</p>")
puts "#{before}#{message}#{after}"
end
say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"
Att blanda nyckelordargument med positionsargument var ett mycket vanligt tillvägagångssätt före Ruby 2.1, eftersom det inte var möjligt att definiera nödvändiga sökordargument .
Dessutom, i Ruby <2.0, var det mycket vanligt att lägga till en Hash
i slutet av en metoddefinition som kan användas för valfria argument. Syntaxen är mycket lik sökordsargument, till den punkt där valfria argument via Hash
är kompatibla med Ruby 2 sökordargument.
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>"
Observera att försök att passera ett inte definierat sökordargument kommer att resultera i ett fel:
def say(message: "Hello World")
puts message
end
say foo: "Hello"
# => ArgumentError: unknown keyword: foo
Obligatoriska sökordargument
Obligatoriska nyckelordargument introducerades i Ruby 2.1 som en förbättring av sökordsargument.
För att definiera ett nyckelordargument som krävs, förklar helt enkelt argumentet utan ett standardvärde.
def say(message:)
puts message
end
say
# => ArgumentError: missing keyword: message
say message: "Hello World"
# => "Hello World"
Du kan också blanda obligatoriska och icke-nödvändiga sökordargument:
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>"
Använda godtyckliga sökordargument med splatoperatören
Du kan definiera en metod för att acceptera ett godtyckligt antal nyckelordargument med hjälp av operatören dubbel splat ( **
):
def say(**args)
puts args
end
say foo: "1", bar: "2"
# {:foo=>"1", :bar=>"2"}
Argumenten fångas i en Hash
. Du kan manipulera Hash
, till exempel för att extrahera de önskade argumenten.
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
Om du använder en splat-operatör med nyckelordargument förhindrar validering av nyckelordargument, metoden kommer aldrig att höja ett ArgumentError
vid okänt nyckelord.
När det gäller standard splatoperatören kan du omvandla en Hash
till sökordargument för en metod:
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
Detta används vanligtvis när du behöver manipulera inkommande argument och skicka dem till en underliggande metod:
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