Opa:迭代 stringmap 并基于它形成一个新字符串

标签 opa

我正在编辑Hello-wiki来自 Opa 文档的代码。我想要一个维基主题包含数据库中现有主题的列表。我有一个在默认主题上调用的函数:

/**
  * Collect all created topics from /wiki 
  * and present them in Markdown format
  */
function collect_topics(page) {
    string collection = "#Available topics\n"

    // Format as a list
    Set.iter(function( topic ) {
        collection = "{collection} *[{topic}](./{topic})\n"
    }, [/wiki])

    save_source(page, collection)
}

...

function start(url) {

    match (url) {

        case {path: [] ... } :
            { collect_topics("Topics") };

        case {~path ... } :
            { display(String.capitalize(String.to_lower(String.concat("::", path)))) };
    }
}

这会引发语法错误:“找到一个绑定(bind)作为条件”,据我所知,因为字符串是不可变的。有没有办法更改创建的字符串?例如:

string x = "foo"
x = x ^ x

如果这是不可能的,更好的方法是什么?

最佳答案

事实上,Opa 是一种函数式编程语言,值是不可变的。如果您确实想要一个可变值,请使用 http://doc.opalang.org/module/stdlib.core/Mutable或用于处理应用程序状态(带安全更新)的单元格 http://doc.opalang.org/value/stdlib.core.rpc.core/Cell/make

以下是您应该如何编写代码:

function collect_topics(page) {

    collection =
        Map.fold(function( key, value, acc ) {
            "{acc}\n *[{key}](./{value})"
        }, /wiki, "#Available topics\n")

    collection
}

这里我使用Set.fold而不是Set.iter。 List.fold 文档应该帮助您了解“折叠”函数的工作原理:http://doc.opalang.org/value/stdlib.core/List/fold

Set.iter 不返回任何内容(void),它仅用于迭代集合并执行一些副作用,例如在控制台中打印日志、修改 Dom 等

关于Opa:迭代 stringmap 并基于它形成一个新字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10511445/

相关文章:

html - 我可以在 Opa 中使用 XHTML 1.1 以外的东西吗?

google-analytics - opa:谷歌分析

opa - 如何让 SimpleTable 组件工作?

opa - 相当于 Db 的 List.exists

Opa:如何在不阻塞 UI 的情况下与数据库交互

file-io - 如何在 Opa 中进行文件 I/O?

opa - 如何在Opa中执行对数据库的查询?

opa - 保护 String.to_int 和其他

compiler-errors - 从源代码构建期间出错

compiler-errors - 尝试构建Opa应用程序时出错