字节数组字面量是不是无法插值?比如:
str = "some text"
"interpolation: $str" === "interpolation: some text"
b"interpolation: $str" // 直接把'$'给escape了
@b_str str // 报错str是个symbol
@b_str $str // 报错str是个Expr
如果自己做一个如下:
macro c_str(s)
:(UInt8.(collect($s)))
end
@c_str str // 可以,OK
c"$str" // 不行,$被escape了,'$'只是当作一个普通字符
c"中文" // 报错,不能转UInt8
请教各位,如果我要实现b"$str"
等价于 b"some text"
等价于 @b_str str
,这个改怎么做?
從這裡參考的
macro c_str(s::String)
@show typeof(s)
s = Meta.parse(""" "$s" """)
# s = Meta.parse(" \"$(escape_string(s))\" ") 和上面相同功能
:(Vector{UInt8}($s))
end
macro c_str(s::Symbol)
@show typeof(s)
:(Vector{UInt8}($s))
end
c"$str"
(type = String)
@c_str str
(type = Symbol)
Roger
3
那个 $
插值符号会作为语法树的一部分读进来
julia> ex = :("aaa $t")
:("aaa $(t)")
julia> dump(ex)
Expr
head: Symbol string
args: Array{Any}((2,))
1: String "aaa "
2: Symbol t
除非你定义解析规则,否则不能插值。
1 个赞
我是否可以这样理解,如果我想写个自定义的b_str,需要自己处理传入的字符串的replace和escape的操作?而这个replace和escape就是“定义的解析规则”,所以我可以用"$“,也可以用”#"等
Roger
5
当然可以,但是注意$的话编译器给你解析了,#的话需要你自己解析。