【问题标题】:How do I declaratively create a list in Scala?如何在 Scala 中以声明方式创建列表?
【发布时间】:2023-03-16 08:05:02
【问题描述】:

在 C# 中,我可以声明式地声明一个列表,换句话说,声明它的结构并同时初始化它,如下所示:

var users = new List<User>
            {
                new User {Name = "tom", Age = 12}, 
                new User {Name = "bill", Age = 23}
            };

忽略 .Net 中的 List 和 Scala 中的 List 之间的差异(即,随意使用不同的集合类型),是否可以在 Scala 2.8 中做类似的事情?

更新

从下面改编 Thomas 的代码我相信这是与所示 C# 代码最接近的等价物:

class User(var name: String = "", var age: Int = 0)

val users = List(
  new User(name = "tom", age = 12), 
  new User(name = "bill", age = 23))

【问题讨论】:

  • 有必要写&lt;User&gt;吗? C# 不能从“内容”中推断出 List 的泛型类型吗?
  • 您是否有指向您在此处显示的语法的链接?想读一下。是不是类似于 Java 的实例初始化块?
  • @soc - c# 无法推断我想创建一个列表,我需要告诉它。如果我想要一个数组,我可以执行以下操作: var users = new [] { new User {Name = "tom", Age = 12}, new User {Name = "bill", Age = 23} };这是语法描述的链接:msdn.microsoft.com/en-us/library/bb384062.aspx
  • @Rupert:很奇怪。它说这种语法适用于 IEnumerable 的子类型,但我在接口和实现该功能的类中找不到任何东西。
  • @soc:相信是编译器实现的。

标签: scala collections declarative-programming


【解决方案1】:

怎么样:

case class User(name: String, age: Int)

val users = List(User("tom", 12), User("bill", 23))

这会给你:

users: List[User] = List(User(tom,12), User(bill,23))

【讨论】:

  • 感谢您的回答,这非常有用,但与 C# 代码的行为方式略有不同,因为我们提供了一个必须实现的显式构造函数。在 C# 版本中,我们实际上是调用默认的无参数构造函数,然后在对象创建后为其设置属性,我们未设置的任何属性都只有它们的默认值。我已经更新了上面的代码,以显示我认为最接近的 Scala 等价物,使用构造函数的默认参数
  • 我明白了。感谢您的进一步解释。我同意,这似乎最接近您的 C# 代码。
  • @Rupert:问题是它在 Scala 中看起来不同吗?就功能而言,Scala 似乎提供了更多功能,而且语法比 C# 更简单。还是我错过了什么?
  • @soc 不仅仅是它看起来不同,它实际上在功能上也不同。 Scala 代码依赖于定义的构造函数,该构造函数接受我们要填充的字段的值。 C# 版本没有,它使用无参数构造函数,然后设置值。我不想说一个比另一个更好,我的感觉是 C# 可能稍微灵活一些,但是对 Scala 的了解不如我对 C# 的了解,所以我可能有偏见或只是缺少一个更惯用的方式。
  • 嗯,好的。我猜想与您的 C# 示例等效的内容类似于 new { val name = "Foo"; val age = 42 } with UserUser 被定义为 trait User { val name: String; val age: Int }。但是,是的,通常你可能会使用一个案例类(如果你需要的话,在构造函数中使用默认参数)。
【解决方案2】:
val users = User("tom", 12) :: User("bill", 23) :: Nil

你也可以使用 Scalas tupel 类:

val users = ("tom", 12) :: ("bill", 23) :: Nil

【讨论】:

    【解决方案3】:

    或者您可以通过这种方式在不使用编译模块中定义的显式类的情况下创建对象

    List(
       new {var name = "john"; var age = 18},
       new {var name = "mary"; var age = 21}
    )
    
    请注意,此代码有一些严重的缺点,它将为每个 new 创建一个匿名类。

    【讨论】:

      【解决方案4】:

      从下面改编 Thomas 的代码我相信这是与所示 C# 代码最接近的等价物:

      class User(var name: String = "", var age: Int = 0)
      
      val users = List(
        new User(name = "tom", age = 12), 
        new User(name = "bill", age = 23))
      

      这与 C# 代码的行为方式略有不同,因为我们提供了具有默认值的显式构造函数,而不是使用无参数构造函数并随后设置属性,但最终结果是可比较的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 2023-03-17
        • 1970-01-01
        • 2015-07-27
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多