Ruby/Справочник/Proc: различия между версиями

Содержимое удалено Содержимое добавлено
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 1:
==Класс Proc==
Объекты <tt>Proc</tt> являются блоками кода, которые связаны с локальными переменными. Блок кода может быть выполнен в другом контексте.
<sourcesyntaxhighlight lang=ruby>def gen_times(factor)
return Proc.new {|n| n*factor }
end
Строка 10:
times3.call(12) #-> 36
times5.call(5) #-> 25
times3.call(times5.call(4)) #-> 60</sourcesyntaxhighlight>
----
 
Строка 22:
===Proc::new===
----
<sourcesyntaxhighlight lang=ruby>Proc.new {|...| block } #-> a_proc
Proc.new #-> a_proc </sourcesyntaxhighlight>
----
Создает новый объект класса <tt>Proc</tt> и запоминает в нем текущий контекст. <tt>Proc::new</tt> может быть вызван без блока только в пределах метода к которому прицеплен блок (во время вызова). В этом случае блок будет преобразован в объект класса <tt>Proc</tt>.
<sourcesyntaxhighlight lang=ruby>def proc_from
Proc.new
end
proc = proc_from { "hello" }
proc.call #-> "hello"</sourcesyntaxhighlight>
 
===Proc#=====
----
<sourcesyntaxhighlight lang=ruby>prc == other_proc #-> true или false</sourcesyntaxhighlight>
----
Возвращает <tt>true</tt>, если <i>prc</i> и <i>other_proc</i> --- один и тот же объект, или если оба блока имеют одинаковое тело.
Строка 40:
===Proc#[]===
----
<sourcesyntaxhighlight lang=ruby>prc.call(params,...) #-> obj
prc[params,...] #-> obj</sourcesyntaxhighlight>
----
Выполняет блок, присваивая параметрам блока значения <i>params</i> и остальных переменных, обозначенных троеточием. Выдает предупреждение, если блок ожидает лишь одно значение, а ему передается больше (тем не менее, он преобразует список параметров в массив и попытается выполнить блок).
Для блоков, создаваемых с использованием <tt>Kernel.proc</tt>, генерируется ошибка если число параметров передаваемых в блок превышает число параметров объявленных во время его создания. Для блоков, созданных при помощи <tt>Proc.new</tt>, дополнительные параметры просто отбрасываются.
Возвращает значение последнего вычисленного выражения в блоке. Смотри еще <tt>Proc#yield</tt>.
<sourcesyntaxhighlight lang=ruby>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)</sourcesyntaxhighlight>
<i>результат:</i>
<tt>prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError)
Строка 60:
===Proc#arity===
----
<sourcesyntaxhighlight lang=ruby>prc.arity #-> fixnum</sourcesyntaxhighlight>
----
Возвращает количество аргументов, которые могут быть восприняты блоком. Если блок объявлен без указания аргументов, то возвращает 0. Если число агрументов точно равно n, то возвращает n. Если блок имеет оциональный аргумент, то возвращает -n-1, где n --- количество обязательных аргументов. Блок <tt>proc</tt> без аргументов обычно содержит <tt>||</tt> вместо аргументов.
<sourcesyntaxhighlight lang=ruby>Proc.new {}.arity #-> 0
Proc.new {||}.arity #-> 0
Proc.new {|a|}.arity #-> 1
Строка 69:
Proc.new {|a,b,c|}.arity #-> 3
Proc.new {|*a|}.arity #-> -1
Proc.new {|a,*b|}.arity #-> -2</sourcesyntaxhighlight>
 
===Proc#binding===
----
<sourcesyntaxhighlight lang=ruby>prc.binding #-> binding</sourcesyntaxhighlight>
----
Возвращает объект класса <tt>Binding</tt> ассоциированный с <i>prc</i>. Например, <tt>Kernel#eval</tt> принимает объекты <tt>Proc</tt> или <tt>Binding</tt> в качестве второго аргумента.
<sourcesyntaxhighlight lang=ruby>def fred(param)
proc {}
end
Строка 82:
b = fred(99)
eval("param", b.binding) #-> 99
eval("param", b) #-> 99</sourcesyntaxhighlight>
 
===Proc#call===
----
<sourcesyntaxhighlight lang=ruby>prc.call(params,...) #-> obj
prc[params,...] #-> obj</sourcesyntaxhighlight>
----
Выполняет блок, присваивая параметрам блока значения <i>params</i> и остальных переменных, обозначенных троеточием. Выдает предупреждение, если блок ожидает лишь одно значение, а ему передается больше (тем не менее, он преобразует список параметров в массив и попытается выполнить блок).
Для блоков, создаваемых с использованием <tt>Kernel.proc</tt>, генерируется ошибка если число параметров передаваемых в блок превышает число параметров объявленных во время его создания. Для блоков, созданных при помощи <tt>Proc.new</tt>, дополнительные параметры просто отбрасываются.
Возвращает значение последнего вычисленного выражения в блоке. Смотри еще <tt>Proc#yield</tt>.
<sourcesyntaxhighlight lang=ruby>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)</sourcesyntaxhighlight>
<i>результат:</i>
<tt>prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError)
Строка 106:
===Proc#clone===
----
<sourcesyntaxhighlight lang=ruby>prc.clone #-> other_proc</sourcesyntaxhighlight>
----
Создает копию блока <tt>prc</tt>.
Строка 112:
===Proc#dup===
----
<sourcesyntaxhighlight lang=ruby>prc.dup #-> other_proc</sourcesyntaxhighlight>
----
Создает копию блока <tt>prc</tt>.
Строка 118:
===Proc#to_proc===
----
<sourcesyntaxhighlight lang=ruby>prc.to_proc #-> prc</sourcesyntaxhighlight>
----
Часть соглашения о преобразованиии других объектов в объекты класса <tt>Proc</tt>. Внутри класса <tt>Proc</tt> он просто возвращает сам себя.
Строка 124:
===Proc#to_s===
----
<sourcesyntaxhighlight lang=ruby>prc.to_s #-> string</sourcesyntaxhighlight>
----
Возвращает строку с уникальным идентификатором для <tt>prc</tt>, вместе с указателем на место, где блок был объявлен.