【问题标题】:Is there any technical or architectural reason for trying to use special characters for method names in Scala? [closed]尝试在 Scala 中使用特殊字符作为方法名称是否有任何技术或架构原因? [关闭]
【发布时间】:2020-03-01 13:55:19
【问题描述】:

我是来自 Java 世界的 Scala 新手。 Scala 似乎比 Java 更复杂。此外,我注意到许多 Scala 构造使用模棱两可的方法名称。除了 +、-、* 和 / 很明显它们是什么之外,还有什么理由使用这样的方法:

object ActorRef {
  implicit final class ActorRefOps[-T](val ref: ActorRef[T]) extends AnyVal {
    /**
     * Send a message to the Actor referenced by this ActorRef using *at-most-once*
     * messaging semantics.
     */
    def !(msg: T): Unit = ref.tell(msg) 
  }
}

当我看到感叹号发送消息时,我首先想到的是!

另一个例子:

List 有一个名为 `:::' 的方法用于列表连接

这是你如何使用它:

val oneTwo = List(1, 2)
val threeFour = List(3, 4)
val oneTwoThreeFour = oneTwo ::: threeFour
  println(oneTwo + " and " + threeFour + " were not mutated.")
  println("Thus, " + oneTwoThreeFour + " is a new list.")

尝试在方法名称中使用特殊字符是否有任何技术或架构原因,或者它只是一种“炫耀”?

【问题讨论】:

  • Akka 的灵感来自于 Erlang 中实现的 Actor 模型,其中 ! 用于在 Actor 之间发送消息。我猜! 只是为了遵守 Erlang 建立的约定而被选中。
  • @KrzysztofAtłasik ::: 怎么样,它的灵感来自哪里?除了谁在乎它的灵感来自哪里?可读性不是更重要吗...?
  • 运算符通常使代码非常简洁,但过度使用它们确实会降低代码的可读性。请注意,什么是可读的,什么不是是非常主观的。有些人只是认为! 非常适合发送消息,因为它已经用于其他类似的语言。
  • 我认为过度使用许多不同的短名称::::::++:++++: 可能会使代码难以阅读。但话又说回来,我想知道代码是否混合了样式。还要记住,末尾的: 表示右关联stackoverflow.com/a/7889189/5986907
  • “除了谁在乎它的灵感来自哪里?”关键是,对于很多 Akka 用户来说,“当我看到感叹号发送消息时首先想到的事情”是真的,没有讽刺意味。

标签: scala


【解决方案1】:

这是个好问题。

在 Scala 中,所有您熟悉和喜爱的运算符(+/*-)也是函数。

所以你可以重写这个词:

val hornsOfUnicorn = 2 - 1

val hornsOfUnicorns = 2.-(1)

Try it out!

从逻辑上讲,这是有道理的,并且实际上是 Java 由于历史原因而缺少的功能。

当您被允许为您的函数使用完整的 UTF-8 字符范围时(阅读:自定义运算符),为什么不让它们更简洁、更简洁和富有表现力?

P.S:::::::的列表语法最初来自Haskell。

它用于表达列表的头尾性质,在 Haskell、Scala 或 PureScript 等语言中。

它实际上描述的不仅仅是“只是一个操作员”;要了解这一点,请查看ScalaDoc of List

【讨论】:

  • 为什么不让它们不那么冗长,更简洁和富有表现力?这样我就不会错过可读性。关于更简洁和富有表现力,我认为这会让它们变得不那么简洁和富有表现力。
  • @Adelin 我可以看到你会这么认为,来自 Java。适度使用时,可以极大地改进代码。我同意,过度使用时可能会造成混淆。
  • ":, :: 和 ::: 的列表语法来自 Haskell" 但是为什么我需要保留来自其他语言的旧结构,更不用说现在很少使用 Haskel (@987654323 @)
  • @Adelin “如今几乎没有使用 Haskell”——这是不正确的。例如,它被 Microsoft Reasearch 用作实验性编译器。
  • @Adelin:微软的终结者是用 Haskell 编写的。 Terminator 是一种检查 Windows 驱动程序是否存在意外无限循环的工具,它是 Windows 驱动程序开发工具包的一部分。 Glasgow Haskell Compiler 是一个生产质量的工业级编译器,用 Haskell 编写。德意志银行、瑞士信贷、谷歌、Facebook、英特尔、爱立信、阿尔卡特朗讯只是其他一些用户。
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多