在Scala中使用创造性和有用的运算符的示例

时间:2011-08-10 07:08:25

标签: scala operator-overloading

与朋友讨论了运营商重载问题。我正在研究Scala中运算符重载的创造性和/或有用的示例用法。我有一些很酷的插图:

  • 数学结构,如线性代数或复数(+ * -
  • 模仿shell管道和重定向(| > < >>
  • Grammars中的替代表达式(|

你还有其他很好的例子吗?

4 个答案:

答案 0 :(得分:7)

我不介意偶尔使用的那些:

  • 通用管道|>(例如someValue |> println
  • :=一些像可观察价值持有者的结构,以模仿作业
  • 使用<=>(双向),<==(单向)进行用户界面编程中的数据绑定(例如field.enabled <=> options.isEditable

答案 1 :(得分:4)

我在Scala中找到了两个“内置”运算符:::->

在地图创建中,您可以编写Map("a" -> 1),Scala会将"a" -> 1翻译为("a", 1)元组。 ::用于附加在List之前,它也非常方便。

收集的+=-=运算符也很棒,特别是因为它们也适用于可变和不可变的运算符。

答案 2 :(得分:2)

这在scala社区中有点争议。一方人们害怕滥用可能导致难以理解的节目。如果你认为 认真对待它已经存在。因为操作员感觉“自然”?所以我们拿数学运算符:+ - * / 那么为什么“大多数”编程语言+都是在字符串上定义的?

另一方面,“熟悉的”操作符可以使代码更加简洁和易于理解。 Scala支持unicode符号,因此您可以使用/ u + 2211之类的符号。 例: List(1,2,3).sum //会给我们6,使用sum而不是/ u + 2211,因为缺少unicode键盘支持。

所以不是3个字符(s,u,m),而是一个(/ u + 2211)这是好还是坏?在我看来,scala社区将在这个主题上找到一个常识,但这需要一些时间。

支持unicode表达式的其他编程语言包括堡垒。

答案 3 :(得分:2)

前一段时间我showed如何使用运算符创建一个DSL来操作JCR树的节点和属性。如果布局正确,则代码类似于实际内容树的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");

虽然不一定有用,但它可能值得一点创造力。