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

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