【问题标题】:Why are List and String identifiers named "xs" (in Scala and other languages)?为什么列表和字符串标识符命名为“xs”(在 Scala 和其他语言中)?
【发布时间】:2010-10-14 22:14:26
【问题描述】:

许多示例 Scala 代码包含名为“xs”的字符串和集合。 为什么是xs?

例子:

var xs = List(1,2,3)
val xs = "abc"

【问题讨论】:

标签: scala naming-conventions identifier


【解决方案1】:

基本上,这是一种源自 LISP 的命名约定。其背后的基本原理是:

  1. X 是一个常见的占位符名称。
  2. XS 发音为 X'es,即“许多 X”。

【讨论】:

  • 约定实际上扩展到多维结构。例如,xss 可能是列表的列表,而 xsss 可能是数组的数组。
  • 为什么不使用正确且有意义的名称?
【解决方案2】:

【讨论】:

    【解决方案3】:

    除了xs 是 x 的复数,正如@Ken Bloom 指出的那样,还需要注意像 Scala 这样的语言如何构造 ListList 的结构是一个链表,其中容器对第一项和列表的其余部分都有引用。

    :: 运算符(称为cons)将列表构造为:

    42 :: 69 :: 613 :: Nil
    

    :: 出现在模式匹配中时也会将列表提取到第一项和列表的其余部分,如下所示:

    List(42, 69, 613) match {
      case x :: xs => x
      case Nil => 0
    }
    

    由于这种模式无处不在,读者可以推断xs 暗示“列表的其余部分”。

    【讨论】:

    • 我在心里把“xs”读成“excess”,就像“the rest”一样。
    【解决方案4】:

    我在函数式编程教程中看到此名称用于列表变量,但不是字符串(字符串被视为字符列表的情况除外)。

    它基本上是示例中使用的虚拟名称。你可以命名一个标量变量x,而一个列表命名为xs,因为xsx的复数形式。在生产代码中,最好有一个更具描述性的名称。

    您可能还会在模式与列表匹配的代码中看到这一点。例如(在 OCaml 中):

    let rec len l =
      match l with
      | [] -> 0
      | x :: xs -> 1 + len xs
    

    一对更具描述性的名称可能是first :: rest,但这只是一个示例。

    【讨论】:

    • 我倾向于在生产中使用相同的约定,例如“order”和“orders”;)
    • 我认为 x 和 xs 的使用也非常适合生产代码。域含义应该在结果变量的名称中。
    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多