我在组合表达式和字符串插值时遇到了麻烦.我想做这样的事情:
a = [:foo, :bar]
b = [:printfoo, :printbar]
for (str, fn) in zip(a,b)
@eval begin
"""
```
$fn()
```
Prints $str.
"""
$fn() = println("$str")
end
end
Run Code Online (Sandbox Code Playgroud)
我想要的输出是两个函数,一个可能看起来像打字一样
"""
```
printfoo()
```
Prints foo.
"""
printfoo() = println("foo")
Run Code Online (Sandbox Code Playgroud)
相反,我得到的表达式看起来像这样(当我使用quote时而不是@eval begin):
```\n$(fn)()\n```\nPrints $(str).\n" # /home/..., line 12:
printfoo() = begin # /home/..., line 12:
println("$(str)")
end
Run Code Online (Sandbox Code Playgroud)
我不明白为什么使用相同的$x语法,插入被执行,因为我只想在quoted("...")区域之外.我尝试了一些$($x)等等的组合但是我错过了一些细微之处:
"$str" - > "$(str)""$($str)" - > "$(foo)"会映射到"foo"什么?
谢谢.
答案似乎是$(string(str)).
以下版本对我有用,但需要进行一些调整才能达到:
a = [:foo, :bar]
b = [:printfoo, :printbar]
for (str, fn) in zip(a,b)
@eval begin
$fn() = println($(string(str)))
@doc $("```\n$fn()\n```\nPrints $str.\n") $fn
end
end
Run Code Online (Sandbox Code Playgroud)
OP代码的一个问题是当函数体在执行期间插入变量时 - 这将导致printfoo烦人的打印bar.