Использование блока для поиска значений, соответствующих критериям - PullRequest
1 голос
/ 14 мая 2011

Для меня это имеет смысл:

triple = dice.collect {|value| if (dice.count(value) >= 3)} ---> Syntax error

OR

triple = dice.collect {|value| dice.count(value) >= 3} ----> Array of true/false

Я хочу получить значение числа, а не истинность или ложность dice.count (). Я знаю, что должен быть простым способом сделать это.

Ответы [ 3 ]

5 голосов
/ 14 мая 2011

Звучит так, как вы хотите Array#select, а не Array#collect (также известный как Array#map).

collect/map будет принимать каждый value и помещать результаты вашего блока в массив.Вот почему вы видите массив true / false.

select будет принимать каждый value и возвращать его как член массива, если блок оценивается как true:

triple = dice.select{ |value| dice.count(value) >= 3 }
1 голос
/ 14 мая 2011

Что касается вашего первого фрагмента кода,

triple = dice.collect {|value| THE_CODE_BLOCK_STARTS_HERE }

Таким образом, if (dice.count(value) >= 3) является неполным оператором if.Вот почему вы получаете синтаксическую ошибку.

1 голос
/ 14 мая 2011

Ваш блок должен возвращать все, что вы хотите в конечном массиве.

triple = dice.collect {|value| 
  if dice.count(value) >= 3
    dice.count(value)
  end
}

Обратите внимание, что это вернет nil для элементов <3 (хотя вы можете добавить <code>else, чтобы вернуть 0 или что-то еще). Если вам нужны только элементы, соответствующие вашему запросу, вам нужно использовать dice.select()

...