1

データファイルは一連の操作を実行する必要があるというロジックがありますが、操作が必要かどうかはブール値によって制御されます。基本的に、データ配列はプロセス ループを通過し、何らかの結果が得られます。

これをコーディングするエレガントな方法があるのだろうか、できればvars と多くのif/elseステートメントを使用しないでください。

def op1(data): Seq[int]
def op2(data): Seq[int]
def op3(data): Seq[int]

def process(data: Seq[int], b1: boolean, b2: boolean, b3: boolean) = {

  //NOT working code, some thing does the following:  
  var temp: Seq[int] = data
  if (b1) 
    temp = op1(temp)
  if(b2)
    temp = op2(temp)
  if(b3)
    temp = op3(temp)

  temp

}

4

4 に答える 4

1

この場合、私は実際にあなたのソリューションを好みますが、これはより機能的な代替手段です。Seq を String に置き換えたのは、例として使いやすいためですが、それは問題ではありません。

object SequenceOfOperations {
    def op1(data: String) = data + "A"            //> op1: (data: String)java.lang.String
    def op2(data: String) = data + "B"            //> op2: (data: String)java.lang.String
    def op3(data: String) = data + "C"            //> op3: (data: String)java.lang.String

    def process(data: String, b1: Boolean, b2: Boolean, b3: Boolean) = {
        val ops =Seq((b1 , op1(_)),(b2 , op2(_)),(b3 , op3(_)))

        val filteredOps = ops.filter( _._1).map (_._2)

        filteredOps.foldLeft(data)((l : String,o : String => String) => o(l))
    }                                             //> process: (data: String, b1: Boolean, b2: Boolean, b3: Boolean)String


    process("Z", true, false, true)               //> res0: String = ZAC
    process("Y", true, true, false)               //> res1: String = YAB
    process("X", false, false, true)              //> res2: String = XC
}
于 2013-05-23T05:01:59.850 に答える
0

これは、次の関数でラップできる典型的な折り畳みのように見えます。

def maybeDo[A](bs: List[Boolean], fs: List[A => A], x: A) =
  (bs zip fs).foldLeft(x) {
    case (x, (b, f)) => if (b) f(x) else x
  }

たとえば、次のように使用します

> val bs = List(true, false, true)
> val fs: List[Int => Int] = List(_+1, _*3, _+2)
> maybeDo(bs, fs, 10)
res0: Int = 13

あなたの例では、次のようになります

val temp = maybeFold(List(b1, b2, b3), List(op1 _, op2 _, op3 _), data)
于 2013-05-23T05:06:11.950 に答える
0

これを達成する方法はたくさんあります..

1つの可能な方法は..

 def op1(data: Seq[Int]) = data.map(_ + 2) //your actual operation here..
 def op2(data: Seq[Int]) = data.map(_ - 2) //..returning Seq[Int]
 def op3(data: Seq[Int]) = data.map(_ * 2) //

 implicit class SeqOps(val data: Seq[Int]) extends AnyVal {
   def op(op: Seq[Int] => Seq[Int], b: Boolean) = if (b) op(data) else data
 }

そして、次def processのように書くことができます..

def process(data: Seq[Int], b1: Boolean, b2: Boolean, b3: Boolean) = {
     data op (op1, b1) op (op2, b2) op (op3, b3)
}
于 2013-05-23T05:26:23.057 に答える