Объявить глобальную переменную в boo

#boo

#бу

Вопрос:

Насколько я могу судить по веб-сайту, следующий код должен компилироваться в DLL со свойством верхнего уровня Version :

 namespace MyLibrary

[Module]
class MainClass:
    public static Version as string

    static def constructor():
        Version = "0.1"
 

Это компилируется, но если я затем введу эти команды в booish :

 import MyLibrary
print (Version)
 

затем я получаю «ОШИБКА: неизвестный идентификатор: ‘Version'».

Предположительно, этот код работал в более ранней версии языка. Я использую 0.9.4.9. Каков правильный способ достижения этого эффекта?

(Я заметил, что существует неявный статический класс MyVersionModule , в который помещаются статические методы верхнего уровня, но я также не знаю, как добавить к нему свойства).

Ответ №1:

В .net нет способа иметь методы или поля, которые на самом деле не являются членами класса. Boo несколько скрывает это, имея неявный класс для основного файла в модуле (как вы заметили), но при импорте вам все равно нужно получить к нему доступ как к члену.

Для статики вы должны сначала сослаться на тип, а затем на элемент, поэтому в вашем примере печать версии будет выглядеть следующим образом:

 import MyLibrary
print (MainClass.Version)
 

Конечно, это не «правильный» способ хранения информации о версии в .net, хотя вместо этого следует использовать атрибуты уровня сборки. Это будет выглядеть примерно так:

 [assembly: System.Reflection.AssemblyVersion("1.0")]

namespace MyLibrary

[Module]
class MainClass:
  pass
 

Затем получите версию, которую вы бы сделали, используя отражение, есть несколько способов получить сборку, но самый простой — получить тип, а затем его сборку:

 import System
import System.Reflection
import MyLibrary

atts = typeof(MainClass).Assembly 
         .GetCustomAttributes(typeof(AssemblyVersionAttribute), false)

version = (atts[0] as AssemblyVersionAttribute).Version
print(version)