2011-08-17 10 views
3

クライアント用のクリーンなインターフェイスを定義しようとしています。いくつかのサンプルクライアントコードは以下のとおりです。次の例で、Scalaがパラメータを自動的に渡すことは可能ですか?

for (security <- allSecurities) { 
    val askLast = ask 
} 

問題は自動的に "セキュリティ"を渡すように "尋ねる"ことです。

var lastSecurity = "" 
    private val lastAsk = new HashMap[...] 
    def allSecurities = for { 
    security <- lastTrade.keySet.toList 
    } yield { 
    lastSecurity = security 
    security 
    } 

    def ask = lastAsk(lastSecurity).price 

は、残念ながら、それはクライアントlastSecurityに代わり、動的に更新されるのループ全体を通して同じ値を持っているので、私が想定していない、かなりの作業を行い、次のように親クラスでこれを行うに私の試みは..だからです基本的に私は、私は、これはScalaで行うことができます

val askLast = ask(security) 

クライアントが

val askLast = ask 

の代わりに行うことができるようにしようとしていますか?

答えて

3

あなたはシーケンスの怠惰な「ビュー」であなたが欲しいものを得ることができ、

var lastSecurity: Int = _ 
    val securities = Seq(1, 2).view.map { a => 
    lastSecurity = a 
    a 
    } 

    for (s <- securities) { 
    println("%d %d".format(s, lastSecurity)) 
    } 

プリント

1 1 
2 2 

キーアイデアここでは遅延ビューで、mapはすぐには評価されませんが、forループによって要素が必要になるだけです。


もう1つのアプローチがあります。

var lastSecurity: Int = _ 

    class SecurityWrapper(s: Seq[Int]) { 
    def foreach(f: Int => Unit) { 
     s.foreach { a => 
     lastSecurity = a 
     f(a) 
     } 
    } 
    } 

    for (security <- new SecurityWrapper(Seq(1, 2))) { 
    println("%d %d".format(security, lastSecurity)) 
    } 

クラスSecurityWrapperは、カスタムforeachメソッドが含まれている、私はこのように良いコードを推薦ないんだけど、それはスカラの柔軟性を発揮しません。ループの各反復では、変数lastSecurityに書き込みます。 Scalaのfor理解糖は自動的に私たちの一部に余分な作業をせずにSecurityWrapper.foreachを使用します。ここで

0

なぜ親クラスに価格のリストを作成し、クライアントにそれを使用しませんか?

def myfunc = for(security <- allSecurities) yield {  
    lastAsk(security).price 
} 

私はあなたが得ることができる最寄りの推測あなたの本来の意図については、次のとおりです。

var askLast = ask _ 
0

は聞いて引数を渡す必要がクライアントを回避近いものです。あなたは、セキュリティおよびこれにより、すなわち、呼び出し尋ねる

def allSecurities = for { 
    security <- lastTrade.keySet.toList 
} yield { 
    (security, lastAsk(security).price) 
} 

によって返される値を含むタプルを得allSecurities方法を変更することができ、クライアントは

for((security,askLast)<-allSecurities){ 
    //to client things with askLast 
} 
を書くことができ
関連する問題