Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将不同的对象模型作为参数传递给scala中的方法

将不同的对象模型作为参数传递给scala中的方法
EN

Stack Overflow用户
提问于 2017-11-21 10:12:54
回答 1查看 454关注 0票数 0

我一直在为scala中的类型关系以及如何有效地使用它们而奋斗。目前,我正试图了解如何使用它们只编辑蒙古族集合中的某些字段。这意味着将只包含这些字段的特定对象传递给(在阅读关于差异之后)我认为可以这样做的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   abstract class DocClass
   case class DocPart1(oId: Option[BSONObjectID], name: String, other: String) extends DocClass
   case class DocPart2(city: String, country: String) extends DocClass

使用调用更通用方法的方法,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   def updateMultipleFields(oId: Option[BSONObjectID], dataModel: DocClass): Future[Result] = serviceClientDb.updateFields[T](collectionName, dataModel, oId)
   // updateFields updates the collection by passing *dataModel* into the collection, i.e. Json.obj("$set" -> dataModel)

所以dataModel可以是DocPart1DocPart2对象。我渴望不要在updateMultipleFields上使用类型参数(正如这个有趣的文章可能建议的那样),因为这将导致我在项目中的其他文件中将这些类型参数传递给这个方法时会遇到进一步的问题。我这样做是为了遵守DRY,并为了维护高效的数据库操作。

我绕着这个转了圈--有人能给我一点启示吗?

在@SerGr的评论之后编辑

所以说得很清楚,我使用的是Play/Scala/ReactiveMongo (作为记录在这里),我有一个包含很多字段的MongoDB集合。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   case class Doc(oId: Option[BSONObjectID], name: String, city: String, country: String, city: String, continent: String, region: String, region: String, latitude: Long, longitude: Long)

要创建一个新文档,我已经将Doc (上面)自动映射到集合结构(在Play -像这样中),并创建了一个表单(用于插入/更新集合)--所有操作都很好!

但是在编辑文档时,我只想更新一些字段(这样所有字段都不会更新)。因此,我创建了多个case classes,将这些字段划分为较小的模型(如DocPart1 &DocPart2的示例),并将表单数据映射到一个。这导致我将这些参数作为参数传递给updateMultipleFields方法,如上面所示。我希望这样做更有意义。

EN

回答 1

Stack Overflow用户

发布于 2017-11-23 12:41:59

我不确定我是否正确地理解了你的需要。这里还有一些可能是它的代码。假设我们的FullDoc类定义为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
case class FullDoc(_id: Option[BSONObjectID], name: String, other: String)

我们有两个部分更新,定义为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sealed trait BaseDocPart

case class DocPart1(name: String) extends BaseDocPart

case class DocPart2(other: String) extends BaseDocPart

此外,假设我们有一个访问我们蒙古族藏品的人:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def docCollection: Future[JSONCollection] = ...

所以,如果我理解你的要求,你需要的是这样的东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def update[T <: BaseDocPart](oId: BSONObjectID, docPart: T)(implicit format: OFormat[T]) = {
  docCollection.flatMap(_.update(BSONDocument("_id" -> oId),
    JsObject(Seq("$set" -> Json.toJson(docPart)))))
}

本质上,主要的诀窍是使用通用的T <: BaseDocPart并传递implicit format: OFormat[T],这样即使在类型擦除之后,我们也可以将BaseDocPart的特定子级转换为JSON。

下面是一些额外的测试代码(我在控制台应用程序中使用了这些代码)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  implicit val fullFormat = Json.format[FullDoc]
  implicit val part1Format = Json.format[DocPart1]
  implicit val part2Format = Json.format[DocPart2]

  def insert(id: Int) = {
    val fullDoc = FullDoc(None, s"fullDoc_$id", s"other_$id")
    val insF: Future[WriteResult] = docCollection.flatMap(_.insert(fullDoc))
    val insRes = Await.result(insF, 2 seconds)
    println(s"insRes = $insRes")
  }

  def loadAndPrintAll() = {
    val readF = docCollection.flatMap(_.find(Json.obj()).cursor[FullDoc](ReadPreference.primaryPreferred).collect(100, Cursor.FailOnError[Vector[FullDoc]]()))
    val readRes = Await.result(readF, 2 seconds)
    println(s"readRes =\n${readRes.mkString("\n")}")
  }

  def loadRandomDocument(): FullDoc = {
    val readF = docCollection.flatMap(_.find(Json.obj()).cursor[FullDoc](ReadPreference.primaryPreferred).collect(100, Cursor.FailOnError[Vector[FullDoc]]()))
    val readRes = Await.result(readF, 2 seconds)
    readRes(Random.nextInt(readRes.length))
  }

  def updateWrapper[T <: BaseDocPart](oId: BSONObjectID, docPart: T)(implicit writer: OFormat[T]) = {
    val updateRes = Await.result(update(oId, docPart), 2 seconds)
    println(s"updateRes = $updateRes")
  }

  // pre-fill with some data    
  insert(1)
  insert(2)
  insert(3)
  insert(4)
  val newId: Int = ((System.currentTimeMillis() - 1511464148000L) / 100).toInt
  println(s"newId = $newId")

  val doc21: FullDoc = loadRandomDocument()
  println(s"doc21 = $doc21")
  updateWrapper(doc21._id.get, DocPart1(s"p1_modified_$newId"))

  val doc22: FullDoc = loadRandomDocument()
  println(s"doc22 = $doc22")
  updateWrapper(doc22._id.get, DocPart2(s"p2_modified_$newId"))

  loadAndPrintAll()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47419932

复制
相关文章
如何将多个参数传递给 React 中的 onChange?
在 React 中,一些 HTML 元素,比如 input 和 textarea,具有 onChange 事件。onChange 事件是一个非常有用、非常常见的事件,用于捕获输入框中的文本变化。有时候,我们需要将多个参数同时传递给 onChange 事件处理函数,在本文中,我们将介绍如何实现这一目标。
网络技术联盟站
2023/06/07
2.7K0
linux/bash:map作为参数传递给function
在linux bash中map是作为数组处理的,不能作为参数直接传递函数,如果一定要传递给函数,要做一些变通处理,示例如下:
10km
2019/08/14
2.7K0
Vue 中,如何将函数作为 props 传递给组件
作者:Michael Thiessen 译者:前端小智 来源:medium 点赞再看,养成习惯本文 GitHub https://github.com/qq44924588... 上已经收录,更多往
前端小智@大迁世界
2020/05/18
8.2K0
Scala:统一的对象模型
类 图片展示了Scala的类层次结构。每一个类都继承自scala.Any,Any的子类可以划分为两个主要的范畴:值类型,继承自scala.AnyVal;引用类型,继承scala.AnyRef。 每一种
Albert陈凯
2018/04/04
6760
Scala:统一的对象模型
C++对象模型_Class Obj作为函数参数
开发环境 VC6.0 编辑器 Cmd Markdown 关于C/C++中基本类型(如:int,int*等)作为函数参数时,是通过将该变量的值压栈来进行参数传递;本文通过C++反汇编代码分析了当对象作为函数参数时(该形参非引用或指针),参数如何传递以及此时栈帧的结构。 对象作为函数参数时,参数传递过程(如:函数的声明为:void show(class Object obj);该函数的调用的为show(arg);其中实参arg的类型为class Object):1,在栈顶上为obj对象分配内存空间,然
chinchao.xyz
2022/04/25
1.2K0
C++对象模型_Class Obj作为函数参数
React技巧之将对象作为props传递给组件
原文链接:https://bobbyhadz.com/blog/react-typescript-pass-object-as-props[1]
chuckQu
2022/08/19
1.1K0
iframe怎么将参数传递给vue 父组件
在子页面的iframe中想将参数传递给Vue父组件,可以使用postMessage()方法将数据发送给父窗口。父组件可以通过监听message事件来接收并处理这些数据。
王小婷
2023/08/10
1.4K0
LoadRunner参数传递给参数
需求:使用随机函数时,需要参数化某个参数,并且后面的步骤需要使用这个参数。 方法: 1 lr_save_string 该函数主要是将程序中的常量或变量保存为lr中的参数 2 lr_eval_string 从参数中取得对应的值,并且转换为一个字符串 测试: 在action里写: 1 lr_output_message("*****参数:%s********",lr_save_string(lr_eval_string("{NewParam}"),"name")); 2 lr_output_messag
全栈测试开发日记
2023/02/18
2.9K0
vector作为参数的三种传参方式
c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector):
xiaoxi666
2018/10/29
2.8K0
Scala教程之:scala的参数
在Scala中,可以给参数提供默认值,这样在调用的时候可以忽略这些具有默认值的参数。
程序那些事
2020/07/07
6170
python中如何定义函数的传入参数是option的_如何将几个参数列表传递给@ click.option…
如果通过使用自定义选项类将列表格式化为python列表的字符串文字,则可以强制单击以获取多个列表参数:
Java架构师必看
2021/08/23
7.7K0
Scala基础 - 传名参数和传值参数(by-name/by-value parameter)
1. 介绍 传值参数在函数调用之前表达式会被求值,例如Int,Long等数值参数类型;传名参数在函数调用前表达式不会被求值,而是会被包裹成一个匿名函数作为函数参数传递下去,例如参数类型为无参函数的参数就是传名参数。下文将举例说明这两者的区别。 2. 简单类型的传递示例 2.1 传值参数(by-value parameter)示例 在下面的示例中,编译器检测到strToInt接受一个传值参数,所以先对传入的参数表达式{println("eval parameter expression"); "123"},然
joymufeng
2018/05/17
2K0
Scala中的方法与函数
封装是计算机编程语言中最基本但也十分经典的思想(更严谨地说封装是面向对象设计中的一种思想),例如将一段频繁用到的逻辑写成一个函数的过程,其背后蕴含的其实就是封装的思想。与众多编程语言类似,Scala中也提供了方法和函数的功能,但在具体使用上又有很多特别之处,甚至一定程度上可以彰显Scala的设计理念。
luanhz
2021/03/04
1K0
Scala中的方法与函数
Scala教程之:面向对象的scala
我们知道Scala是一种JVM语言,可以合java无缝衔接,这也就大大的扩展了scala的应用范围,大数据里面有名的spark就是使用scala编写的,那么scala到底有什么奥秘和特性呢?我们一一来揭秘。
程序那些事
2020/07/07
5690
scala中的伴生类和伴生对象
由于static定义的类和对象破坏了 面向对象编程的规范完整性,因此scala 在设计之初就没有static关键字概念,类相关的静态属性都放在伴生对象object中。
从大数据到人工智能
2023/04/27
9130
作为Scala语法糖的设计模式
Scala算是一门博采众家之长的语言,兼具OO与FP的特性,若使用恰当,可以更好地将OO与FP的各自优势发挥到极致;然而问题也随之而来,倘若过分地夸大OO特性,Scala就变成了一门精简版的Java,写出的是没有Scala Style的拙劣代码;倘若过分追求FP的不变性等特性,因为Scala在类型系统以及Monad实现的繁琐性,又可能导致代码变得复杂,不易阅读,反而得不偿失。 看来,赋予程序员选择的自由,有时候未必是好事! 在OO世界里,设计模式曾经风靡全世界,你不懂设计模式,都不好意思说自己是程序员。现在
张逸
2018/03/07
1.1K0
React技巧之将useState作为对象
原文链接:https://bobbyhadz.com/blog/react-type-usestate-object[1]
chuckQu
2022/08/19
9540
JS处理函数将对象作为参数传递
做项目的时候遇到一个不是很常见的问题,就是js函数传递参数的时候,我们一般是传递一个数字或者是一个字符串,但是当你的需求满足不了的时候,就需要将对象或者数组作为一个参数传递过去,这个时候怎么做呢,今天简单的说有一下:
何处锦绣不灰堆
2020/05/29
7.1K0
Scala 孤立对象和单例对象方法体的用法和例子
1 以object关键字修饰一个类名,这种语法叫做孤立对象,这个对象是单例的。 相当于将单例类和单例对象同时定义。相当于java中的单例,即在内存中只会存在一个Test3实例。创建一个Scala Object,它相当于java的static, 不要用Scala-class去建工程,不然就不能建main函数了。 2 方法声明以def开头, 然后是方法名, 参数列表, 返回值, 等号, 方法体 。如下: def method1(x : Int) : Int = { x += 1 } 如果没有返回值, 可以省略等号, 直接写方法体。(就像咱们的例子)
马克java社区
2019/07/11
5760
Scala 孤立对象和单例对象方法体的用法和例子
点击加载更多

相似问题

如何将图作为参数传递给Scala中的方法

110

如何将类对象作为参数传递给不同的类方法?

221

将Scala对象作为Java对象传递给Java方法

20

将方法作为Scala中的参数传递

13

将方法作为参数传递给XAML对象

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文