2012-05-09 37 views
2

我正在编辑Opa文档中的Hello-wiki代码。我想要一个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)))) }; 
    } 
} 

这就提出了一个语法错误:“找到了一个结合的条件”,因为字符串是不可变的,我的理解。有没有办法改变一个创建的字符串?例如:

string x = "foo" 
x = x^x 

如果这是不可能的,这将是一个更好的办法?

回答

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等

+0

我在编译有关地图类型时出现错误。我应该使用StringMap.fold或Map.fold来代替?我无法弄清楚他们的语法。 Opas类型表达式对我来说还是有点失落。 – schme

+0

对不起,我没有意识到你正在使用'[/ wiki]'作为一个参数。我只是修正了上面的例子。写'/ wiki',而不是'[/ wiki]'这是一个包含一个元素(wiki地图)的列表。是的,使用Map.fold(它适用于任何类型的地图,它是一个多态函数)或StringMap,它只能用于stringmaps。然后,你的折叠函数需要3个参数map key,value和你的累加器。有关Typer的更多信息,请访问:http://doc.opalang.org/manual/The-type-system –

+0

谢谢!需要大量的信息和更好的理解。 – schme