Перейти к содержанию

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

Методы класса

new

Методы объекта

[], ==, 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"

prc == other_proc   #->  true или false

Возвращает true, если prc и other_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, вместе с указателем на место, где блок был объявлен.