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

时间:2012-05-09 07:16:41

标签: opa

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

/**
  * 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)))) };
    }
}

这引发了一个语法错误:“找到一个绑定作为条件”,我的理解是因为字符串是不可变的。有没有办法改变创建的字符串?例如:

string x = "foo"
x = x ^ x

如果这是不可能的,那会是更好的方法吗?

1 个答案:

答案 0 :(得分:4)

确实,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等等

相关问题