Size: a a a

2020 April 15

m

moffire in RubyRush
Алексей Печерский
Всем привет. Есть толковый разбор работы yield? не могу въехать в его работу
Если по простому, то при вызове йелд выполнение метода останавливается, осуществляется переход в блок, выполняется блок, возвращается выполнение в метод.
источник

АП

Алексей Печерский... in RubyRush
Спасибо
источник

АП

Алексей Печерский... in RubyRush
moffire
Если по простому, то при вызове йелд выполнение метода останавливается, осуществляется переход в блок, выполняется блок, возвращается выполнение в метод.
Я понимаю, что он блоки выполнять даёт, но для чего это нужно, не могу уловить суть нужности его
источник

m

moffire in RubyRush
Алексей Печерский
Я понимаю, что он блоки выполнять даёт, но для чего это нужно, не могу уловить суть нужности его
вот смотрите. Условно, вы используете метод map. В блоке вы передаете что нужно делать с каждым элементом - например возвести в квадрат. Получается, что методу нужно пройти по каждому элементу переданного объекта, выполнить над этим объектом содержимое блока (возведение в квадрат), сформировать новый массив и вернуть его.
источник

m

moffire in RubyRush
Примернор это будет выглядеть так
def map1!
 for i in 0...size
   self[i] = yield(self[i])
 end
 self\
end
источник

m

moffire in RubyRush
Берется переданный массив, заходит в наш самописный метод map, там итерируется по длине массива, потом над каждым переданным элементом выполняется код из блока (в нашем случае возведение в квадрат).  В написанном выше коде это строчка self[i] = yield(self[i])
источник

АП

Алексей Печерский... in RubyRush
self в данном случае как оператор?
источник

m

moffire in RubyRush
self указывает на используемый в текущий момент объект. Например пришел массив [2, 3, 4]. Он видит, что у метода map есть блок. Заходит массив в блок. Там ему говорят - итерируйся. Он отдает первый элемент на итерацию  - self [i]. Этот элемент доходит до yield, возвращается в наш блок метода, исполняет то, что указано в методе (возведение в квадрат) возвращается обратно, становится self[i]
источник

АП

Алексей Печерский... in RubyRush
Правильно я понимаю, что в допустим, [1,2,3,4,5]. map{|item| item*item}, в фигурных скобках, это и есть блок?
источник

m

moffire in RubyRush
item*item - вот это блок
источник

m

moffire in RubyRush
не правильно сказал
источник

m

moffire in RubyRush
вы правы- все что в скобках - блок
источник

m

moffire in RubyRush
а это инструкция, которая выполняется, когда внутри метода map доходит до yield
источник

АП

Алексей Печерский... in RubyRush
А через что оно взаимодествует, всмысле item как значения получает?
источник

АП

Алексей Печерский... in RubyRush
В данном случае self. item?
источник

m

moffire in RubyRush
внутри метода map просто итерируется переданный массив. Если вы ему передадите просто item, он не будет понимать, откуда взялся этот объект. Потому ему нужно добавить ссылку на самого себя - self.item. Типо объект говорит - блок, я пришел к тебе, обработай меня и верни меня же измененного.
источник

m

moffire in RubyRush
вот смотрите
источник

m

moffire in RubyRush
arr = [1, 2, 3]
puts arr.object_id
arr.map!{ |el| el**2}
puts arr.object_id
источник

m

moffire in RubyRush
> 47187241911580
> 47187241911580
источник

m

moffire in RubyRush
ссылка на сам объект не изменилась, хотя содержимое объекта поменялось
источник