2

我想知道IO在 Ruby 中使用对象的正确“合同”或最佳实践。

我有一堆传递 IO 对象的辅助方法。目前,对于消耗 IO 对象的低级方法,我确保rewind在执行read. 这感觉很好;它允许我多次调用这些方法而不必担心修改IO对象。

以下是合同的一些可能性:

  1. 如上所述......如果一个方法调用read一个IO对象 - 或以另一种方式从它读取 - 那么它应该rewind在完成后。这有效地将IO对象恢复到其原始状态。这是由不修改参数的 Ruby 约定所激发的。

  2. 调用方法应该知道低级方法正在调用read,并进行相应的调整。(换一种说法:消费者当心!)

如果有的话,哪个最好?为什么?

(一个快速的旁注:io_copy = io.dup功能不一样io.rewind。)

而且...如果您谈论线程安全,您应该得到加分!

4

1 回答 1

5

不回滚 IO 对象是正常的,主要是因为您不能保证 IO 对象完全可以回滚:文件可以,但管道和套接字不能。因此,如果我传递一个 IO 对象,通常的假设是它将被该方法读取(或写入),并最终处于修改状态。因为它首先在逻辑上表示流而不是状态,所以没关系。

线程安全并不会真正以某种方式影响此决定,除非如果多个线程正在访问它,则很难维持“未修改” IO 对象的错觉。即使您不想保持这种错觉,如果它在线程之间共享并且您要读取、写入、倒带或执行任何其他操作来修改其内部状态,您也需要在持有独占锁的同时执行此操作物体。

于 2012-10-02T22:03:53.280 回答