Ruby中的#tap方法是危险的吗?

Bor*_*cky 3 ruby piping

tap方法如何以并发方式工作?如果我这样做,我是否必须担心:

some_object.tap { |o|
  # time-consuming operation 1
}.tap { |o|
  # time-consuming operation 2
}
Run Code Online (Sandbox Code Playgroud)

那么,在现在还是将来,Ruby会尝试同时进行这些操作?你知道,#tap听起来很危险.

是否保证#tap块按顺序执行(当然,除非在块内部执行某些异常操作)?

Cas*_*per 11

Tap不会同时执行块,而是按顺序执行.因此,您不必担心并发问题,因为没有并发问题.

这是以下来源tap:

VALUE
rb_obj_tap(VALUE obj)
{
    rb_yield(obj);
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

所以你可以看到它首先调用了block(yield),然后才返回原始对象.没有并发存在.


And*_*icz 5

你没有什么可担心的.

Ruby执行将是顺序的,除非你做一些事情明确地使它并行(例如创建线程).