Копирование функции из пакета в Julia

#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 in LightXML было другое имя, чем 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`