如何为自定义数组类型重载 Base.show ?

2024-02-27

假设我用它自己的自定义来制作我自己的自定义向量类型show method:

struct MyVector{T} <: AbstractVector{T}
    v::Vector{T}
end

function Base.show(io::IO, v::MyVector{T}) where {T}
    println(io, "My custom vector with eltype $T with elements")
    for i in eachindex(v)
        println(io, "  ", v.v[i])
    end
end

如果我尝试在 REPL 中创建这些对象之一,我会收到与我从未打算调用的函数相关的意外错误:

julia> MyVector([1, 2, 3])
Error showing value of type MyVector{Int64}:
ERROR: MethodError: no method matching size(::MyVector{Int64})
Closest candidates are:
  size(::AbstractArray{T,N}, ::Any) where {T, N} at abstractarray.jl:38
  size(::BitArray{1}) at bitarray.jl:77
  size(::BitArray{1}, ::Integer) at bitarray.jl:81
  ...
Stacktrace:
 [1] axes at ./abstractarray.jl:75 [inlined]
 [2] summary(::IOContext{REPL.Terminals.TTYTerminal}, ::MyVector{Int64}) at ./show.jl:1877
 [3] show(::IOContext{REPL.Terminals.TTYTerminal}, ::MIME{Symbol("text/plain")}, ::MyVector{Int64}) at ./arrayshow.jl:316
 [4] display(::REPL.REPLDisplay, ::MIME{Symbol("text/plain")}, ::Any) at /Users/mason/julia/usr/share/julia/stdlib/v1.3/REPL/src/REPL.jl:132
 [5] display(::REPL.REPLDisplay, ::Any) at /Users/mason/julia/usr/share/julia/stdlib/v1.3/REPL/src/REPL.jl:136
 [6] display(::Any) at ./multimedia.jl:323
 ...

好吧,无论如何,我会实施Base.size所以它会让我一个人呆着:

julia> Base.size(v::MyVector) = size(v.v)

julia> MyVector([1, 2, 3])
3-element MyVector{Int64}:
Error showing value of type MyVector{Int64}:
ERROR: getindex not defined for MyVector{Int64}
Stacktrace:
 [1] error(::String, ::Type) at ./error.jl:42
 [2] error_if_canonical_getindex(::IndexCartesian, ::MyVector{Int64}, ::Int64) at ./abstractarray.jl:991
 [3] _getindex at ./abstractarray.jl:980 [inlined]
 [4] getindex at ./abstractarray.jl:981 [inlined]
 [5] isassigned(::MyVector{Int64}, ::Int64, ::Int64) at ./abstractarray.jl:405
 [6] alignment(::IOContext{REPL.Terminals.TTYTerminal}, ::MyVector{Int64}, ::UnitRange{Int64}, ::UnitRange{Int64}, ::Int64, ::Int64, ::Int64) at ./arrayshow.jl:67
 [7] print_matrix(::IOContext{REPL.Terminals.TTYTerminal}, ::MyVector{Int64}, ::String, ::String, ::String, ::String, ::String, ::String, ::Int64, ::Int64) at ./arrayshow.jl:186
 [8] print_matrix at ./arrayshow.jl:159 [inlined]
 [9] print_array at ./arrayshow.jl:308 [inlined]
 [10] show(::IOContext{REPL.Terminals.TTYTerminal}, ::MIME{Symbol("text/plain")}, ::MyVector{Int64}) at ./arrayshow.jl:345
 [11] display(::REPL.REPLDisplay, ::MIME{Symbol("text/plain")}, ::Any) at /Users/mason/julia/usr/share/julia/stdlib/v1.3/REPL/src/REPL.jl:132
 [12] display(::REPL.REPLDisplay, ::Any) at /Users/mason/julia/usr/share/julia/stdlib/v1.3/REPL/src/REPL.jl:136
 [13] display(::Any) at ./multimedia.jl:323
 ...

嗯,现在想要getindex

julia> Base.getindex(v::MyVector, args...) = getindex(v.v, args...)

julia> MyVector([1, 2, 3])
3-element MyVector{Int64}:
 1
 2
 3

什么?这不是我告诉它的打印格式!这里发生了什么?


问题是在julia中,Base定义了一个方法Base.show(io::IO ::MIME"text/plain", X::AbstractArray)这实际上比Base.show(io::IO, v::MyVector)为了display. 朱莉娅手册的这一部分描述了自定义打印的类型AbstractArray uses https://docs.julialang.org/en/v1/manual/types/#man-custom-pretty-printing。所以如果我们想使用我们的自定义show方法,我们需要做

julia> function Base.show(io::IO, ::MIME"text/plain", v::MyVector{T}) where {T}
           println(io, "My custom vector with eltype $T and elements")
           for i in eachindex(v)
               println(io, "  ", v.v[i])
           end
       end

julia> MyVector([1, 2, 3])
My custom vector with eltype Int64 and elements
  1
  2
  3

也可以看看:https://discourse.julialang.org/t/extending-base-show-for-array-of-types/31289 https://discourse.julialang.org/t/extending-base-show-for-array-of-types/31289

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为自定义数组类型重载 Base.show ? 的相关文章

  • 有没有办法重置 Julia 中的当前工作目录?

    假设当前工作目录是C 保存 jl文件的目录 然后我将cwd切换到一些子文件夹来执行一些任务 有没有办法直接将cwd重置回C 之后 即最初的cwd 或者 是否可以独立于当前工作目录来定位正在运行的 jl 文件所在的目录 无需事先将 cwd 保
  • 如何加快 Julia 脚本的启动时间

    我编写了一个脚本来在 Julia 中绘制每日数据 但我发现它运行缓慢 似乎没有理想的方法来加速它 例如 foo jl bin bash exec julia O0 compile min BASH SOURCE 0 using Unicod
  • Julia 自定义类型分配

    我尝试从 Julia 中的自定义类型分配多个元素 但是我不知道该怎么做 或者换句话说 我想重载赋值运算符以返回该类型中包含的所有元素的元组 这是所需的行为 type foo a b end a b foo 1 2 a gt 1 这是错误消息
  • 带有 varargs 的 Julia @evalpoly 宏

    我正在尝试使用 Julia 的 evalpoly宏 当我手动提供系数时它可以工作 但我一直无法弄清楚如何通过数组提供这些系数 julia gt VERSION v 0 3 5 julia gt evalpoly 0 5 1 2 3 4 3
  • 在 Julia 中有效求解特定线性系统

    我广泛使用朱莉娅的线性方程求解器res X b 由于参数变化 我必须在程序中使用它数百万次 这工作正常 因为我使用的是小尺寸 最多30 现在我想分析更大的系统 最多1000 线性求解器不再有效 我认为可以有一个解决办法 然而我必须说 有时我
  • Julia JUMP Gurobi MIP - 查询并存储最佳目标并在运行时绑定

    我通过 Julia 中的 JuMP 包使用 Gurobi 来解决混合整数程序 我想获得一个图表像这个 https i stack imgur com 427LC png 其中还提供了基于 Python 的解决方案 也已在古罗比社区形式 ht
  • 埃拉托斯特尼筛法速度比较:Python 与 Julia

    所以我有一个用 Python 和 Julia 编写的 Eratosthenes 函数的小筛子 并且我正在比较运行时间 这是Python代码 import time def get primes n numbers set range n 1
  • 在 Julia 中,有没有办法让“现在”(至少)达到毫秒精度?

    通常 要了解代码中发生的情况 您需要高精度时间来分析您的应用程序或出于其他原因 显然 现在 https stackoverflow com questions 32407509 how to get the milliseconds fro
  • 如何在 Julia 中创建一个数组?

    在许多机器学习用例中 您需要创建一个充满 1 且具有特定维度的数组 在Python中 我会使用np ones 2 1 Julia 中的模拟版本是什么 朱莉娅有一个内置的ones可以使用如下函数 julia gt ones 1 2 1 2 M
  • 使用 Julia 的 Debugger.jl - 如何进入类似于 Python 的 pdb.set_trace() 或 ipdb.set_trace() 的调试模式?

    Julia 的新 Debugger jl 很棒 但有时要达到我想要达到的代码中的确切位置有点痛苦 有没有办法可以进入交互式调试模式 类似于 Python 在 pdb set trace 或 ipdb set trace 中的模式 例如 我希
  • 用以前的非缺失值填充“缺失”值的有效方法是什么?

    我有一个向量 using Missings v allowmissing rand 100 v rand 100 lt 0 1 missing 最好的填充方式是什么v与最后一个非缺失值 现在 for i val in enumerate v
  • 如何从字符串转换为数组?

    If s 1 2 3 4 5 我们如何从中获得一个整数数组 我想返回 5 个元素Array Int64 1 1 2 3 4 5 正如 isebarn 使用的那样 split s 对于将字符串拆分为单词非常有用 默认情况下按空格拆分 juli
  • Julia:将数组数组转换为二维数组

    我有一个数组d包含一个浮点数组 julia gt d 99 element Array Array Float64 1 1 我正在尝试将其转换为二维数组 并且我成功地实现了我的目标 data Array Float64 length d l
  • 如何在 Julia 中进行两个变量数值积分?

    我可以使用 Julia 在 Julia 中进行单变量数值积分quadgk 一些简单的例子 julia gt f x cos x f generic function with 1 method julia gt quadgk f 0 pi
  • 使用 Pkg.add 时出现 julia 错误

    我刚刚在ubuntu中安装了julia 在添加包时发现了一些问题 julia gt Pkg Add Gadfly ERROR UndefVarError Add not defined 我也尝试更新 julia 但弹出错误 julia gt
  • 如何终止 Julia 中的任务/协程?

    using HttpServer http HttpHandler do request Request response Response show request Response Hello there end http events
  • 如何在 Julia 中有效计算二次形式?

    我想计算一个二次形式 x Q y在朱莉娅 对于这种情况 计算此值的最有效方法是什么 没有假设 Q是对称的 x and y是相同的 x y Both Q是对称的并且x y 我知道朱莉娅有dot 但我想知道它是否比 BLAS 调用更快 现有的答
  • 可选参数的 Julia 约定

    假设我有一个函数 例如f x y 但是y参数是可选的 首选设置方式是什么y作为可选参数 对我有用的一种选择 function f x y nothing do stuff if y nothing do stuff else do stuf
  • 从 Julia 更新 C 结构体的字段值

    我的问题很简单 但我不知道最好的方法 或者 Julia 目前没有提供这样的方法 如何从 Julia 设置 C 结构的字段值 假设您有一个结构类型来表示 C 库中树的节点 typedef struct node s int type node
  • 如何在 Julia 中将列数据类型从浮点更改为字符串?

    我正在尝试将数据框中的一列从浮点数转换为字符串 我努力了 df readtable data csv coltypes String String String String String Float64 Float64 String 但我

随机推荐

  • PHP cURL,使用 CURLOPT_RETURNTRANSFER 时出现内存泄漏

    下面的代码是在一个循环中 每个循环都会将 URI 更改为新地址 我的问题是每次传递都会占用越来越多的内存 ch curl init curl setopt ch CURLOPT URL URI curl setopt ch CURLOPT
  • MySQL 与 Sequelize:ER_BAD_DB_ERROR:未知数据库

    我正在遵循教程 下面是代码 var Sequelize require sequelize var sequelize new Sequelize basic mysql database mysql root password diale
  • 如何在 Ruby 中执行相当于 's3cmd ls s3://some_bucket/foo/bar' 的操作?

    如何在 Ruby 中执行相当于 s3cmd ls s3 some bucket foo bar 的操作 我找到了适用于 Ruby 的 Amazon S3 gem 以及正确的 AWS S3 库 但不知何故 如何在 S3 文件夹 之类的位置上执
  • MessageKit 不显示消息输入栏 Swift 5

    这是控制器层次结构 tabBarController gt 一些控制器和聊天频道控制器 并且这个聊天频道控制器也是一个导航控制器 当我选择行时 它会推送到 MessageViewController 类的聊天控制器 我这里有两个问题 一是小
  • 为什么使用 Tiled 的 libgdx 游戏中出现线条?

    我正在使用 LibGdx 和 Tiled 当在屏幕上移动时 游戏上会出现水平线和垂直线 如果需要的话 我可以发布您需要的任何代码 我怎样才能让这些线路停止 这是一个 gfycat gif 的线条 http gfycat com FastUn
  • QML - MouseArea/MouseEvent 问题

    下面的代码生成一个白色矩形 其中包含一个红色矩形和一个灰色矩形 每个矩形都有一个关联的 MouseArea 当鼠标在灰色矩形内单击时 灰色矩形会变成蓝色 当鼠标光标进入红色矩形内部时 红色矩形会打印一条控制台消息 当发出释放信号时 会打印另
  • 我如何比较“Bcrypt”Gem 解密的密码和加密的密码

    我正在尝试对某些帖子的评论使用简单的身份验证 用户使用即时 ID 和密码输入评论 我使用 bcrypt gem 将密码存储在数据库中 就像comments controller rb中这样 comment Comment new comme
  • Django 中子查询的查询

    我正在尝试从另一个查询执行查询 但 Django 说 渲染时捕获数据库错误 子查询返回超过 1 行 我正在使用 PostGis my model class Place models Model coordinate models Poin
  • 通过 .htaccess 文件为所有 PHP 脚本设置 HTTP 标头

    我在我的一个项目中对所有 PHP 程序编写了相同的代码行 是否可以在目录的 htaccess 中执行此操作 如何 PHP 代码 Header Content Type application xhtml xml charset utf 8
  • 混淆矩阵和列联表有什么区别?

    我正在编写一段代码来评估我的聚类算法 我发现每种评估方法都需要来自m n类似矩阵A aij where aij是属于类成员的数据点的数量ci和簇的元素kj 但似乎有两个这种类型的矩阵数据挖掘简介 Pang Ning Tan 等 一个是混淆矩
  • iOS:无法启动 .app 文件

    我不知道为什么它在我的 app 文件中寻找目录 每次我运行应用程序时 它都会在 iPhone 上安装应用程序 但不会运行并给出以下错误 谁能告诉我这个设置存储在哪里 谢谢 error failed to launch Users xxx L
  • 更新/替换 Google 文档上的内嵌图像

    我正在尝试设置一个功能来更新 Google 文档上的图像 就像 Lucidchart Add on 对其 更新插入图表 功能所做的那样 为此 我目前正在执行以下操作 创建命名范围并将其 id 与生成图像的数据一起存储在文档属性中 以供以后检
  • 内部 __lzcnt64 使用不同的编译选项返回不同的值

    我有以下代码 include
  • BindingResult 和 bean 名称“categoryOptions”的普通目标对象都不能作为请求属性

    我知道这个主题有很多线程 我已经尝试了其中的大多数 但仍然无法解决我的问题 我正在使用SpringMVC and MongoDB我想要实现的是 我将在数据库中存储一些数据 然后将其从数据库检索回选择选项 这是我的代码 Jsp页面
  • SQLite:结束事务花费的时间太长

    我正在事务中插入几行 但是 当我执行 END TRANSACTION 时 执行时间约为 250 毫秒 而 BEGIN TRANSACTION 则几乎不需要 1 毫秒左右 我需要加快这里的速度以适应我的应用程序 我怎么能够 编辑 单线程正在访
  • SSL:CERTIFICATE_VERIFY_FAILED 证书验证失败:自签名证书(_ssl.c:1129)

    我正在尝试自动创建受信任的证书和非对称密钥 然后执行自动安装过程 目前 所有这些都是使用 OpenSSL 实用程序手动完成的 我正在使用 Cryptography io 库来实现此自动化 并尝试使用代码生成的证书连接到服务器 当我调用 Po
  • Symfony2 - 从编译器通道访问内核

    有没有办法从编译器通道内部访问内核 我试过这个 public function process ContainerBuilder container kernel container gt get kernel 这会引发错误 还有其他方法吗
  • 是否可以从 Silverlight / C# 调用 matlab 函数?

    是否可以从 Silverlight C 调用 matlab 函数 如果您有一个可以解释 Mathlab 调用的程序集 dll 您应该能够将该程序集包含在您的项目中 并将其与应用程序的其余部分一起编译 显然 您将无法并行运行 Silverli
  • 为什么我的 Android ListAdapter 只显示一项?

    在我的 Android 应用程序中 我正在尝试构建我的第一个自定义列表适配器 我现在设法让它显示一项 但不幸的是 列表中有 8 个项目时 只能显示一项 我的适配器如下所示 public class PossibilitiesAdapter
  • 如何为自定义数组类型重载 Base.show ?

    假设我用它自己的自定义来制作我自己的自定义向量类型show method struct MyVector T lt AbstractVector T v Vector T end function Base show io IO v MyV