Почему аргумент splat в ruby ​​не используется постоянно?

Я знаю, что аргументы splat используются, когда мы не знаем количество аргументов, которые будут переданы. Я хотел знать, должен ли я использовать splat все время. Существуют ли какие-либо риски при использовании аргумента splat всякий раз, когда я передаю аргументы?


person poorvank    schedule 19.05.2013    source источник


Ответы (4)


Знак отлично подходит, когда метод, который вы пишете, действительно нуждается в произвольном количестве аргументов для такого метода, как Hash#values_at.

Однако в целом, если метод действительно требует фиксированного количества аргументов, гораздо понятнее иметь именованные аргументы, чем передавать массивы и помнить, какая позиция служит какой цели. Например:

def File.rename(old_name, new_name)
  ...
end

понятнее, чем:

def File.rename(*names)
  ...
end

Вам нужно будет прочитать документацию, чтобы узнать, было ли старое имя первым или вторым. Внутри метода File.rename потребуется реализовать обработку ошибок, если вы передали правильное количество аргументов. Поэтому, если вам не нужен знак, «обычные» аргументы обычно яснее.

Аргументы ключевых слов (новое в ruby ​​2.0) могут быть еще более понятными в момент использования, хотя их использование в стандартной библиотеке еще не получило широкого распространения.

person Frederick Cheung    schedule 19.05.2013
comment
+1 ...искренне нуждается... здесь ключевая фраза. На мой взгляд, постоянное искусственное использование * просто так создаст проблемы с обслуживанием и приведет к менее идиоматическому коду Ruby. - person the Tin Man; 19.05.2013
comment
Теперь это имеет гораздо больше смысла с именованными параметрами, чем раньше, например. при передаче хэша и преобразовании в именованные параметры через операнд **. - 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
person Spajus    schedule 19.05.2013

Знак знака хорошо использовать, когда вы работаете с массивом и хотите использовать только первый аргумент массива и делать что-то еще с остальной частью массива. Это намного быстрее, чем другие методы. Вот как его использует умный парень Джесси Фармер https://gist.github.com/jfarmer/d0f37717f6e7f6cebf72 и вот пример некоторых других способов, которыми я пытался решить проблему спиралевидного массива, и некоторые тесты для этого. https://gist.github.com/TalkativeTree/6724065

Проблема с ним в том, что он не легко усваивается. Если вы видели и использовали его раньше, отлично, но это может замедлить понимание другими людьми того, что делает код. Даже свой собственный, если вы давно его не смотрели, ха.

person TalkativeTree    schedule 27.09.2013

Splat позволяет интерпретировать аргумент как массив, и вам потребуется дополнительный шаг, чтобы удалить его. Без splat вам не нужны специальные действия для доступа к аргументу:

def foo x
  @x = x
end

но если вы поместите его в массив с помощью знака, вам потребуется дополнительный шаг, чтобы вывести его из массива:

def foo *x
  @x = x.first # or x.pop, x.shift, etc.
end

Нет причин вводить дополнительный шаг, если в этом нет необходимости.

person sawa    schedule 19.05.2013