#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)