当我通过 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),但字符串?
首先,这是一种相当奇怪的编写数组文字的方式:getindex(T, xs...)通常写为T[xs...].
但是,该错误已经非常清楚地告诉您出了什么问题:
\n\n\n不能
\nconvertString 类型的对象转换为 Int8 类型的对象
String您认为从到到 的一般转换是什么样子Int8的?"slkdfjls"例如,什么 8 位整数应该对应于 string ?毕竟,字符串是一个几乎任意的字节序列。与您的期望相反,Julia 不会尝试对所包含的值进行任何解析(为此,请使用parse(Int8, "1").
另一方面,字符表示(如果有效)单个 UTF-8 代码点,将其固定字节数重新解释为数字是有意义的:
\njulia> convert(Int16, '\xe2\x80\xa0')\n8224\n\njulia> convert(Int8, '1') # certainly not Int8(1)!\n49\nRun Code Online (Sandbox Code Playgroud)\n当值超出目标类型的范围时,转换已经具有临界意义:
\njulia> convert(Int8, '\xe2\x80\xa0')\nERROR: InexactError: trunc(Int8, 8224)\n...\nRun Code Online (Sandbox Code Playgroud)\n碰巧只能用一个字节表示的 UTF-8 字符可以无损转换为Int8;这涵盖了所有 ASCII。在此之上,会引发错误。这与 没有什么不同convert(Int8, Int32(something))。