GUIを書いているとします
class Kitteh (val age: Int) {
require (age < 5)
def saveMeow(file: File) = { /* implementation */ }
def savePurr(file: File) = { /* implementation */ }
}
フレームには現在の Kitteh のフィールドがあります。これは、Option
まだ定義されていないか、ユーザーが無効なものを作成しようとした可能性があるためです。
var currentKitteh: Option[Kitteh] = None
Kitteh
ユーザーが Create を押したときに安全に作成したい
val a = ... // parse age from text box
currentKitteh = try { Some(new Kitteh(a)) } catch { case _ => None }
私の GUI には、同様のことを行う 2 つのボタンがあります。疑似コードでは、両方を行う必要があります
if (currentKitteh.isDefined) {
if (file on the disk already exists) {
bring up a dialog box asking for confirmation
if (user confirms)
<< execute method on currentKitteh >>
}
}
else bring up warning dialog
詳細は気にしないでください。ポイントは、コードの重複があるため、両方のボタンから呼び出すことができる共通のメソッドを作成したいということです。唯一の違いは、実行する必要がある Kitteh のメソッドです。
currentKitteh
ではない場合Option
、共通メソッドは次のような署名を持つことができます
def save(filename: String, f:(File => Unit)) {
たとえば、これで呼び出すことができます
save("meow.txt", currentKitteh.saveMeow _)
しかし、実際にはオプションなので、どうすればこれを実装できますか?
currentKitteh が定義されているかどうかを確認し、各ボタン.get
のメソッドを呼び出す前にa を実行することもできますが、このチェックをメソッドに残す別の方法はありますか? つまり、 が与えられた場合、(存在しない可能性がある)オブジェクトのメソッドから部分関数を指定することは可能ですか?save
save
Option[A]
A
(この質問が理にかなっていることを願っていますが、複雑な例にもかかわらず)
編集: おまけの質問: の代わりにOption[Kitteh]
を使用した場合はEither[Throwable, Kitteh]
?
update : 警告ダイアログを表示するために疑似コードに追加された追加の行: 理想的には、save
保存する有効な Kitteh がない場合にユーザーに警告されるように、メソッドを常に呼び出す必要があります。