我有一个 EDN 配置文件,其中的条目引用现有函数,例如:
:attribute-modules {:content {:class lohan.extractors.content/process}
:schema {:class lohan.extractors.schema/process}
:label {:class lohan.extractors.label/process}
:user {:class lohan.extractors.user/process}
:env {:class lohan.extractors.env/process}}
使用 clojure.edn/read-edn,这些条目被读取为符号,但我希望能够在运行时调用它们。这样做的目的是为用户提供一种方式来提供他自己的一套功能。
我怎样才能做到这一点?
最佳答案
您可以使用 resolve
调用由 Symbol 引用的 var 中保存的函数.
例如,如果你想通过使用它的 Symbol 来调用 +
,你可以使用:
((resolve '+) 1 2)
;=> 3
因此,使用您的示例,您可以:
((resolve (get-in (clojure.edn/read-string "{:content {:class ohan.extractors.content/process}
:schema {:class lohan.extractors.schema/process}
:label {:class lohan.extractors.label/process}
:user {:class lohan.extractors.user/process}
:env {:class lohan.extractors.env/process}}")
[:content :class])))
您需要限制用户可访问的允许符号集,或者高度信任提供 edn 的用户,以防止他们在运行环境中执行您不希望的任何功能他们可以访问。
关于clojure - 调用从 EDN 文件中读取的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27920520/