Как «любой» тип работает с базовыми типами, такими как строка? - PullRequest
3 голосов
/ 14 марта 2019

Я пытаюсь использовать предложение switch, чтобы определить, что делать, в зависимости от реального типа переменной типа «any», мой код падает.Код следующий:

handleResponse(any.parseType("string",respValuesRaw[type]), currEPIFace);
...
...
...
action handleResponse(any response, CurrentExtraParamsInteface currEPIFace){

switch(response){
    case string:
        {}

Я получаю сообщение об ошибке: «ParseException - Ошибка в методе ParseType (): невозможно проанализировать строку: отсутствует открывающая кавычка»

ОднакоrespValuesRaw переменная - это словарь типа <string,string>

Это на Apama 10.1.

Есть идеи, что может быть не так?

Ответы [ 3 ]

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

Согласно документу для any.parseType , это эквивалентно вызову type.parse, так что это эквивалентно string.parse , что гласит:

Метод parse принимает строку в форме, используемой для файлов событий.Строковые аргументы должны быть заключены в двойные кавычки.Все escape-символы будут преобразованы в натуральные символы.

Если вы просто хотите использовать значение записи словаря, вы, вероятно, захотите просто написать:

handleResponse(respValuesRaw[type], currEPIFace);

Значение словарной записи является строкой, и допустимо передавать любой тип параметру 'any'.

1 голос
/ 15 марта 2019

Назначение базового типа, такого как строка, для типа any абсолютно допустимо.Проблема в другом месте.

Так как вы не передаете строку в форме, используемой для файлов событий, она выдает ошибку.Расшифровка сообщения об ошибке становится действительно простой, если вы посмотрите на один пример, где используется метод parseType.Это дает некоторый намек на то, почему он действительно ищет в аргументе открывающую цитату .


Ваша проблема проста:

package com.apama.test;

event Evt{}
monitor Foo {
    action onload() {
        Evt e1;
        // handleResponse(any.parseType("string", "World!")); // #1 Invalid argument. Doesn't work
        handleResponse(any.parseType("com.apama.test.Evt", "com.apama.test.Evt()")); // #2
        handleResponse("World!"); // #3
    }
    action handleResponse(any response){
        log "Hello " + response.toString() ;
    }
}

print:

com.apama.test.Foo [1] Hello any(com.apama.test.Evt,com.apama.test.Evt())
com.apama.test.Foo [1] Hello any(string,"World!")

при раскомментировании #1 выдает ошибку, как показано ниже:

ParseException - Error in parseType() method: Unable to parse string: missing opening quote 

Далее, если вы передаете правильно сформированное, но не существующее событие parseTypeметод, он выдаст ошибку о том, что тип не может быть найден.

ParseException - Error in parseType() method: Unable to find type 'com.apama.test.Evt2' 
0 голосов
/ 14 марта 2019

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

handleResponse("string", currEPIFace);

На самом деле подойдет любое строковое значение.

...