Рубиновый метод Double Splat против Hash - PullRequest
4 голосов
/ 30 сентября 2019

При работе с методом, который принимает известное число аргументов плюс хэш опций, есть ли разница / преимущество в захвате опций в двойном слоте?

рассмотреть

def method_a(a, **options)
    puts a
    puts options
end

против

def method_b(a, options = {})
   puts a
   puts options
end

Эти два эквивалента? Я думаю, что method_b более читабелен, но все же я вижу много кода, идущего с method_a. Есть ли причина для использования двойного сплата для опций , когда обычные (не опциональные) аргументы захватываются без сплата ?

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

Ну, это зависит от того, что вы подразумеваете под «известным числом аргументов», особенно для ситуации, когда у вас есть аргументы ключевого слова плюс любое количество других аргументов ключевого слова , например:

def foo(i, keyword_1: "default", **other_keywords)
end

Я могу назвать это как

foo(6, keyword_1: "asd", other: "keyword")

. И {other: "keyword"} будет содержаться в other_keywords, тогда как к keyword_1 можно обращаться напрямую как к локальной переменной.

Без оператора ** это поведение более громоздко для реализации, что-то вроде этого:

def foo(i, opts={})
 keyword_1 = opts.delete(:keyword_1) || "default"
 # now `opts` is the same as `other_keywords`
end
0 голосов
/ 30 сентября 2019

Другое отличие состоит в том, что версия ** захватывает аргументы остальных ключевых слов. Аргументы ключевых слов представлены символами, что приводит к следующему поведению:

def a(**options)
  options
end

def b(options = {})
  options
end
a(a: 1) #=> {:a=>1}
a('a' => 1) #=> ArgumentError (wrong number of arguments (given 1, expected 0))

b(a: 1) #=> {:a=>1}
b('a' => 1) #=> {"a"=>1}
def c(hash_options = {}, **keyword_options)
  [hash_options, keyword_options]
end
# symbols are extracted and used as rest keyword arguments
c('a' => 1, b: 2, 'c' => 3, d: 4) #=> [{"a"=>1, "c"=>3}, {:b=>2, :d=>4}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...