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

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

2,1

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow