powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / параметр класса = $LB()
17 сообщений из 17, страница 1 из 1
параметр класса = $LB()
    #37298150
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли записать в параметр класса $LB() из самого класса?
Что-то вроде:
Код: plaintext
1.
2.
3.
Class TestClass [Abstract]{
 Parameter TEST as %String={$LB( 1 , 2 , 3 , 4 )};
}
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37298187
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал на
Cache for Windows (x86-64) 2007.1.3 (Build 607) Tue Oct 16 2007 23:53:30 EDT

Всякая попытка записать в параметр что-то кроме строки или числа подсвечивается сиснтаксисом...

Т.ч. если таким вот макаром...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/// test
Class tmp.tmp Extends %Persistent
{

/// Тест параметра
Parameter PrmTest = "$lb(1,2,3,4,5,6)";

/// Взять значение метода
ClassMethod getPrmTest(N As %String =  1 ) As %String
{
	s val=@..#PrmTest
	q $li(val,N)
}

}

Код: plaintext
w ##class(tmp.tmp).getPrmTest( 4 )
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37298276
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint ,

Посмотрите допустимые типы параметров класса, в частности COSEXPRESSION .
Пример для 2010.1:

Class sql.ru Extends %Persistent
{

parameter P1 as COSEXPRESSION = "$LISTBUILD(""Red"",""Green"",""Blue"")";

ClassMethod Test()
{
  w $ll(..#P1) // результат - 3
}

}

Для предыдущих версий код нужно немного изменить: Change In Support For COSEXPRESSION
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37298394
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий, спасибо! Вопрос закрыт
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37298992
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рано радовался. Ctrl+Shift+V открыл глаза на происходящее
Код: plaintext
1.
2.
3.
Class Test Extends %RegisteredObject {
 Parameter FIELDS as COSEXPRESSION="$LB(""code"",""name"")"
}
В "просмотре других документов":
Код: plaintext
1.
2.
zFIELDSP() public {
 Quit ($LB("code","name")) }
То есть при каждом вызове метода с использованием ..#FIELDS (или $parameter(,"FIELDS") ) будет строиться один и тот же список?
Использование
Код: plaintext
1.
 Parameter FIELDS As COSCODE = "$LB(""code"",""name"")";
метод для получения параметра не генерирует, но возвращает тот же результат: $LB("code","name")

Пока сохраняю список во внешней глобали:
Код: plaintext
1.
2.
3.
4.
5.
 СlassMethod GetFields() as %String [CodeMode=generator] {
  s gln="^"_%class_"(""FIELDS"")", @gln=$LFS(%parameter("FIELDS")) 
  s %code= 0  $$$GENERATE("  Q $g("_gln_") ")
  Q $$$OK
 }

С другой стороны, в классе (таблице) %Dictionary.CompiledParameter есть булево поле CompilerGenerated. То есть возможность все таки есть...
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37299023
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint , значение параметра не меняется после компиляции... Интересно что ты там хранить собрался в параметре класса?
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37299230
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa, я осознаю что такое параметр класса, и хотел бы хранить там всего лишь строку... Только в формате $LB.
Скорее всего это невозможно, иначе будут проблемы при компиляции строк вида w ..#FIELDS
Возможно, посыл о построении списка при каждом вызове ложный... Жалко в Студии нет возможности просмотра пи-кода :)
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37299911
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintхотел бы хранить там всего лишь строку... Только в формате $LB.
Скорее всего это невозможно, иначе будут проблемы при компиляции строк вида w ..#FIELDS
Почему не возможно? Тебе показали 2 варианта как такое сделать...

doublefintВозможно, посыл о построении списка при каждом вызове ложный...
Вот тут я ничего не понял... Зачем таки строить список каждый раз?
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37300000
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa2 варианта как такое сделать. Скрыть не значит сделать.
Создайте класс с параметром любым способом. Скомпилируйте его. Посмотрите, что в хранится в таблице %Dictionary.CompiledParameter поле Default c ID: ИмяКласса||ИмяПараметра.

Для параметра c COSEXPRESSION будет сгенерирована метка zИмяПараметраP() , которая, как я подозреваю, будет вызываться, и, соответственно, строить список заново при каждом вызове из других методов.

Т.е вопрос о хранении бинарной строки в коде. Можно через выражение ($c(8,9,27) или $LB(1,2,4)), а вот что будет в пи-коде - вопрос.
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37300030
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintСоздайте класс с параметром любым способом. Скомпилируйте его. Посмотрите, что в хранится в таблице %Dictionary.CompiledParameter поле Default c ID: ИмяКласса||ИмяПараметра
Так я это и сделал со своим примером... А то как это хранит внутри себя Кашей мне не особо интересно.


Сам бы я такой параметр никогда бы не стал делать если чего... Это же твой сон, не мой...
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37300462
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa, понимаю. Это всеобщий тренд - "к черту подробности" :) И на всякий случай учить java ;(
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37302087
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint ,

Если Вы хотите сэкономить на операции $lb на этапе компиляции классов, то можно поступить, например, так:

Class del.c [ Abstract ]
{

Parameter p = ""; // аналог $lb(1,2,8)

ClassMethod test()
{
  w ..#p,!
  w $ll(..#p),! ; результат - 3
  w $li(..#p,3),! ; результат - 8
}
}

Но я не уверен в необходимости такой "оптимизации".

PPS: использовать макрос ##expression не удалось.
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37302200
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit, да, как вариант, если список не содержит символов с кодами 13,10 и т.п.
То, что список зашит в параметре - не принципиально, но удобно
Допустим есть метод, в котором основная логика - это прохождение по элементам списка.
Метод вызывается часто и является критичным.
В варианте по умолчанию он будет строиться каждый раз (утверждать этого не берусь, пи-код не смотрел).
Если разместить список в глобали - как узлы глобали или целиком, появляются сомнения, что будет быстрее - построение списка заново или использование "оптимизированной десятилетиями непрерывной эксплуатации в критически важных приложениях системы кэширования доступа к данным" :)
Основные способы уже разобрали, осталось проверить экспериментальным путем :)
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37303509
cache hit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
doublefint,

если объект долгоживущий то возможно имеет смысл предвычислить параметр во временное поле

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Class test.NewClass1 Extends %RegisteredObject
{

Parameter FIELDS As COSEXPRESSION = "$LB(""code"",""name"")";

Property FIELDS As %List [ InitialExpression = {@..#FIELDS}, Transient ];

}
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37303585
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cache hit , параметр он один и у класса. А поле оно у экземпляра. Разницу улавливаешь?
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37303934
cache hit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

разницу улавливаю. Я предлагаю решение аналогичное решению doublefint (c сохранением в глобал во время компиляции) только без глобала.

ЗЫ Да, там кстати нужно ReadOnly поставить вместе с Transient
...
Рейтинг: 0 / 0
параметр класса = $LB()
    #37306431
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cache hit, там наследник %CSP.Page, класс-метод
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / параметр класса = $LB()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]