Ruby Language
Аргументы ключевого слова
Поиск…
замечания
Аргументы ключевого слова были введены в Ruby 2.0 и улучшены в Ruby 2.1 с добавлением необходимых аргументов ключевого слова.
Простой метод с аргументом ключевого слова выглядит следующим образом:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Напомним, что тот же метод без аргумента ключевого слова был бы таким:
def say(message = "Hello World")
puts message
end
say
# => "Hello World"
say "Today is Monday"
# => "Today is Monday"
Вы можете моделировать аргумент ключевого слова в предыдущих версиях Ruby с использованием параметра Hash. Это по-прежнему очень распространенная практика, особенно в библиотеках, обеспечивающих совместимость с версиями версии до версии 2.0:
def say(options = {})
message = options.fetch(:message, "Hello World")
puts
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Использование аргументов ключевого слова
Вы определяете аргумент ключевого слова в методе, указывая имя в определении метода:
def say(message: "Hello World")
puts message
end
say
# => "Hello World"
say message: "Today is Monday"
# => "Today is Monday"
Вы можете определить несколько аргументов ключевого слова, порядок определения не имеет значения:
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>"
Аргументы ключевого слова могут быть смешаны с позиционными аргументами:
def say(message, before: "<p>", after: "</p>")
puts "#{before}#{message}#{after}"
end
say "Hello World", before: "<span>", after: "</span>"
# => "<span>Hello World</span>"
Смешивание аргумента ключевого слова с позиционным аргументом было очень распространенным подходом до Ruby 2.1, поскольку невозможно определить требуемые аргументы ключевого слова .
Более того, в Ruby <2.0 было очень часто добавлять Hash
в конце определения метода для использования для необязательных аргументов. Синтаксис очень похож на аргументы ключевого слова, до тех пор, пока необязательные аргументы через Hash
не совместимы с аргументами ключевого слова Ruby 2.
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>"
Обратите внимание, что попытка передать неопределенный аргумент ключевого слова приведет к ошибке:
def say(message: "Hello World")
puts message
end
say foo: "Hello"
# => ArgumentError: unknown keyword: foo
Обязательные аргументы ключевого слова
Необходимые аргументы ключевого слова были введены в Ruby 2.1 в качестве улучшения аргументов ключевого слова.
Чтобы определить аргумент ключевого слова по мере необходимости, просто объявите аргумент без значения по умолчанию.
def say(message:)
puts message
end
say
# => ArgumentError: missing keyword: message
say message: "Hello World"
# => "Hello World"
Вы также можете смешивать требуемые и необязательные аргументы ключевых слов:
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>"
Использование произвольных аргументов ключевого слова с оператором splat
Вы можете определить метод для принятия произвольного количества аргументов ключевого слова с использованием оператора double splat ( **
):
def say(**args)
puts args
end
say foo: "1", bar: "2"
# {:foo=>"1", :bar=>"2"}
Аргументы записываются в Hash
. Вы можете манипулировать Hash
, например, для извлечения необходимых аргументов.
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
Использование оператора splat с аргументами ключевого слова предотвратит проверку аргументов ключевого слова, метод никогда не будет поднимать ArgumentError
в случае неизвестного ключевого слова.
Что касается стандартного оператора splat, вы можете повторно преобразовать аргументы Hash
в ключевые слова для метода:
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
Это обычно используется, когда вам нужно манипулировать входящими аргументами и передавать их базовому методу:
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