Тем не менее, это не будет работать, чтобы позвонить:
nums.map(&:add_one)
Почему? Потому что числа не имеют встроенного метода add_one. Таким образом, вы получите NoMethodError.
Таким образом, вместо предоставления только имени метода:add_one вы можете передать связанный методmethod(:add_one) :
nums.map(&method(:add_one))
Теперь вместо каждого num, используемого в качестве получателя для add_oneметода, они будут использоваться в качестве аргументов . Итак, по сути это то же самое, что и:
nums.map do|num|
add_one(num)end
Чтобы привести другой пример, сравните следующее:
[1].map(&:puts)# this is the same as [1].map { |num| num.puts }# it raises NoMethodError[1].map(&method(:puts))# this is the same as [1].map { |num| puts num }# it prints 1 successfully
Nitpick: Object#methodвозвращает ограничениеMethod , а не UnboundMethod. Метод привязан к получателю, потому что вы вызываете его для экземпляра, и он, таким образом, знает, что selfесть, а Module#instance_methodвозвращает, UnboundMethodпотому что не может знать, с каким экземпляром он будет использоваться.
Йорг Миттаг
@ JörgWMittag Хорошо, спасибо за исправление, вы правы, я, должно быть, смешивал это, .instance_methodпотому что у меня просто (испорченная) память
макс плеанер
10
method(:function)является отправкой сообщения (иногда называемого вызовом метода ) неявному получателю (то есть self). Он отправляет сообщение methodнеявному получателю (то есть self), передавая :functionв качестве единственного аргумента.
:functionявляется Symbolбуквальным, то есть это буквальное обозначение Symbol. Symbolтип данных, представляющий «имя чего-либо».
Оператор амперсанда с одинарным префиксом &«разворачивает» Procв блок . Т.е. он позволяет вам пройти там, Procгде ожидается блок . Если объект еще не является a Proc, ему будет отправлено to_procсообщение, позволяющее ему преобразовать себя в Proc. (Оператор допустим только в списке аргументов и только для последнего аргумента. Это двойственный &символ в списке параметров, который «сворачивает» блок в Procобъект.)
Procтип данных, представляющий исполняемый код Это основной библиотечный класс Ruby для первоклассных подпрограмм.
Итак, для этого нужно вызвать methodметод selfс :functionаргументом, вызвать to_procвозвращаемое значение, «развернуть» полученный Procобъект в блок и передать этот блок в вызов, integrateкак если бы вы написали что-то вроде
res = integrate(0,1, a)do# somethingend
methodМетод здесь, скорее всего, Object#methodметод, который возвращает связанныйMethod объект.
Итак, в целом, это несколько эквивалентно
res = integrate(0,1, a)do|*args,&block|
function(*args,&block)end
Ответы:
Скажем, у нас есть метод
и массив строк
Мы хотим, чтобы
map
список строк для их соответствующих выходов изadd_one
.Для начала мы можем позвонить
Это то же самое, что
Вы можете увидеть, что означает карта (&: name) в Ruby? для получения дополнительной информации об этом.
Тем не менее, это не будет работать, чтобы позвонить:
Почему? Потому что числа не имеют встроенного метода
add_one
. Таким образом, вы получитеNoMethodError
.Таким образом, вместо предоставления только имени метода
:add_one
вы можете передать связанный методmethod(:add_one)
:Теперь вместо каждого num, используемого в качестве получателя для
add_one
метода, они будут использоваться в качестве аргументов . Итак, по сути это то же самое, что и:Чтобы привести другой пример, сравните следующее:
источник
Object#method
возвращает ограничениеMethod
, а неUnboundMethod
. Метод привязан к получателю, потому что вы вызываете его для экземпляра, и он, таким образом, знает, чтоself
есть, аModule#instance_method
возвращает,UnboundMethod
потому что не может знать, с каким экземпляром он будет использоваться..instance_method
потому что у меня просто (испорченная) памятьmethod(:function)
является отправкой сообщения (иногда называемого вызовом метода ) неявному получателю (то естьself
). Он отправляет сообщениеmethod
неявному получателю (то естьself
), передавая:function
в качестве единственного аргумента.:function
являетсяSymbol
буквальным, то есть это буквальное обозначениеSymbol
.Symbol
тип данных, представляющий «имя чего-либо».Оператор амперсанда с одинарным префиксом
&
«разворачивает»Proc
в блок . Т.е. он позволяет вам пройти там,Proc
где ожидается блок . Если объект еще не является aProc
, ему будет отправленоto_proc
сообщение, позволяющее ему преобразовать себя вProc
. (Оператор допустим только в списке аргументов и только для последнего аргумента. Это двойственный&
символ в списке параметров, который «сворачивает» блок вProc
объект.)Proc
тип данных, представляющий исполняемый код Это основной библиотечный класс Ruby для первоклассных подпрограмм.Итак, для этого нужно вызвать
method
методself
с:function
аргументом, вызватьto_proc
возвращаемое значение, «развернуть» полученныйProc
объект в блок и передать этот блок в вызов,integrate
как если бы вы написали что-то вродеmethod
Метод здесь, скорее всего,Object#method
метод, который возвращает связанныйMethod
объект.Итак, в целом, это несколько эквивалентно
Но выражается в том, что принято называть точечным стилем .
источник