Я знаю, что аргументы splat используются, когда мы не знаем количество аргументов, которые будут переданы. Я хотел знать, должен ли я использовать splat все время. Существуют ли какие-либо риски при использовании аргумента splat всякий раз, когда я передаю аргументы?
Почему аргумент splat в ruby не используется постоянно?
Ответы (4)
Знак отлично подходит, когда метод, который вы пишете, действительно нуждается в произвольном количестве аргументов для такого метода, как Hash#values_at
.
Однако в целом, если метод действительно требует фиксированного количества аргументов, гораздо понятнее иметь именованные аргументы, чем передавать массивы и помнить, какая позиция служит какой цели. Например:
def File.rename(old_name, new_name)
...
end
понятнее, чем:
def File.rename(*names)
...
end
Вам нужно будет прочитать документацию, чтобы узнать, было ли старое имя первым или вторым. Внутри метода File.rename
потребуется реализовать обработку ошибок, если вы передали правильное количество аргументов. Поэтому, если вам не нужен знак, «обычные» аргументы обычно яснее.
Аргументы ключевых слов (новое в ruby 2.0) могут быть еще более понятными в момент использования, хотя их использование в стандартной библиотеке еще не получило широкого распространения.
*
просто так создаст проблемы с обслуживанием и приведет к менее идиоматическому коду Ruby.
- person the Tin Man; 19.05.2013
**
.
- person Adam Eberlin; 27.08.2014
Для метода, который принимает произвольное количество параметров, хэш опций является фактическим решением:
def foo(options = {})
# One way to do default values
defaults = { bar: 'baz' }
options = defaults.merge(options)
# Another way
options[:bar] ||= 'baz'
bar = options[bar]
do_stuff_with(bar)
end
Знак знака хорошо использовать, когда вы работаете с массивом и хотите использовать только первый аргумент массива и делать что-то еще с остальной частью массива. Это намного быстрее, чем другие методы. Вот как его использует умный парень Джесси Фармер https://gist.github.com/jfarmer/d0f37717f6e7f6cebf72 и вот пример некоторых других способов, которыми я пытался решить проблему спиралевидного массива, и некоторые тесты для этого. https://gist.github.com/TalkativeTree/6724065
Проблема с ним в том, что он не легко усваивается. Если вы видели и использовали его раньше, отлично, но это может замедлить понимание другими людьми того, что делает код. Даже свой собственный, если вы давно его не смотрели, ха.
Splat позволяет интерпретировать аргумент как массив, и вам потребуется дополнительный шаг, чтобы удалить его. Без splat вам не нужны специальные действия для доступа к аргументу:
def foo x
@x = x
end
но если вы поместите его в массив с помощью знака, вам потребуется дополнительный шаг, чтобы вывести его из массива:
def foo *x
@x = x.first # or x.pop, x.shift, etc.
end
Нет причин вводить дополнительный шаг, если в этом нет необходимости.