Ответ 1
Создайте лямбда, а затем конвертируйте в блок с помощью оператора &
:
isodd = lambda { |i| i % 2 == 1 }
[1,2,3,4].select(&isodd)
Я хочу создать фильтр и применить его к массиву или хешу. Например:
def isodd(i)
i % 2 == 1
end
Я хочу иметь возможность использовать его так:
x = [1,2,3,4]
puts x.select(isodd)
x.delete_if(isodd)
puts x
Кажется, что это должно быть прямо, но я не могу понять, что мне нужно сделать, чтобы заставить его работать.
Создайте лямбда, а затем конвертируйте в блок с помощью оператора &
:
isodd = lambda { |i| i % 2 == 1 }
[1,2,3,4].select(&isodd)
puts x.select(&method(:isodd))
Вы можете создать именованный Proc
и передать его методам, которые принимают блоки:
isodd = Proc.new { |i| i % 2 == 1 }
x = [1,2,3,4]
x.select(&isodd) # returns [1,3]
Оператор &
преобразует между a Proc
/lambda
и блоком, что и ожидаются select
.
Если вы используете это в экземпляре, и вам не нужны никакие другие переменные вне области действия proc (другие переменные в методе, в котором вы используете proc), вы можете сделать это замороженной константой так:
ISODD = -> (i) { i % 2 == 1 }.freeze
x = [1,2,3,4]
x.select(&ISODD)
Создание процедуры в Ruby - сложная операция (даже с последними улучшениями), и в некоторых случаях это помогает смягчить это.