1

この擬似コードに似たコードを記述できるようにするscala dslを作成する方法はありますか?

編集:scala疑似コードに変更

object AccessProtectedClass extends App{
   def protectedMethod(param:String)
     permit_if (param.startsWith("asdf") and RAM <= 10) : Int = {
         var result = 10
         //do something
         return result;
   } 
}

「permit if」ステートメントが原因でアクセスが許可されない場合は、例外をスローする必要があります。どのscala概念が必要ですか?

4

3 に答える 3

3

これに似たコードを書くことは可能です。次の 2 つの点に注意してください。

  • Scala 中置記法は patternobj method param method param method param...に従うため、メソッド名のキーワードを適切な場所に配置する必要があります。
  • 演算子の優先順位は、あなたを助けたり妨げたりすることができます。たとえば、<=は よりも優先andされます。これは、表示したスニペットに役立ちます。ドット表記も同様です。オブジェクトに続く括弧も、そのオブジェクトの apply メソッドとして優先されます。たとえば、Specs2 はこれをうまく利用しています。

それで、これに戻ります:

permit if param.startsWith("xyz") and CPU <= 50 { ... }

次のように分割できます。

permit // object
if     // method, though "if" is a reserved word, so you have to pick something else
param.startsWith("xyz") // param, because of higher precedence
and    // method
CPU <= 50 // param, because of higher precedence
// method needed here!
{ ... } // param

したがって、微調整を加えれば、ビルダー パターンがここで機能するように見えます。andto (または any )のパラメーターorはおそらく名前によるものになるため、結果が前者の条件によって定義されている場合、後者の条件の評価を避けることができます。

于 2013-05-15T13:45:42.380 に答える
1

私が正しく理解していれば、基本的にpermit_ifメソッドは条件とコードのブロックを取り、条件が満たされないという例外をスローします。これは、次のように簡単に実装されます。

def permit_if[T]( condition: Boolean )( f: => T ): T = {
  if ( condition ) f
  else throw new Exception("Permit conditions not met!")
}

次のように使用します。

object AccessProtectedClass extends App{
   def protectedMethod( param:String ): Int = 
     permit_if (param.startsWith("asdf") && RAM <= 10)  {
         var result = 10
         //do something
         return result;
   } 
}

実際、標準ライブラリにはrequire 要件を確認するためのメソッドが既に含まれているため、非常に具体的な例外をスローする必要がない限り、それをそのまま使用できます。上記のコード スニペットの を に置き換えるだけで、それだけpermit_ifです。require

于 2013-05-16T10:56:59.190 に答える