关于字节数组字面量(@b_str)

字节数组字面量是不是无法插值?比如:

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)

那个 $ 插值符号会作为语法树的一部分读进来

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就是“定义的解析规则”,所以我可以用"$“,也可以用”#"等

当然可以,但是注意$的话编译器给你解析了,#的话需要你自己解析。