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