更改特定位置字符串

我想把一个字符串特定位置的一个字符改写成’-',
我试了replace但是发现无法指定位置,所以我还是用的字符串拼接的方式

using BenchmarkTools
str="Y--ZZ-y--ZZ-ZZZ------Y------------x-zZZ-ZZ-ZZ-z-ZZY--Z----------"
function replacing(str,location)
    return SubString(str,1,location-1)*'-'*SubString(str,location+1)
end
julia> @btime replacing(str,35)
  71.939 ns (3 allocations: 160 bytes)
"Y--ZZ-y--ZZ-ZZZ------Y--------------zZZ-ZZ-ZZ-z-ZZY--Z----------"

各位大佬还有其他方式么?

没有更好的方式了。下面这种hack不要用。

julia> f(x, i) = GC.@preserve x unsafe_store!(pointer(x), '-', i)
f (generic function with 2 methods)

julia> @btime f($x, 35)
  2.750 ns (0 allocations: 0 bytes)
Ptr{UInt8} @0x000000011d8784e8

请问下f里面需要GC.@preserve的原因是什么?

unsafe_store! 要求输入参数 Ptr 指向的东西是 valid 的。在 pointer(x) 返回 Ptr 之后,x 即允许被回收,所以此处有可能成为 GC 的一个 safepoint。假如 x 在此处被回收,那么 unsafe_store! 的调用结果为 UB。

3 个赞