2

オプションにリソースオブジェクトが保存されています。

 private var ochan: Option[Channel] = None

プログラム実行中のある時点で、ochanはに設定されSome(channel)ます。close(メソッドを呼び出して)チャネルを閉じ、オプションをNone1回の致命的な急降下でに設定したいと思います。

現在私は持っています:

 def disconnect = ochan = { ochan.foreach{_.close}; None }

そして以前私は持っていました:

 def disconnect = ochan = ochan.flatMap{ o => o.close; None }

これを行うためのより良い方法はありますか?

4

6 に答える 6

5

私はそれを次のように書きます:

def disconnect = ochan = ochan match {
  case Some(ch) => ch.close(); None
  case None => None // do nothing
}

foreachまたはを使用する代わりにflatMap。私の意見では、このソリューションは何が起こるかをより明確かつ明確に示しています。foreach精神的なジャンプを伴う、または必要とする解決策でflatMapは、これらのメソッドがで何をするかを知る必要がありOptionます。

于 2011-04-07T21:56:08.990 に答える
3

それが優れているかどうかはわかりませんが、短くなっています(暗黙的に定義した後):

implicit def closer(o: Option[Channel]) = new { 
  def close(): Option[Channel] = { o.foreach(_.close); None } 
}

def disconnect = ochan = ochan.close
于 2011-04-07T21:45:07.597 に答える
1

スレッドセーフではありません!@volatileを使用することを忘れないでください(ここではなく、同期を使用して)、次のようなことをしてください:(これが命令型コードが好きではない理由です)

private val lock = new Object

def disconnect() {//Function has side effects: remember parenthesis!
  lock.synchronized { //Synchronizations is important; you don't want to close it multiple times
    ochan.foreach {_.close()} //Again: side effects -> parens.
  }
}

また、並列プログラミングを使用しない場合は、何か問題があります。

于 2011-04-08T19:08:11.153 に答える
1

不変のvarと可変のvalの間に大きな違いはありません。では、とにかく可変性が必要な場合は、動作を別のクラスにカプセル化してみませんか?

class ChannelOption {
  private var _channel :Option[Channel] = None
  def channel = _channel
  def channel_=(ch:Option[Channel]) { _channel.foreach(_.close); _channel = ch }
}

使用法:

private val ochan = new ChannelOption
ochan.channel = Some(getAChannel)
ochan.channel.foreach(useChannel)
ochan.channel = Some(getAnotherChannel) //this automatically closes the first channel
ochan.channel = None //this automatically closes the second channel
于 2011-04-08T06:23:42.720 に答える
0

ochan_=新しい値を割り当てochanて古いチャネルを閉じるように定義することもできますが(C ++の場合と同様) 、ストレージがクラス内にあるため、std::auto_ptr<>子クラスにそれをカプセル化する方法がわかりません。Option[Channel]このソリューションでは、コードはほとんど変更されません。disconnectを割り当てることで暗黙的になりochanます。

于 2011-04-07T20:04:38.290 に答える
0

私はこれがうまくいくと思います:

def disconnect { 
  ochan = {
    ochan.get.close
    None
  }
}

また

def disconnect {
  ochan.get.close
  ochan = None
}

とにかく、ミューテーション操作があるので、常に2つの呼び出しが必要になります(1つは閉じるため、もう1つはNoneの割り当てのため)。

于 2011-04-07T20:54:10.707 に答える