Scala TMap与我对ZIO RC18-2的预期不一样

Scala TMap与我对ZIO RC18-2的预期不一样,scala,stm,zio,Scala,Stm,Zio,我尝试以以下方式使用TMap: 定义TMap: val chatIdMapSTM: ChatIds = TMap.make(camunda_group -> camundaChatId, "pme123" -> 275469757L) 输入一个条目: def registerChat(maybeId: Option[ChatUserOrGroup], chatId: ChatId): ZIO[Any, RegisterException, String] = (for {

我尝试以以下方式使用
TMap

定义
TMap

val chatIdMapSTM: ChatIds = TMap.make(camunda_group -> camundaChatId, "pme123" -> 275469757L)
输入一个条目:

def registerChat(maybeId: Option[ChatUserOrGroup], chatId: ChatId): ZIO[Any, RegisterException, String] =
  (for {
    chatStm <- chatIdMapSTM
    _ <- maybeId.map(id => chatStm.put(id, chatId)).getOrElse(chatIdMapSTM)
    values <- chatStm.values // List(1212, 275469757, -319641852)
  } yield chatStm).commit
    .as("your chat was successful registered")
def registerChat(maybeId:Option[ChatUserOrGroup],chatId:chatId):ZIO[Any,RegisterException,String]=
(用于{

chatStm您似乎从未提交过聊天地图,因此您总是“从头开始”。请参见以下工作示例:

导入zio_ 导入zio.console_ 导入zio.stm_ 对象ChatsExample扩展应用程序{ def运行(参数:列表[字符串])= 为了{
map我不知道STM或ZIO,但我很好奇为什么从
chatStm.values
中提取的每个
值都会产生
chatStm
?这至少是一个无意义的变量创建。@jwvh你是对的-我添加它只是为了在每个函数中显示映射的内容。谢谢-我的OO背景阻碍了我要实现的目标eve将TMap作为内部而不是接口(我使用的是模块模式)。这样做可能吗?是的。我可能会调整方法的签名以避免接受选项,但从STM的角度来看,这看起来是正确的。此外,您可以“隐藏”通过使用
ZLayer.fromEffect
,可以完整地映射TMap。这应该可以工作:
scala val live=ZLayer.fromEffect{TMap.empty.commit.map{map=>new Service{…}}
ZLayer。fromEffect
是我一直在寻找的-谢谢。所以我重新编写了我的代码,遗憾的是仍然是相同的结果!请看一下上面的工作示例,我测试了这个示例,它按预期工作。关于层,我将把你的要点中的
def live
替换为
val live
,然后我将其封装在那里晚了
TMap
,而不是在外面构建它。
def requestChat(chatUserOrGroup: ChatUserOrGroup): UIO[ChatId] =
  (for {
    chatStm <- chatIdMapSTM
    values <- chatStm.values // List(275469757, -319641852)
    chatId <- chatStm.getOrElse(chatUserOrGroup, camundaChatId)
  } yield chatId).commit