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