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"

[править] 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, вместе с указателем на место, где блок был объявлен.

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Участие
Инструменты
Печать/экспорт