玩! Framework 2.0 - 循环遍历 scala 模板中的地图?

2023-12-30

我有一张代表目录的地图,它包含Chapter键和List[Section]价值观。现在我正在尝试在我的模板中循环执行此操作,如下所示:

<dl>
@table_of_contents.foreach((e) => {
    <dt>
        @e._1.title
    </dt>
        for(section <- e._2){
        <dd>
            @section.title
        </dd>
        }
})
</dl>

我目前没有得到任何输出<dl>然而。

我添加了一个println(table_of_contents)在模板顶部声明,以确保地图确实有数据并打印:

{models.Chapter@1=BeanList size[4] hasMoreRows[false] list[models.Section@1, models.Section@2, models.Section@3, models.Section@4], models.Chapter@2=BeanList size[0] hasMoreRows[false] list[]}

也许我需要使用命令式风格?

UPDATE:

仍在研究这个...得到了这个变体来编译,但没有输出。

<dl>
@table_of_contents.foreach{case(a, b) => {
    <dt>
        @a.title
    </dt>
        @displaySections(b)
}}
</dl>

...

@displaySections(sections: List[Section]) = {
  @for(a_section <- sections) {
        <dd>@a_section.title</li>
  }
}

tl;dr

到目前为止给出的答案(由@wbarksdale https://stackoverflow.com/users/546427/wbarksdale, @PlexQ https://stackoverflow.com/users/477399/plexq and @丹尼尔·C·索布拉尔 https://stackoverflow.com/users/53013/daniel-c-sobral在评论中)足以解决此处描述的问题。

但他们缺少关于为什么初始代码使用的真正解释foreach,不起作用。

它无法工作,因为foreach回报Unit.

游戏理念

让我快速说明/回忆一下模板的工作原理。

Play Framework 2 默认提供的 Scala 模板系统确实是基于 FP 概念构建的,因此它使用了大量不可变的结构等等。

此外,这样的 Scala 模板(比方说myTemplate.scala.html) 将被编译成常规的 Scalaobject其中有一个apply方法调用。后一个功能使我们能够call该对象作为带有一些参数的函数(在模板的第一行中声明的参数)。

This object也依赖于像这样的构造BaseScalaTemplate https://github.com/playframework/Play20/blob/master/framework/src/templates/src/main/scala/play/api/templates/ScalaTemplate.scala它是用输出格式化程序(Html)构建的。这个格式化程序将能够接受一些东西(比如String, Unit , Seq[Int], Map[A,B], ...) 并将其渲染为 HTML 代码。

使用时将进行格式化_display_的方法BaseScalaTemplate,它返回一个实例格式化输出。该显示方法将在compiled的代码.scala.html文件中的对象apply方法的主体。

所以身体可以这样结束:

def apply/*1.2*/(testMap:scala.collection.immutable.Map[String, Int]):play.api.templates.Html = 
  _display_ {
    Seq[Any](
      _display_(
        Seq[Any](
          /*3.2*/testMap/*3.9*/.map/*3.13*/ { e =>
            _display_(Seq[Any](_display_(Seq[Any](/*5.3*/e))))
          }
        )
      )
    )
  }

看?这_display_调用不会改变任何内容,但它们的组合方式使得 apply 本身将返回格式化代码的实例(Html)!

这给了我们线索...

是啊等等……现在为什么?

在给出了有关 Play 内部结构的闪电之后,我们现在可以解决真正的问题:为什么问题帖子中提供的意识形态 Scala 代码不起作用......阅读,根本不输出任何内容。

很简单,使用时foreach on a Map,你确实是looping超过的项目和adapting将它们转为 Html。但是这些计算将无法被模板系统使用,因为它们被包含在foreach的循环。那是foreach当序列中的每个项目都需要副作用时,必须使用...并返回Unit当它完成时。

因为,模板系统将尝试_display_的结果foreach在给定的Map它只会渲染/格式化Unit因此一个空的String!

总而言之,只需使用map这将返回一个新序列,其中包含adapted项、Html实例。

嗯,那么呢for?

是的,你是对的......根据所说的,为什么建议使用的答案是for循环工作,因为没有产生值,afor相当于foreach!? (介绍yield将结束于map-类似行为)

答案就在代码中......模板编译器将在前面添加yield关键字到for的身体——看看这个here https://github.com/playframework/Play20/blob/master/framework/src/templates-compiler/src/main/scala/play/templates/ScalaTemplateCompiler.scala#L383. :-D

Et voilà,它也有效,因为生成的东西在for完成后,其主体将附加到返回的序列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

玩! Framework 2.0 - 循环遍历 scala 模板中的地图? 的相关文章

  • Scala 中缺少多重集吗?

    我正在尝试 Scala 中的 Facebook Hacker Cup 2013 资格赛问题 对于第三个问题 我觉得需要一个有序的 Multiset 但在 scala 的 2 10 集合中找不到一个 scala 的集合中是否缺少此数据结构 会
  • Scala 警告、IntelliJ 和编译器标志

    我目前正在试用 IntelliJ Scala 插件 有件事让我有点烦恼 编译时我收到 3 个警告 Warning scala Recompiling 4 files Warning scala Warning scala there wer
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 后退按钮 (Chrome) 在 Play Framework 中获取 Json 而不是 HTML

    各位 我有一个 Web 应用程序 我在其中对同一资源的 JSON 和 HTML 表示重复使用了相同的路由 现在我们将其称为 foo details 该页面是从 bar details 链接的 因此 查看 bar details 您会看到链接
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 在 Spark 中将多行汇总为单行和单列

    我有一个如下的火花 DF 我需要汇总具有与单行相同 ID 的多行 但值应该不同 id values 1 hello 1 hello Sam 1 hello Tom 2 hello 2 hello Tom 预期输出 id values 1 h
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • Scala 功能设计模式目录

    一周以来我一直在阅读 Scala 编程 作者一步一步地介绍了该语言的元素 但我仍然很困惑何时使用演员 闭包 柯里化等功能性的东西 我正在寻找功能结构的典型用例或最佳实践的目录 我并不是说在 Scala 中重新实现像 GoF 这样的众所周知的
  • 如何设置 jacoco4sbt 来处理 Play 中主模块和子模块中的类?

    我有一些问题要解决雅可可4sbt https github com sbt jacoco4sbt正在使用我的 Play 2 3 4 项目 我的项目由 3 个子模块组成 common api and frontend并且没有代码app根文件夹
  • Scala 将递归有界类型参数(F 界)转换为类型成员

    我将如何转换 trait Foo A lt Foo A 给类型成员 也就是说 我想要以下内容 trait Foo type A lt Foo type A 但我遇到了困难 因为名称 A 已在类型细化中使用 这个问题是类似的 并衍生自 通过类
  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • SBT 对 Scala 类型感到困惑

    SBT 抛出以下错误 value split is not a member of String String error filter arg gt arg split delimiter length gt 2 对于以下代码块 impl
  • 按元素聚合数组

    Spark scala 相当新 我想知道是否有一种简单的方法以按列方式聚合 Array Double 这是一个例子 c1 c2 c3 1 1 1 0 1 0 3 4 1 2 1 0 0 0 4 3 2 1 0 0 0 0 0 0 2 3 1
  • Django 模板 - 我可以设置要在父模板中使用的变量吗?

    我有一个包含通用导航菜单的父模板 我希望能够添加class selected 到适当的菜单选项 我希望能够在子模板中设置变量 例如 set menu products and do ifequal menu products class s
  • 对 Spark 数据集中的数字字符串进行排序

    假设我有以下内容Dataset productCode amount XX 13 300 XX 1 250 XX 2 410 XX 9 50 XX 10 35 XX 100 870 Where productCode is of Strin
  • 相当于 scala 中的 python repr()

    有没有相当于Python的东西reprscala 中的函数 即 您可以给任何 scala 对象提供一个函数 它将生成该对象的字符串表示形式 该对象是有效的 scala 代码 eg val l List Map 1 gt a print re
  • 读取不同文件夹深度的多个 csv 文件

    我想递归地将给定文件夹中的所有 csv 文件读入 Spark SQLDataFrame如果可能的话 使用单一路径 我的文件夹结构如下所示 我想包含具有一个路径的所有文件 resources first csv resources subfo
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • 最有效地将编译时大小的数组的所有元素相加

    我正在尝试使用最少量的指令 有效地将所有内容添加到编译时大小的数组中 当然 我正在使用模板 我创造了这个 template
  • Map 和 Set 的实际类(不是抽象类,也不是特征类)是什么?

    在 Scala 中 映射和集合文字可以通过以下方式创建 val m Map 1 gt a 以及引用的类型m字面意思都是Map Int String 然而 scala文档表明Map实际上是一个特征 具有需要实现才能实例化的抽象成员 scala

随机推荐

  • 为多对多关系的组合设计 SQL 模式(产品的变体)

    我希望标题能有点帮助 我使用 MySQL 作为我的数据库 我正在构建产品数据库 但不确定如何处理产品变体的存储价格 SKU 产品可能有无限的变体 并且每个变体组合都有自己的价格 SKU 等 这就是我目前设置产品 变体表的方式 PRODUCT
  • Java字符串初始化

    你更偏向于哪个 为什么 String myString null if someCondition myString something else myString something else OR String myString if
  • 假货组件未生成

    我不知道我需要做什么才能生成假货 在我的测试项目中 我包含了对我想要伪造的程序集的引用 它将 Fakes fakes 添加到我的项目中并构建了该项目 有大量警告 但错误数为 0 并且构建成功完成 但它没有添加对生成的 Fakes 程序集的任
  • BATCH - 移动超过 5 分钟的文件

    我想制作一个移动可执行文件 时间超过5分钟 不知道如何比较文件的修改日期与系统日期 echo off for f in log do move nf log Procesados exit 一种方法是下载查找工具 http gnuwin32
  • 如何使用 Rails 3.0.x 配置 Log4r?

    我尝试根据这篇文章使用Rails 3 0 4配置log4r http www dansketcher com 2007 06 16 integrating log4r and ruby on rails http www dansketch
  • 使用统一的初始脉冲在抛物线路径上移动 2D 物理体

    我拥有的 Unity 5 2D 中的一个射弹 受重力影响 我想以抛物线路径上的初始冲量从 A 点移动到 B 点 我知道的 随机起始位置的二维坐标 A 随机目标位置的二维坐标 B 我希望身体到达目标位置的时间 X 我想知道的是 我必须一次向身
  • PHP 中包含太多文件会降低性能吗? [复制]

    这个问题在这里已经有答案了 可能的重复 包含函数文件的效率 在 PHP 中 https stackoverflow com questions 2106700 efficiency for including files of functi
  • SQL Server Reporting Services 2008 中的列和行分组

    这是我需要填充为报告的期望结果 其中 xx 是人数 我有一个表 其中包含以下字段 table1 id state year as Quarter gender 我需要根据 id 确定计数并填充为报告 年份类似于 20081 20082 20
  • 新手关于maven的问题

    我唯一需要关心的配置文件是吗 pom xml 在我看来 Java 人的生活xml比任何其他东西都重要 这是真的吗 Maven 使用 XML 作为 POM 文件 因为 XML 是描述事物的不错选择 而 POM 文件是描述一个项目的 我认为 M
  • Gstreamer:将 Matroska 视频转码为 mp4

    我们正在使用的硬件不支持播放 mkv 文件 所以我需要将 Matroska mkv 视频文件转码为 mp4 视频文件 正如我从网上提供的转码材料中了解到的 我需要执行以下操作 使用分离不同的 mkv 文件流矩阵卡多路复用器元素 使用可用的
  • 寻求有关首次 SAML 实施的反馈

    我的任务是设计一个非常简单的 SSO 单点登录 流程 我的雇主指定它应该在 SAML 中实施 我想创建绝对尽可能简单的消息 同时确认 SAML 规范 如果你们中的一些人能查看我的请求和回复消息并告诉我它们是否对我的目的有意义 如果它们包含以
  • MySQL:动态添加列到查询结果

    我有这张表 update id project id content date 1 1 text 2011 12 20 22 10 30 2 2 text 2011 12 20 22 10 30 3 2 text 2011 12 21 22
  • ASCX自定义控件中CSS规则应该放在哪里?

    我是 ASP NET 的新手 但我正在开发一个自定义控件 该控件内部有一个多视图控件 可以显示一堆不同的内容 其中一些是使用 JQuery UI 元素 如选项卡和手风琴 显示的 这些元素将有相当多的自定义 由于我将拥有许多仅适用于自定义控件
  • WordUtils.capitalize 的替代品? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试使用大写字符串中的每个单词WordUtils capitalize String 因为它正是我
  • Jquery .show() 不显示具有隐藏可见性的 div

    基本的 jQuery 问题 我试图揭示一个div已使用 jQuery 将其标记为隐藏 但我不太明白 我在这里创建了一个 JSFiddle http jsfiddle net VwjxJ http jsfiddle net VwjxJ 基本上
  • Android:显示错误的屏幕分辨率

    我试图使用此代码获取 Android 手机的屏幕分辨率 DisplayMetrics dm new DisplayMetrics getWindowManager getDefaultDisplay getMetrics dm str Sc
  • 如何从 Windows 批处理文件发送简单的电子邮件?

    我正在运行 Windows 2003 Service Pack 2 我有一个按需运行的批处理文件 我希望每次运行批处理文件时都会发送一封电子邮件 邮件很简单 就是一句话表明批处理文件运行了 每次都是一样的 我尝试了几件事来完成这件事 我想到
  • 如何使用 std::ifstream 读取 UTF-8 编码的文本文件?

    我很难解析 xml 文件 文件以 UTF 8 编码保存 普通 ASCII 可以正确读取 但韩文字符则不能 所以我做了一个简单的程序来读取UTF 8文本文件并打印内容 文本文件 test txt ABC 测试程序 include
  • 通过非通用 IDictionary 枚举时,无法将通用字典项 Cast() 到 DictionaryEntry

    我有一些迭代非泛型的代码IDictionary http msdn microsoft com en us library system collections idictionary aspx首先调用 LINQCast http msdn
  • 玩! Framework 2.0 - 循环遍历 scala 模板中的地图?

    我有一张代表目录的地图 它包含Chapter键和List Section 价值观 现在我正在尝试在我的模板中循环执行此操作 如下所示 dl table of contents foreach e gt dt e 1 title dt for