IO对象的惯例或经验法则?

时间:2012-10-02 21:56:29

标签: ruby io

我想知道在Ruby中使用IO对象的正确'合约'或最佳做法。

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

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

  1. 如上所述...如果方法在read对象上调用IO - 或以其他方式从中读取 - 那么它应该rewind完成。这有效地将IO对象恢复到其原始状态。这是由不修改参数的Ruby惯例推动的。

  2. 调用方法应该知道低级方法正在调用read并进行相应调整。 (换句话说:消费者要小心!)

  3. 哪个(如果有的话)最好?为什么?

    (快速注释:io_copy = io.dupio.rewind的功能不同。)

    而且......如果你谈论线程安全,你应该获得奖励积分!

1 个答案:

答案 0 :(得分:5)

不回退IO对象是正常的,主要是因为你无法保证IO对象完全可以回放:文件是,但管道和套接字不是。因此,如果我传递IO对象,通常的假设是它将被该方法读取(或写入),并以修改状态结束。因为它在逻辑上代表了一个流而不是一个状态,所以没关系。

线程安全并不会以某种方式影响这个决定,除非在多个线程访问它的情况下维护“未修改”IO对象的错觉要困难得多。即使你没有试图保持这种幻觉,如果它在线程之间共享,你要读,写,倒回或做任何其他事情来修改它的内部状态,你需要在保持独占锁的同时做到这一点。对象。