Опасен ли метод #tap в Ruby?
Как tap
метод работы параллельно? Должен ли я бояться этого, если я сделаю:
some_object.tap { |o|
# time-consuming operation 1
}.tap { |o|
# time-consuming operation 2
}
что, в настоящем или будущем, Ruby будет пытаться выполнять эти операции одновременно? Ты знаешь, #tap
звучит опасно.
Гарантируется ли, что #tap
блок выполняется последовательно (если, конечно, внутри блока не происходит что-то необычное)?
2 ответа
Tap не выполняет блок одновременно, но последовательно. Таким образом, вам не нужно беспокоиться о проблемах параллелизма, потому что нет проблем параллелизма.
Вот источник tap
:
VALUE
rb_obj_tap(VALUE obj)
{
rb_yield(obj);
return obj;
}
Итак, вы можете видеть, что сначала он вызывает блок (yield
) и только после этого возвращает исходный объект. Здесь нет параллелизма.
Вам не о чем беспокоиться.
Выполнение Ruby будет последовательным, если вы не сделаете что-то, чтобы явно сделать это параллельным (например, создание потоков).