Поиск…


замечания

Аргументы ключевого слова были введены в 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"
2,0

Вы можете моделировать аргумент ключевого слова в предыдущих версиях 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

Обязательные аргументы ключевого слова

2,1

Необходимые аргументы ключевого слова были введены в 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow