Аргументы с ключевыми словами имеют несколько явных преимуществ, которых никто не затронул.
Во-первых, вы не связаны с порядком аргументов. Таким образом, в случае, когда у вас иногда может быть нулевой аргумент, это выглядит намного чище:
def print_greeting(name, message = "Hello")
puts "#{message}, #{name}"
end
print_greeting("John Connor", "Hasta la vista")
Если вы используете аргументы ключевого слова:
def print_greeting(message: "Hello", name:)
puts "#{message}, #{name}"
end
print_greeting(message: "Hasta la vista", name: "John Connor")
или даже
print_greeting(name: "John Connor", message: "Goodbye")
Это устраняет необходимость запоминать порядок аргументов. Однако недостатком является то, что вы должны помнить имя аргумента. Это должно быть более или менее интуитивно понятным и, возможно, приводит к более тщательному рассмотрению сигнатур методов.
Еще одно преимущество использования аргументов с ключевыми словами заключается в том, что у вас есть метод, которому в будущем могут потребоваться дополнительные аргументы.
def create_person(name:, age:, height:)
# make yourself some friends
end
Что, если ваши системные требования теперь должны знать о любимом шоколадном батончике человека или о том, есть ли у него лишний вес (из-за того, что он потребляет слишком много своих любимых шоколадных батончиков). Как вы можете использовать аргументы ключевых слов для этого? Простой:
def create_person(name:, age:, height:, favorite_candy:, overweight: true)
# make yourself some fat friends
end
Перед ключевыми аргументами всегда был хеш, но это привело к гораздо большему количеству стандартного кода для извлечения и назначения переменной. Стандартный код == больше печатать == больше потенциальных опечаток == меньше времени на написание потрясающего рубинового кода.
def old_way(name, opts={})
age = opts[:age]
height = opts[:height]
# all the benefits as before, more arthritis and headaches
end
Если вы просто настраиваете метод, который принимает один аргумент и, скорее всего, никогда не потребуется его изменять:
def say_full_name(first_name, last_name)
puts "#{first_name} #{last_name}"
end
Тогда следует избегать аргументов с ключевыми словами, так как это незначительно влияет на производительность.
person
Davey
schedule
28.01.2015