2011-08-09 3 views
1

実行時にScala(またはJava)のメソッドの名前を変更する方法はありますか?次を考える

case class Num(value: Double) { 
    def plus(rhs: Num) = Num(value + rhs.value) 
    def times(rhs: Num) = Num(value * rhs.value) 
} 

object TestApp extends App { 
    // ** maybe do something here 
    val one = Num(1) 
    val two = Num(2) 
    val three = Num(3) 
    val result = three plus one times two 
} 

は、result = three +- one *- twoその実行時に*times+plusNumplus方法/機能の名前を変更する方法とtimes方法はありますか?

これは実行時に発生することが非常に重要です。可能であればコンパイラプラグインを避けたい。また、該当する場合、私はJavaの例に反対していません。 5.

+0

結果はあなたが代数の優先順位を使用している場合は、「それは6 –

+0

私の直感では、問題がpredecenceのScalaのデフォルトの順序ではないということですだ、とあなたはドン5.べきではありませんこの問題を解決するために、「オンザフライで」メソッドの名前を変更する必要があります。 –

+2

@Amir Afghani、3 + 1 * 2 = 5「通常の」優先ルールでは、6がどこから来たのかわからない。 –

答えて

6

あなたは、演算子の優先順位は、あなたが望むように名前をつけて動作すると仮定していますが、それはうまくいかないでしょう。 @Daveグリフィスが示唆したように、この作品を作るために私は考えることができる最も簡単な方法は、売春斡旋業者である:

以上は何
case class Num(value: Double) 

object Main { 
    implicit def toDouble(v: Num) = v.value 
    implicit def toNum(v: Double) = Num(v) 
    def main(args: Array[String]) { 
    val one = Num(1) 
    val two = Num(2) 
    val three = Num(3) 
    val result: Num = three + one * two 
    println(result) 
    } 
} 

は、あなたが「ランタイム」でこれを行うことができないということです。コンパイル時に名前が存在しない関数への呼び出しをどのように期待しますか?すなわちNum.+plus には+plusの方法がありませんか?コンパイラは、あなたが迷子になることを伝えるつもりです。すでに述べたように、とにかく+plusは無効です。

EDIT:今日私はこれをもう一度見ていましたが、私が何を喫煙しているのか分かりません。より良いポン引きは、次のとおりです。

class NumMath(u: Num) { 
    def +(v: Num) = Num(u.value + v.value) 
    def *(v: Num) = Num(u.value * v.value) 
} 

object Num { 
    implicit def toNumMath(v: Num) = new NumMath(v) 
} 
case class Num(value: Double) 

object Main { 
    import Num._ 
    def main(args: Array[String]) { 
    val one = Num(1) 
    val two = Num(2) 
    val three = Num(3) 
    val result = three + one * two 
    println(result) 
    } 
} 
+0

私は最初の文章では反応しません。最初の演算子は、優先順位を定義します(Scala仕様6.12.3を参照)。もちろん、オペレータ識別子は有効でなければならず、あなたが指摘したように '+ add'は有効ではありません。しかし、 '* - <<'は有効で、 ' - << * 'より高い優先順位を持ちます。 – paradigmatic

+0

私は修正しました。 :)それを指摘してくれてありがとう。私はいつかすぐにその仕様を読まなければなりません。 –

+0

オペレータ識別子が有効であるとします。どうすればこのことができますか? – mepcotterell

3

+plus*timesで8 three +- one *- twoしばらく結果でthree plus one times two結果のためのScalaのデフォルトの演算子の優先順位は、有効なScalaの名前ではないので、私はこれを行うにはしたいと思い

理由があります。アルファベット以外の文字(_や$以外)で始まる名前には、アルファベット以外の文字のみを含める必要があります。

それ以外の場合は、暗黙の変換を使用して簡単に行うことができます。

関連する問題