2016-11-01 11 views
0

私は従う一般化法

def functionOne(param1: String, param2: Int): ReturnTypeOne = { 
    doSomethingWith(param1, param2, new ReturnTypeOne) 
} 

def functionTwo(param1: String, param2: Int): ReturnTypeTwo = { 
    doSomethingWith(param1, param2, new ReturnTypeTwo) 
} 
..... 
def functionN(param1: String, param2: Int): ReturnTypeN = { 
    doSomethingWith(param1, param2, new ReturnTypeN) 
} 

ような方法の束を持っているScalaでこれらの方法を一般化する方法はありますか?なにか提案を?

+2

なぜ1,2番目のパラメータを関数に渡すのですか? –

+1

彼らは何をしているの?その場合、これらのメソッドの定義が必要です。 – shaktimaan

+0

したがって、 'doSomethingWith()'の3番目の引数は、メソッドの戻り値の型ですか? 'doSomethingWith()'が必要なすべてを行うときに 'functionX()'を使うのはなぜですか? – jwvh

答えて

3

かなりわかりません。このような何か?

trait F[A] { 
    def f(x: String, y: Int): A 
} 

object F { 
    def f[A](x: String, y: Int)(implicit ev: F[A]) = ev.f(x, y) 

    implicit object FInt extends F[Int] { 
    def f(x: String, y: Int) = y 
    } 

    implicit object FString extends F[String] { 
    def f(x: String, y: Int) = x 
    } 
} 

import F._ 

f[Int]("123", 1) //> 1 
f[String]("123", 1) //> "123" 
+0

私は1つの関数しか持たないように、戻り値の型をparamとして渡したいと思います。val firstVal = myFunction( " q "、1、ReturnTypeOne)' 'val secondVal = myFunction(" a "、2、ReturnTypeTwo)' –

+1

ビクターの答えは、あなたが望むことをします。 –

+0

@αƞjiβメソッドパラメータとして型を渡すことはできません。型はオブジェクトではありません。しかし、私の例のように型多型を使うことができます。 –

0

多分グループにそれら:手段を "一般化" 何

def functions (param1: String, param2: Int) = new { 
    def one: ReturnTypeOne = ??? 
    def two: ReturnTypeTwo = ??? 
    def n: ReturnTypeN = ??? 
} 

... 
functions("a", 4).one 

functions("b", 7).two 
+0

'one 'を呼び出すたびに新しいオブジェクトをインスタンス化しますか?私のために無駄に思える。 –

+0

@VictorMoroz多分...目的を知らずに言うことができません...早すぎる最適化など... –