我有一个 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 这些条目被读取为符号,但我希望能够在运行时调用它们。这样做的目的是为用户提供一种提供他自己的功能集的方法。
我怎样才能实现这个目标?
您可以使用 Symbol 引用的 var 来调用保存在 var 中的函数resolve https://clojuredocs.org/clojure.core/resolve.
例如,如果您想调用+
通过使用它的符号,您可以使用:
((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 的用户具有高度信任,以防止他们在运行环境中执行您不希望他们执行的任何功能进入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)