julia - Julia : copy (pasteable and "human-readable") value to clipboard

标签 julia

我有一个大型 Julia 结构,我想将其复制到剪贴板。

使用剪贴板(string(x))似乎在我的剪贴板上放置了一个“不可粘贴”(如给出语法错误)变体。

JLD 等创建了一个二进制文件,这不是我想要的。

如何以稍后可修改和粘贴到 Julia REPL 的方式复制本身?

不可粘贴的示例:clipboard(π)(使用 clipboard(\pi) 制作)。

最佳答案

正如您的问题所述 - 理想的方法是序列化和反序列化对象,但不幸的是,这种方法不起作用,例如Windows 剪贴板上不接受 NUL 字符。

据我所知,没有简单且 100% 正确的方法可以将任何对象粘贴到剪贴板并在以后重建它。 但是,在大多数情况下,当 x 是您的对象时,只需编写 clipboard(x) 就可以了。 然后,如果您将其粘贴到 REPL 中并评估所有内容都应该有效,例如:

julia> x = Dict(:a=>1, "a"=>2, nothing=>[1,2,3, (1,2,3)])
Dict{Any,Any} with 3 entries:
  :a      => 1
  nothing => Any[1, 2, 3, (1, 2, 3)]
  "a"     => 2

julia> clipboard(x)

现在将其粘贴到 REPL 中以获取:

julia> Dict{Any,Any}(Pair{Any,Any}(:a, 1),Pair{Any,Any}(nothing, Any[1, 2, 3, (1, 2, 3)]),Pair{Any,Any}("a", 2))
Dict{Any,Any} with 3 entries:
  :a      => 1
  nothing => Any[1, 2, 3, (1, 2, 3)]
  "a"     => 2

julia> Dict{Any,Any}(Pair{Any,Any}(:a, 1),Pair{Any,Any}(nothing, Any[1, 2, 3, (1, 2, 3)]),Pair{Any,Any}("a", 2)) == x
true

我故意使用了一个非常复杂的对象。

此方法的唯一限制是打印时无法正确表示对象(这是 clipboard 默认情况下所做的)。

例如,BigInt(10) 打印为 10pi 打印为 π = 3.1415926535897....

结果如下:

julia> print(Any[BigInt(10), pi])
Any[10, π = 3.1415926535897...]

我们丢失了 10BigInt (它将被解析为 Int)和 pi 部分的信息不会解析。

解决方法是重写那些有问题的类型的 show 方法(尽管这是类型盗版,所以要小心限制这种方法的使用)。例如:

julia> Base.show(io::IO, x::Irrational{sym}) where {sym} = print(io, "$sym")
WARNING: Method definition show(IO, Base.Irrational{sym}) in module Base at irrationals.jl:12 overwritten in module Main at REPL[31]:1.

julia> Base.show(io::IO, x::BigInt) = print(io, string("BigInt(",string(x),")"))
WARNING: Method definition show(IO, Base.GMP.BigInt) in module GMP at gmp.jl:569 overwritten in module Main at REPL[32]:1.

julia> print(Any[BigInt(10), pi])
Any[BigInt(10), π]

现在您可以再次使用剪贴板:

julia> x = Any[BigInt(10), π]
2-element Array{Any,1}:
 BigInt(10)
          π

julia> clipboard(x)

如果将剪贴板粘贴到 REPL,您将得到:

julia> Any[BigInt(10), π]
2-element Array{Any,1}:
 BigInt(10)
          π

julia> Any[BigInt(10), π] == x
true

不幸的是,您必须对每种违规类型执行此操作,有时可能很复杂。例如,如果您使用稀疏数组,其 print 方法将显示:

julia> print(sparse([1,2,3]))
  [1]  =  1
  [2]  =  2
  [3]  =  3

必须完全重写并用稀疏数组的某些构造函数替换,这很复杂。您会遇到类似的问题,例如格式错误的字符串默认情况下打印效果不佳。

关于julia - Julia : copy (pasteable and "human-readable") value to clipboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49013327/

相关文章:

julia - 基于一个的数组索引是否有性能损失?

for-loop - Julia - for 循环中的上一个和下一个值

indexing - Julia 中的逻辑索引

arrays - Julia:初始化不同类型的数值数组

julia - 在 Julia 的上下文中什么是自引用对象?

Julia : How to permute randomly a vector in julia?

julia - 错误: `*` 没有方法匹配 *(::Variable)

julia - 重载已被导入模块使用的函数名称

Julia @code_warntype 揭示了隐藏的临时变量#temp#

optimization - 使用 `Plots.jl` 在 3d 空间中将 2d 函数绘制为曲面