Почему мои методы получения не вызываются, когда я пытаюсь получить доступ к полю за пределами класса? - PullRequest
2 голосов
/ 28 марта 2019

Я знакомлюсь с Haxe и в основном использую его для генерации кода Python и C # DLL.

Однако я сталкивался с одной и той же проблемой несколько раз: всякий раз, когда я пытаюсь написать геттеры, они работают нормально, когда я обращаюсь к соответствующему свойству изнутри метода, но когда я пытаюсь получить доступ к ним извне класса, они даже не звонил. Я начинаю подозревать, что упускаю что-то фундаментальное.

Например, если я напишу следующий класс:

@:expose
@:keep
class TestClass
{
    public var testField(get, null):String;

    private function get_testField():String
    {
        trace("executing getter");
        return "testString";
    }

    public function new() {}

    public function testMethod()
    {
        trace(testField);
    }
}

и затем в Python:

testInstance = MyModule.TestClass();
testInstance.testMethod();

... выводит как ожидалось:

executing getter
testString

но

print(testInstance.testField)

... выходы None.

Я ожидаю, что testInstance.testField вернет "testString" во всех случаях, что я делаю не так? Это происходит и в C #.

1 Ответ

3 голосов
/ 28 марта 2019

Это потому, что свойства в Haxe являются функцией времени компиляции и не генерируют собственные свойства.Не все цели даже имеют свойства, и те, которые, вероятно, не на 100% соответствуют семантике Haxe.

Вместо этого доступ к свойству заменяется вызовами методов доступа (get_field(), set_field()) при компиляциивремя.Следовательно,

trace(testField);

при компиляции в Python превращается в следующее:

print(str(self.get_testField()))

Таким образом, чтобы получить согласованные результаты, вам нужно будет также вызвать get_testField() на стороне Python.

Для целей C # и Flash существуют метаданные для генерации собственных свойств (см. haxe --help-metas):

@:property - Помечает поле свойства для компиляции какСобственное свойство C # (только cs)

@:getter - (Имя поля класса) Создает встроенную функцию получения для данного поля (только флэш-память)

@:setter - (Имя поля класса)Генерирует встроенную функцию установки для заданного поля (только флэш-память)

Обратите внимание, что целевая область C # @:property работает только для свойств без физического поля .В вашем примере (get, null) пришлось бы заменить на (get, never), чтобы он заработал.

В настоящее время существует запрос открытой функции для поддержки собственных свойств цели JS через @:property.Это также может иметь смысл для Python, учитывая, что он тоже имеет нативные свойства.Возможно, рассмотрите возможность открытия вопроса.:)

...