2011-08-10 11 views
7

演算子のオーバーロードについてのお友達とのディスカッションに続きます。私は、Scalaでのオペレータのオーバーロードの創造的かつ/または有用な使用例を見ています。Scalaでのクリエイティブで便利な演算子の使用例

  • 数理構造、線形代数や複素数(+ * -
  • シェルのパイプやリダイレクト(| > < >>)(|
文法で
  • 代替表現を模倣のような:私はいくつかのクールなイラストを持っています

    他にもいい例がありますか?

  • +0

    予想以上の創造性は、通常、悪いことです。演算子のオーバーロードは誰もが期待するように使用すると最も強力です:もちろん、 '*'は複素数だけでなく複素数も乗算します!たとえば、あなたのリターン変数「frodo」と一時的なスワップ変数「sam」の名前はある意味では創造的ですが、(特にLord of the Ringsに慣れていない人にとっては)かなり理解できません。あなたの返り変数 '<---'とあなたのスワップ変数 '<-->'の命名はおそらくあまり良くありません。 –

    +1

    Scalaの新機能については、Scalaの「演算子構文」は、通常のScalaメソッドを呼び出すための素敵な方法です。だから 'x + y'は' x。+(y) 'と同じです。どちらの場合でも、 '+'はオブジェクト 'x'の通常のメソッドであり、' Int'、 'Double'などの型にすることができます。演算子シンタックスには、シンボリックな名前のメソッドは必要ありません(例:' list1 zip list2 'が働いていますが、シンボリックな名前のメソッドを使うと、Scalaはビルトインの優先ルールを適用できます。 –

    +0

    申し訳ありませんが、SOはまだ "あなたのお気に入りのX for Y"の質問をすべて受け付けていません。あなたの現在の問題が*私はすべての演算子*をリストする必要がない限り、これは[faq]に従って範囲外です。 –

    答えて

    7

    私はたまに使って気にしないもの:

    • 汎用パイプ|>(例えば、someValue |> println)観測可能な値の所有者のような
    • := 1いくつかの構造がで割り当て
    • データバインディングを模倣しますUIプログラミングは<=>(双方向)、<==(一方向)(例えば、field.enabled <=> options.isEditable
    2

    これは、スカラコミュニティでは少し議論の余地がある話題です。片側の人々が虐待を恐れると、理解不能なプログラムにつながる可能性があります。もしあなたがそれについて真剣に を考えるなら、それはすでに存在します。オペレーターが「自然に」感じているからですか?だから数学的演算子を取ることができます:+ - */ なぜ 'ほとんどの'プログラミング言語+は文字列で定義されていますか?

    「よく知られている」演算子は、より簡潔で分かりやすいコードにつながる可能性があります。 ScalaはUnicodeシンボルをサポートしているので、/ u + 2211のようなシンボルを使用できます。 例: リスト(1,2,3).sum //は、Unicodeキーボードのサポートがないため、/ u + 2211の代わりにsumを使用して6を返します。

    3文字(s、u、m)ではなく、1つ(/ u + 2211)です。これは良いか悪いですか?私の意見では、スカラコミュニティはこのトピックに関する常識を見つけるでしょうが、時間がかかります。

    ユニコード表現をサポートする他のプログラミング言語には、要塞があります。

    4

    スカラで有用な2つの「ビルトイン」演算子:::->が見つかりました。

    マップの作成では、Map("a" -> 1)と書くことができ、Scalaはを("a", 1)タプルに変換します。 ::は、リストの前に追加するために使用されます。また、非常に便利です。

    また、+=-=のコレクション演算子は、特に変更可能で不変のオブジェクトにも適用されるため、優れています。

    2

    少し前I showedJCRツリーのノードとプロパティを操作する演算子を使用してDSLを作成する方法。正しくレイアウトされている場合、コードは実際のコンテンツツリーのASCIIアート図面に似ています。Scalaのコード次

    root ¦- "movies" -+ { n: Node => 
           n ¦= ("title", "Night on Earth") 
           n ¦= ("length", 123L) 
           n ¦= ("ratings", 9L::8L::5L::Nil) 
           n ¦= ("languages", "en"::"it"::"fi"::"fr"::Nil) 
           n ¦- "cast" -+ { n: Node => 
              n ¦= ("Gena Rowlands", "Victoria Snelling") 
              n ¦= ("Winona Ryder", "Corky") 
              n ¦= ("Roberto Benigni", "Taxi Driver") }} 
    

    は、Javaでのこのバージョンに相当します。

    Node movies = root.addNode("movies"); 
        movies.setProperty("title", "Night on Earth"); 
        movies.setProperty("length", 123L); 
        movies.setProperty("ratings", new String[]{"9", "8", "5"}, PropertyType.LONG); 
        movies.setProperty("languages", new String[]{"en", "it", "fi", "fr"}, PropertyType.STRING); 
        Node cast = movies.addNode("cast"); 
        cast.setProperty("Gena Rowlands", "Victoria Snelling"); 
        cast.setProperty("Winona Ryder", "Corky"); 
        cast.setProperty("Roberto Benigni", "Taxi Driver"); 
    

    は必ずしも有用ではないが、それは創造のためのポイントに値するかもしれません。

    +1

    ScalaバージョンのようにJavaバージョンを字下げしても、それほど悪くはありません... –

    関連する問題