Julia Juila:将(可粘贴且“人类可读”的)值复制到剪贴板

Julia Juila:将(可粘贴且“人类可读”的)值复制到剪贴板,julia,Julia,我有一个大的Julia结构,我想复制到剪贴板 使用剪贴板(字符串(x))似乎在我的剪贴板上放置了一个“不可粘贴”(如中,给出语法错误)变体 JLD等创建了一个二进制文件,这不是我想要的 我怎样才能以一种可修改且可粘贴到Julia REPL中的方式复制值本身 不可粘贴的示例:剪贴板(π)(使用剪贴板(\pi))制作。如您在问题中所述-理想的方法是序列化和反序列化对象,但不幸的是,这种方法不起作用,例如,在Windows剪贴板上不接受NUL字符 我知道,没有一种简单且100%正确的方法可以将任何对象

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

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

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

我怎样才能以一种可修改且可粘贴到Julia REPL中的方式复制值本身


不可粘贴的示例:
剪贴板(π)
(使用
剪贴板(\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
我故意使用一个相当复杂的对象

这种方法的唯一限制是打印时不能正确表示对象(默认情况下,
剪贴板就是这样做的)

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

其后果如下:

julia> print(Any[BigInt(10), pi])
Any[10, π = 3.1415926535897...]
我们散失了
10
BigInt
(它将被解析为
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

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

您能否显示出有问题的
x
?在简单的情况下(例如数组、元组、结构),您描述的过程可以按照您所说的方式工作。您甚至可以在
x
@BogumiłKamiński上简单地编写
clipboard(x)
而不调用
string
:这是一个复杂的结构(数兆字节)。我真的不能表现出来。“剪贴板(x)
是否应该适用于“一切”,那么,这就是你所说的吗?它应该适用于大多数类型,除非它们通过
print
方法进行特殊处理。通常,如果执行打印(x),则可以复制粘贴打印的内容以重新创建对象。有两个但是:1)例如,
Float64
由于四舍五入,当然不能准确表示;2) 某些类型不能像这样进行复制粘贴,例如,如果您写入
pi
,则打印的是
π=3.1415926535897…
,并且不能进行复制粘贴。这是因为
pi
具有
非理性
类型的特殊性。另一个例子是
big(10)
,它将被打印为
10
,粘贴副本时将转换为
Int
。你是否知道这方面有什么“变通方法”(请随意发布/作为答案)?例如,我不介意剪贴板(\pi)是否在我的剪贴板上产生了3.1415926535897,这样我就可以将其粘贴回去,而不会得到错误
语法:“…”表达式外部调用
。我明白了。令人遗憾的是,这不起作用。例如,对于pi,为什么pi的unicode字符不能在剪贴板中使用?一个人会得到世界上最好的。