朱莉娅:将(复制和“人类可读”)值复制到剪贴板

问题描述 投票:0回答:1

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

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

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

如何以可修改的方式复制值本身并将其粘贴到Julia REPL中?

不可糊化的例子:clipboard(π)(用clipboard(\pi)制造)。

julia
1个回答
1
投票

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

没有简单且100%正确的方法将任何对象粘贴到剪贴板并在以后重新构建它我知道。但是,在大多数情况下,只需在clipboard(x)作为您的对象时编写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), π]

现在你可以再次使用clipboard

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

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

© www.soinside.com 2019 - 2024. All rights reserved.