2

IORubyでオブジェクトを使用するための適切な「コントラクト」またはベストプラクティスについて疑問に思っています。

IOオブジェクトを渡すヘルパーメソッドがたくさんあります。現在、IOオブジェクトを消費する私の低レベルのメソッドについては、をrewind実行した後にそれらを確認しますread。これは気持ちがいいです。オブジェクトの変更を気にせずに、これらのメソッドを複数回呼び出すことができIOます。

契約の可能性は次のとおりです。

  1. 上記のように...メソッドがオブジェクトを呼び出す場合(または別の方法readIOオブジェクトから読み取る場合)、完了したらrewindそれを行う必要があります。IOこれにより、オブジェクトが効果的に元の状態に復元されます。これは、引数を変更しないというRubyの規則によって動機付けられています。

  2. 呼び出し元のメソッドは、低レベルのメソッドが呼び出し中であることを認識し、readそれに応じて調整する必要があります。(別の言い方をすれば、消費者は注意してください!)

もしあれば、どれが一番いいですか?なんで?

(簡単な補足: 。io_copy = io.dupと同じようには機能しませんio.rewind。)

そして...スレッドセーフについて話すなら、ボーナスポイントに値します!

4

1 に答える 1

5

It's normal not to rewind IO objects, mostly because you can't guarantee that an IO object is rewindable at all: files are, but pipes and sockets aren't. So the usual assumption if I pass an IO object is that it will get read (or written to) by the method, and wind up in a modified state. Since it logically represents a stream rather than a state in the first place, that's OK.

Thread safety doesn't really affect this decision one way or the other, except that it's a lot harder to maintain the illusion of an 'unmodified' IO object if multiple threads are accessing it. Even if you're not trying to maintain that illusion, if it's shared between threads and you're going to read, write, rewind, or do anything else to modify its internal state, you need to do that while holding an exclusive lock on the object.

于 2012-10-02T22:03:53.280 に答える