В KRL как определить, является ли переменная массивом или хэшем? - PullRequest
3 голосов
/ 18 января 2011

В KRL я хотел бы определить, является ли переменная массивом или хэшем, чтобы я знал, нужно ли мне использовать оператор декодирования или кодирования для нее.Это возможно?

Я бы хотел сделать что-то вроде этого:

 my_var = var.is_array => var.decode() | my_var

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Обновление Лучший способ сделать это - оператор typeof () .Это новое с момента ответа, но с ранней интерпретацией переменных старый способ, указанный в ответе, больше не будет работать.

Еще один полезный оператор для проверки ваших данных - isnull ()

myHash.typeof() => "hash"
myArray.typeof() => "array"
...
2 голосов
/ 18 января 2011

Единственный способ, которым я выяснил, как определить тип структуры данных, - это принудительно вызвать строку, а затем проверить, содержит ли результирующая строка указателя слово «массив» или «хэш».

«Один вкладыш»

myHashIsHash = "#{myHash}".match(re/hash/gi);

myHashIsHash будет истинным / 1

Пример приложения, созданного для демонстрации концепции

ruleset a60x547 {
  meta {
    name "detect-array-or-hash"
    description <<
      detect-array-or-hash
    >>
    author "Mike Grace"
    logging on
  }

  global {
    myHash = {
      "asking":"Mike Farmer",
      "question":"detect type"
    };
    myArray = [0,1,2,3];
  }

  rule detect_types {
    select when pageview ".*"
    pre {
      myHashIsArray = "#{myHash}".match(re/array/gi);
      myHashIsHash = "#{myHash}".match(re/hash/gi);
      myArrayIsArray = "#{myArray}".match(re/array/gi);
      myArrayIsHash = "#{myArray}".match(re/hash/gi);

      hashAsString = "#{myHash}";
      arrayAsString = "#{myArray}";
    }
    {
      notify("hash as string",hashAsString) with sticky = true;
      notify("array as string",arrayAsString) with sticky = true;

      notify("hash is array",myHashIsArray) with sticky = true;
      notify("hash is hash",myHashIsHash) with sticky = true;
      notify("array is array",myArrayIsArray) with sticky = true;
      notify("array is hash",myArrayIsHash) with sticky = true;
    }
  }
}

Пример приложения в действии!

alt text

...