构造指定类型的一维数组时字符和字符串的区别

Aft*_*ray 4 julia

当我通过 usung 构造指定类型的一维数组时,我感到很困惑getindex(type[, elements...])

当然,当元素是Int时我可以转换Int 8

getindex(Int8, 1, 2)

2-element Vector{Int8}:
1
2
Run Code Online (Sandbox Code Playgroud)

即使元素是字符格式,我也可以将其转换为Int8

getindex(Int8, '1', '2')

2-element Vector{Int8}:
49
50
Run Code Online (Sandbox Code Playgroud)

但是,当元素为字符串格式时,我无法转换。

getindex(Int8, "1", "2")
Run Code Online (Sandbox Code Playgroud)

并且,引发以下错误:

MethodError: Cannot `convert` an object of type String to an object of type Int8
Closest candidates are:
  convert(::Type{T}, ::Ptr) where T<:Integer at pointer.jl:23
  convert(::Type{IT}, ::GeometryBasics.OffsetInteger) where IT<:Integer at C:\Users\Admin\.julia\packages\GeometryBasics\WMp6v\src\offsetintegers.jl:40
  convert(::Type{T}, ::SentinelArrays.ChainedVectorIndex) where T<:Union{Signed, Unsigned} at C:\Users\CARVI\.julia\packages\SentinelArrays\tV9lH\src\chainedvector.jl:209
  ...

Stacktrace:
 [1] setindex!(A::Vector{Int8}, x::String, i1::Int64)
   @ Base .\array.jl:839
 [2] getindex(#unused#::Type{Int8}, x::String, y::String)
   @ Base .\array.jl:393
 [3] top-level scope
   @ In[35]:1
 [4] eval
   @ .\boot.jl:360 [inlined]
 [5] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base .\loading.jl:1116
Run Code Online (Sandbox Code Playgroud)

为什么getindex()允许字符元素转换为不同的格式(如字符 -> Int8),但字符串

phi*_*ler 8

首先,这是一种相当奇怪的编写数组文字的方式:getindex(T, xs...)通常写为T[xs...].

\n

但是,该错误已经非常清楚地告诉您出了什么问题:

\n
\n

不能convertString 类型的对象转换为 Int8 类型的对象

\n
\n

String您认为从到到 的一般转换是什么样子Int8的?"slkdfjls"例如,什么 8 位整数应该对应于 string ?毕竟,字符串是一个几乎任意的字节序列。与您的期望相反,Julia 不会尝试对所包含的值进行任何解析(为此,请使用parse(Int8, "1").

\n

另一方面,字符表示(如果有效)单个 UTF-8 代码点,将其固定字节数重新解释为数字是有意义的:

\n
julia> convert(Int16, '\xe2\x80\xa0')\n8224\n\njulia> convert(Int8, '1')  # certainly not Int8(1)!\n49\n
Run Code Online (Sandbox Code Playgroud)\n

当值超出目标类型的范围时,转换已经具有临界意义:

\n
julia> convert(Int8, '\xe2\x80\xa0')\nERROR: InexactError: trunc(Int8, 8224)\n...\n
Run Code Online (Sandbox Code Playgroud)\n

碰巧只能用一个字节表示的 UTF-8 字符可以无损转换为Int8;这涵盖了所有 ASCII。在此之上,会引发错误。这与 没有什么不同convert(Int8, Int32(something))

\n