gpt4 book ai didi

c - 不可变的 julia 结构是否可以安全地进行变异,在什么条件下可以安全地进行变异?

转载 作者:太空宇宙 更新时间:2023-11-04 06:46:18 25 4
gpt4 key购买 nike

灵感来自帖子at Julia discourse我想问同样的问题,但有一个问题。

考虑:

struct HappyImmutable
a::Int
end

我无法更改字段 a。它当然是不可变的:

julia> struct HappyImmutable
a::Int
end

julia> b = HappyImmutable(1)
julia> b.a
1

julia> b.a = 2
ERROR: setfield! immutable struct of type HappyImmutable cannot be changed
Stacktrace:
[1] setproperty!(::HappyImmutable, ::Symbol, ::Int64) at ./sysimg.jl:19
[2] top-level scope at none:0

这对我来说非常有意义。但是,通过阅读 Julia 源代码,我发现有一个 if 语句阻止我改变结构。

 JL_CALLABLE(jl_f_setfield)
{
JL_NARGS(setfield!, 3, 3);
jl_value_t *v = args[0];
jl_value_t *vt = (jl_value_t*)jl_typeof(v);
if (vt == (jl_value_t*)jl_module_type)
jl_error("cannot assign variables in other modules");
if (!jl_is_datatype(vt))
jl_type_error("setfield!", (jl_value_t*)jl_datatype_type, v);
jl_datatype_t *st = (jl_datatype_t*)vt;
if (!st->mutabl)
jl_errorf("setfield! immutable struct of type %s cannot be changed", jl_symbol_name(st->name->name));
size_t idx;
if (jl_is_long(args[1])) {
idx = jl_unbox_long(args[1]) - 1;
if (idx >= jl_datatype_nfields(st))
jl_bounds_error(args[0], args[1]);
}
else {
JL_TYPECHK(setfield!, symbol, args[1]);
idx = jl_field_index(st, (jl_sym_t*)args[1], 1);
}
jl_value_t *ft = jl_field_type(st,idx);
if (!jl_isa(args[2], ft)) {
jl_type_error("setfield!", ft, args[2]);
}
jl_set_nth_field(v, idx, args[2]);
return args[2];
}

通过删除那个 if 语句并实现我自己的 setfield!我想我确实可以改变结构。问题是,这样做会带来什么后果和蠕虫病毒?这样做安全吗?

编辑似乎有些人误解了我,我不想修改语言本身,而是声明一个外部 C 函数,它与运行时定义的函数做同样的事情。

最佳答案

如果您以允许违反指定语言规则的方式修改语言实现,您可以为所欲为。然而:

  1. 您使用的语言不再是 Julia,并且
  2. 您所做的任何更改都可能会引入错误。如果您添加后门以允许违反原始语言的约束,您很可能会发现您尚未检查的语言实现的其他部分正在使用取决于这些语言约束的不变量,而且,没有做出重要的在其他地方更改,您的更改最终会成为错误。

您尝试做的事情听起来非常不明智。

关于c - 不可变的 julia 结构是否可以安全地进行变异,在什么条件下可以安全地进行变异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57579231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com