【问题标题】:Accessing an array inside an array访问数组内的数组
【发布时间】:2020-07-28 18:01:50
【问题描述】:

我是 scala 编码的新手,我对某些事情感到好奇,并且很难在网上找到答案。我有这个数组,它接受多个不同类型的参数(:Any)

val arguments= Array("Monday",10,20,Array("test","test2"), if(4 == 4){ "true"})

我迭代并打印了其中的内容。除了索引 3 处的数组之外,所有内容都正确打印。我得到了我相信的对象内存地址,这是可以理解的——Java 也会发生同样的事情。但我很好奇,您将如何访问它?

我尝试将 arguments(3) 的值保存在数组 (val arr:Array[String] = arguments(3)) 中,但没有成功,因为存在类型不匹配 (any != Array[String])

有什么建议吗?这可能是我对函数式编程理解的差距。

【问题讨论】:

  • 拥有一个 Array 是一种不好的做法,拥有一个 Any 是另一种不好的做法。两者兼有是糟糕设计的严重标志,解决此问题的最佳方法是退后一步并重新设计您的解决方案以避免这种情况。
  • @LuisMiguelMejíaSuárez 感谢您的反馈!我只是想玩玩,所以这不是问题的真正解决方案,但我想知道如何在 scala 中开发更好的实践?您对某些资源有什么建议吗?
  • 您是否在关注一些学习语言的资源? Scala 是 OOP 和 FP 的混合体,学习它比学习语法和最佳实践更复杂,你必须学习一种不同的方式来思考和解决问题。
  • 我明白了。我有 Java 背景并使用过其他 OOP 语言,但从未使用过 FP。我的工作中有一个项目需要我用 Scala 编写代码,所以我只是在网上学习教程,并致力于构建我之前在 Scala 中用 Java 编写的项目以跟上进度。不过我的学习方法可能有缺陷。
  • 我建议您参加任何可以逐步介绍该语言的正规课程或书籍。 here你可以找到一个包含各种资源的列表。

标签: arrays scala any


【解决方案1】:

您正在迭代的是Array[Any],因此您可以执行Any 类型可用的功能。您可以使用模式匹配访问数组中的项目,该模式使用底层的 unapply 方法来查看它是否可以将您的 Any 转换为更具体的内容:

  val arguments= Array("Monday",10,20,Array("test","test2"), if(4 == 4){ "true"})

  arguments foreach { arg =>
    arg match {
      case a:Array[String] => println(s"This is the array: ${a.mkString(",")}, and I can do array functions ${a.contains("test")}")
      case _ => println(s"Otherwise I have this: $arg")
    }
  }
//  stdout:
//  Otherwise I have this: Monday
//  Otherwise I have this: 10
//  Otherwise I have this: 20
//  This is the array: test,test2, and I can do array functions true
//  Otherwise I have this: true

【讨论】:

  • 请注意,Array[String] 检查实际上是不安全的。字符串部分是谎言(编译器会警告你)你实际上只能检查它是否是一个数组。
  • 谢谢,我刚刚了解了模式匹配,这很有帮助。
  • 为什么如果我做了 ${a.toString} 我得到了内存地址,但如果我做了 ${a.mkString} 我得到了数组的内容?
  • @Haytham 因为它们是两种不同的方法?就像问为什么5 + 3 给出85 - 3 给出2 - mkString 顾名思义从集合中创建一个字符串。大多数集合在mkString 方面实现了它们的toString,这不是Arrays 的情况,因为它们不是真正的集合而是JVM 的原语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多