Почему сплат используется здесь внутри определения массива? - PullRequest
5 голосов
/ 13 сентября 2009
def initialize(apps, catch=404)
  @apps = []; @has_app = {}
  apps.each { |app| add app }

  @catch = {}
  [*catch].each { |status| @catch[status] = true }
end

В этом методе из Rack :: Cascade , для каких целей splat(*) служит в коде [*catch]?

Я думал, что в аргументах метода использовался знак "сплат", чтобы указать, когда у вас будет неопределенное количество параметров.

Имеет ли сплат здесь другое значение?

Ответы [ 3 ]

5 голосов
/ 13 сентября 2009

Создает один плоский массив для улова

Я не уверен, что кто-то полностью понимает оператор сплат. Много раз он удаляет один уровень «массивности», но не удаляет последний уровень.

По крайней мере, в этом случае можно получить его. Он создает один уровень массива для параметра catch независимо от того, является ли catch единственным числом или массивом чисел.

>> t = [*404]
=> [404]
>> t = [*[404,405,406]]
=> [404, 405, 406]
1 голос
/ 13 сентября 2009

Я думаю, что лучший способ понять это - посмотреть, что происходит в irb.

Итак, давайте инициализируем пустой хеш, @catch:

>> @catch = {}
=> {}
>> @catch.class
=> Hash

Теперь посмотрим, что произойдет, когда параметр catch перейдет к значению по умолчанию 404:

>> catch=404
=> 404
>> [*catch].each { |status| @catch[status] = true }
=> [404]
>> @catch[404]
=> true

Это дает нам лучшее представление о том, что происходит. Мы можем видеть, что оператор splat используется для создания Hash ответов. Номера ответов используются как key, а истина установлена ​​как value. Поэтому независимо от того, сколько предметов у нас в улове, мы все равно можем построить Hash.

>> catch=[404, 301, 302, 303, 403]
=> [404, 301, 302, 303, 403]
>> [*catch].each { |status| @catch[status] = true }
=> [404, 301, 302, 303, 403]
>> @catch
=> {302=>true, 303=>true, 403=>true, 404=>true, 301=>true}

Надеюсь, это поможет. Вот ссылка, которая немного помогла мне:

http://theplana.wordpress.com/2007/03/03/ruby-idioms-the-splat-operator/

0 голосов
/ 13 сентября 2009

Другой способ взглянуть на это: знак l-значения является жадным и содержит как можно больше соответствующих значений r.

...