2015-06-11 2 views
0

Если бы я хотел, чтобы подрезать массив по заданному набору параметров я хотел бы написать что-то вроде этого:Используя выход в оператора выбора

array = [4,5,6,7,8] 
a = array.select{|i| i>=5} 
puts a.inspect 

, который будет возвращать [5,6,7,8].

Я хочу написать функцию «фильтр», которая выполняет одно и то же. В этом случае моя первая мысль, чтобы написать что-то вроде:

array = [4,5,6,7,8] 
a = filter(array) {|i| i >= 5} 
puts a.inspect 

То, что я не могу понять, как правильно называть yield внутри метода для вызова блока кода во время select заявления:

a = array.select{yield} 

Кажется, что он не работает, поскольку он пытается вызвать блок кода на nil, а не массив внутри функции. Каков правильный способ сделать это?

ответ

1

Не знаю, если это имеет смысл для вас, но попробуйте:

def filter(array) 
    array.select { |i| yield(i) } 
end 

array = [4,5,6,7,8] 
p filter(array) {|i| i >= 5} 
0

Когда вы пишете код в фигурных скобках {...} быть передан методу, этот код называется блок. Обычно он передается неявно методу (т. Е. Это не именованный аргумент). Чтобы вызвать этот неявный блок, вы вызываете yield.

В вашем случае вы не хотите сами ссылаться на блок; вы хотите, чтобы ваш метод filter прошел блок до select, где происходит фактическая фильтрация.

Чтобы «пройти по блоку», вы можете сделать аргумент блока метода явным, используя префикс &. Обратите внимание, что в этом примере имя block - это просто соглашение; нет специального ключевого слова block. Важной частью является & характер:

def filter(array, &block) 
    array.select(&block) 
end 

array = [4,5,6,7,8] 
filter(array) { |i| i >= 5 } # => [5,6,7,8] 
+0

И ваш ответ и Rustams, кажется, работают - Есть ли рубин стиль конвенции о какой способ решения этого является предпочтительным? – lifayt

+0

Руководство по стилю Ruby предполагает, что '& block' является предпочтительным соглашением: https://github.com/bbatsov/ruby-style-guide#block-argument –

Смежные вопросы