#function #copy #julia
#функция #Копировать #julia
Вопрос:
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я осознаю, что следующее является крайне плохой практикой. Мне просто нужно быстрое исправление для целей отладки.
Я пытаюсь запустить пакет Julia, который using
является одновременно JuMP.jl и LightXML.jl.
Я получаю следующую ошибку:
WARNING: both JuMP and LightXML export "name"; uses of it in module JEMSS must be qualified
Сначала добавляется LightXML, поэтому я хотел бы сделать копию name
, а затем переопределить JuMP.
Какой синтаксис для этого используется?
name
Функция состоит из:
name(::LightXML.XMLElement)
name(::LightXML.XMLNode)
name(::LightXML.XMLAttr)
Комментарии:
1.Вы знаете, что это предупреждение касается только кода, который вы собираетесь написать? Это не влияет на сами пакеты, поскольку их пространства имен являются эксклюзивными. Вы можете использовать их вместе без каких-либо проблем, за исключением случаев, когда вы хотите использовать
name
в своем коде, который вы пишетеJuMP.name
, когда вы хотите использовать тот, который вJuMP
иLightXML.name
когда вы хотите использовать тот, который вLightXML
. Я просто хотел указать на это, хотя то, что вы просите, вполне возможно.2. Ах, это сработало. Большое вам спасибо! Просто для интереса, как бы вы на самом деле скопировали такую функцию?
3. Зависит от того, что вы подразумеваете под копированием. Вы просто хотите, чтобы у
name
inLightXML
было другое имя, чемname
, чтобы вы могли ссылаться на него без какого-либо сговора?4. Да, именно это я и имею в виду, например,
name2 = ...
, гдеname2
может использоваться какLightXML.name
для всех методов.
Ответ №1:
Основываясь на обсуждении в комментариях, я должен написать, что предупреждение говорит вам, что если вы хотите использовать name
в своем коде, вы должны указать, какой модуль name
вы хотите использовать. Вы делаете это, уточняя ее с помощью имени модуля / пакета, такого как LightXML.name
или JuMP.name
.
Если вы хотите создать псевдоним, скажем, для LightXML.name
, это также возможно.
using LightXML
# make `name2` be an alias for `LightXML.name`
const name2 = LightXML.name # `name2` refers to `LightXML.name` but `LightXML.name` still exists
using JuMP
using JuMP: name # tell the compiler `name` without qualifiers refer to `JuMP.name` so you do not have to qualify it
На самом деле это не приводит к изменению имени LightXML.name
, а скорее создает псевдоним для LightXML.name
. После этого вы можете написать name2
вместо LightXML.name
или по-прежнему использовать LightXML.name
как есть.
Обратите внимание, что здесь const
важна деталь, иначе при каждом использовании name2
Julia вам придется проверять, изменилось ли то, на что name2
ссылается, и это приведет к снижению производительности.
Еще одна вещь, на которую следует обратить внимание, это то, что если вы хотите использовать name
без уточняющих слов для ссылки JuMP.name
, вы пишете using JuMP: name
, чтобы указать компилятору, какие name
следует использовать (поскольку все еще есть два name
слова). Однако вам следует сделать это перед использованием name
без какого-либо уточнения в вашем коде.
Поэтому следующее не будет работать.
julia> using LightXML
julia> name # we used `name` here to refer to `LightXML.name `
julia> using JuMP # this will give you the same warning in your question
julia> using JuMP: name # this will give you a warning and be **ignored**
# `name` continues to refer to `LightXML.name` rather than `JuMP.name`