在 Scala 中创建多个对象
Create many objects in Scala
我正在努力创建一个(简单的)基于代理的模型来学习 Scala 和函数式编程。
我已经在 Python 中创建了它,所以我的想法是按照已有的想法对其进行编码,但我 运行 一开始就遇到了问题:
我有一个 class 描述了模型中的一个主体,另一个 class 描述了它所处的社会。这个社会由 N 个主体组成,其中 N 是一个整数。
在 Python 中,我会做一个列表理解来存储 class 的所有实例,但我如何在 Scala 中做到这一点?有没有比使用以下代码更好的方法:
import agent.Agent
class Society([omitted-for-brevity]){
val tmp_agents = List()
for(i <- 1 to puntos){
val tmp_agent = new Agent(pos_X = 0, name="Agent "+i)
tmp_agents :+ tmp_agent
}
- Agent 有可以改变的值,所以 for 循环中的
val tmp_agent
不应该是一个 var 吗?或者如果代理 class 有 var
个参数作为输入是否有效?
- 如果只有其中的对象要更改 "internal" 值,
tmp_agents
列表是否应该是一个 val?可以附加到 val 吗?
case class Agent(pos_X: Int, name: String)
val puntos = 20
(1 to puntos)
.foldLeft(List.empty[Agent])((a, b) => Agent(b, s"Agent {b}") :: a)
.reverse
以上内容将帮助您为您尝试构建的程序建模。您可以使用 foldLeft 构建相同的内容,并且可以将其附加到列表中,然后反转列表。您不需要任何突变或可变数据结构。
<script src="https://scastie.scala-lang.org/CeVBrWQhQmqCtwrXuimgcA.js"></script>
您可以在 scala
中使用 map
做类似的事情
val tmp_agents = (1 to puntos).toList.map(i -> new Agent(pos_X = 0, name="Agent "+i))
如果您不关心数据的形状而只想要一个集合来容纳您的代理,则可以省略 .toList
部分
正如我常说的,Scaladoc 是你的朋友。
val agents = List.tabulate(n) { i =>
new Agent(pos_X = 0, name=s"Agent $i")
}
(另外,我建议为您的代理使用 case class。并遵循 Scala 命名约定)
我正在努力创建一个(简单的)基于代理的模型来学习 Scala 和函数式编程。
我已经在 Python 中创建了它,所以我的想法是按照已有的想法对其进行编码,但我 运行 一开始就遇到了问题:
我有一个 class 描述了模型中的一个主体,另一个 class 描述了它所处的社会。这个社会由 N 个主体组成,其中 N 是一个整数。 在 Python 中,我会做一个列表理解来存储 class 的所有实例,但我如何在 Scala 中做到这一点?有没有比使用以下代码更好的方法:
import agent.Agent
class Society([omitted-for-brevity]){
val tmp_agents = List()
for(i <- 1 to puntos){
val tmp_agent = new Agent(pos_X = 0, name="Agent "+i)
tmp_agents :+ tmp_agent
}
- Agent 有可以改变的值,所以 for 循环中的
val tmp_agent
不应该是一个 var 吗?或者如果代理 class 有var
个参数作为输入是否有效? - 如果只有其中的对象要更改 "internal" 值,
tmp_agents
列表是否应该是一个 val?可以附加到 val 吗?
case class Agent(pos_X: Int, name: String)
val puntos = 20
(1 to puntos)
.foldLeft(List.empty[Agent])((a, b) => Agent(b, s"Agent {b}") :: a)
.reverse
以上内容将帮助您为您尝试构建的程序建模。您可以使用 foldLeft 构建相同的内容,并且可以将其附加到列表中,然后反转列表。您不需要任何突变或可变数据结构。
<script src="https://scastie.scala-lang.org/CeVBrWQhQmqCtwrXuimgcA.js"></script>
您可以在 scala
中使用map
做类似的事情
val tmp_agents = (1 to puntos).toList.map(i -> new Agent(pos_X = 0, name="Agent "+i))
如果您不关心数据的形状而只想要一个集合来容纳您的代理,则可以省略 .toList
部分
正如我常说的,Scaladoc 是你的朋友。
val agents = List.tabulate(n) { i =>
new Agent(pos_X = 0, name=s"Agent $i")
}
(另外,我建议为您的代理使用 case class。并遵循 Scala 命名约定)