Ruby/Справочник/Proc
Материал из Викиучебника
Содержание |
[править] Класс Proc
Объекты Proc являются блоками кода, которые связаны с локальными переменными. Блок кода может быть выполнен в другом контексте.
def gen_times(factor) return Proc.new {|n| n*factor } end times3 = gen_times(3) times5 = gen_times(5) times3.call(12) #-> 36 times5.call(5) #-> 25 times3.call(times5.call(4)) #-> 60
Методы класса
Методы объекта
[], ==, arity, binding, call, clone, dup, to_proc, to_s
[править] Proc::new
Proc.new {|...| block } #-> a_proc Proc.new #-> a_proc
Создает новый объект класса Proc и запоминает в нем текущий контекст. Proc::new может быть вызван без блока только в пределах метода к которому прицеплен блок (во время вызова). В этом случае блок будет преобразован в объект класса Proc.
def proc_from Proc.new end proc = proc_from { "hello" } proc.call #-> "hello"
[править] Proc#==
prc == other_proc #-> true или false
Возвращает true, если prc и other_proc --- один и тот же объект, или если оба блока имеют одинаковое тело.
[править] Proc#[]
prc.call(params,...) #-> obj prc[params,...] #-> obj
Выполняет блок, присваивая параметрам блока значения params и остальных переменных, обозначенных троеточием. Выдает предупреждение, если блок ожидает лишь одно значение, а ему передается больше (тем не менее, он преобразует список параметров в массив и попытается выполнить блок). Для блоков, создаваемых с использованием Kernel.proc, генерируется ошибка если число параметров передаваемых в блок превышает число параметров объявленных во время его создания. Для блоков, созданных при помощи Proc.new, дополнительные параметры просто отбрасываются. Возвращает значение последнего вычисленного выражения в блоке. Смотри еще Proc#yield.
a_proc = Proc.new {|a, *b| b.collect {|i| i*a }} a_proc.call(9, 1, 2, 3) #-> [9, 18, 27] a_proc[9, 1, 2, 3] #-> [9, 18, 27] a_proc = Proc.new {|a,b| a} a_proc.call(1,2,3)
результат:
prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError) from prog.rb:4:in `call' from prog.rb:5
(еще известен как .call)
[править] Proc#arity
prc.arity #-> fixnum
Возвращает количество аргументов, которые могут быть восприняты блоком. Если блок объявлен без указания аргументов, то возвращает 0. Если число агрументов точно равно n, то возвращает n. Если блок имеет оциональный аргумент, то возвращает -n-1, где n --- количество обязательных аргументов. Блок proc без аргументов обычно содержит || вместо аргументов.
Proc.new {}.arity #-> 0 Proc.new {||}.arity #-> 0 Proc.new {|a|}.arity #-> 1 Proc.new {|a,b|}.arity #-> 2 Proc.new {|a,b,c|}.arity #-> 3 Proc.new {|*a|}.arity #-> -1 Proc.new {|a,*b|}.arity #-> -2
[править] Proc#binding
prc.binding #-> binding
Возвращает объект класса Binding ассоциированный с prc. Например, Kernel#eval принимает объекты Proc или Binding в качестве второго аргумента.
def fred(param) proc {} end b = fred(99) eval("param", b.binding) #-> 99 eval("param", b) #-> 99
[править] Proc#call
prc.call(params,...) #-> obj prc[params,...] #-> obj
Выполняет блок, присваивая параметрам блока значения params и остальных переменных, обозначенных троеточием. Выдает предупреждение, если блок ожидает лишь одно значение, а ему передается больше (тем не менее, он преобразует список параметров в массив и попытается выполнить блок). Для блоков, создаваемых с использованием Kernel.proc, генерируется ошибка если число параметров передаваемых в блок превышает число параметров объявленных во время его создания. Для блоков, созданных при помощи Proc.new, дополнительные параметры просто отбрасываются. Возвращает значение последнего вычисленного выражения в блоке. Смотри еще Proc#yield.
a_proc = Proc.new {|a, *b| b.collect {|i| i*a }} a_proc.call(9, 1, 2, 3) #-> [9, 18, 27] a_proc[9, 1, 2, 3] #-> [9, 18, 27] a_proc = Proc.new {|a,b| a} a_proc.call(1,2,3)
результат:
prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError) from prog.rb:4:in `call' from prog.rb:5
(еще известен как [])
[править] Proc#clone
prc.clone #-> other_proc
Создает копию блока prc.
[править] Proc#dup
prc.dup #-> other_proc
Создает копию блока prc.
[править] Proc#to_proc
prc.to_proc #-> prc
Часть сооглашения о преобразованиии других объектов в объекты класса Proc. Внутри класса Proc он просто возвращает сам себя.
[править] Proc#to_s
prc.to_s #-> string
Возвращает строку с уникальным идентификатором для prc, вместе с указателем на место, где блок был объявлен.