我想知道在Ruby中使用IO
对象的正确'合约'或最佳做法。
我有一堆传递IO对象的辅助方法。目前,对于使用IO对象的低级方法,我确保在执行rewind
之后read
。这感觉很好;它允许我多次调用这些方法,而不必担心修改IO
对象。
以下是合同的一些可能性:
如上所述...如果方法在read
对象上调用IO
- 或以其他方式从中读取 - 那么它应该rewind
完成。这有效地将IO
对象恢复到其原始状态。这是由不修改参数的Ruby惯例推动的。
调用方法应该知道低级方法正在调用read
并进行相应调整。 (换句话说:消费者要小心!)
哪个(如果有的话)最好?为什么?
(快速注释:io_copy = io.dup
与io.rewind
的功能不同。)
而且......如果你谈论线程安全,你应该获得奖励积分!
答案 0 :(得分:5)
不回退IO对象是正常的,主要是因为你无法保证IO对象完全可以回放:文件是,但管道和套接字不是。因此,如果我传递IO对象,通常的假设是它将被该方法读取(或写入),并以修改状态结束。因为它在逻辑上代表了一个流而不是一个状态,所以没关系。
线程安全并不会以某种方式影响这个决定,除非在多个线程访问它的情况下维护“未修改”IO对象的错觉要困难得多。即使你没有试图保持这种幻觉,如果它在线程之间共享,你要读,写,倒回或做任何其他事情来修改它的内部状态,你需要在保持独占锁的同时做到这一点。对象。