首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ObjectScript中使用标志?

如何在ObjectScript中使用标志?
EN

Stack Overflow用户
提问于 2012-10-09 23:51:54
回答 1查看 208关注 0票数 1

在C#中,这是允许的:

代码语言:javascript
复制
    [Flags]
    private enum PermissionType
    {
        Read = 0x0001,
        Write = 0x0002,
        Execute = 0x0004,
        All = Read | Write | Execute
    }

这允许:

代码语言:javascript
复制
private bool TestPerm(PermissionType p)
{
    if( PermissionType.Read & p) return true; // user can read    
    if( PermissionType.Write & p) return true; // user can write
    if( PermissionType.Execute & p) return true; // user can Execute
    //etc
}

它可以这样命名:

代码语言:javascript
复制
Testperm( PermissionType.Read | PermissionType.Write ); 

我知道ObjectScript中没有枚举DataType,但我认为具有这样属性的常规类应该可以工作……

代码语言:javascript
复制
Class Sample.AcknowledgeType Extends %RegisteredObject
{
    Property Read As %Integer [ InitialExpression = 1 ];
    Property Write As %Integer [ InitialExpression = 2 ];
    Property Execute As %Integer [ InitialExpression = 4 ];
    Property All As %Integer [ InitialExpression = 7 ];
}

这就是我所得到的。如何编写TestPerm方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-10 01:38:01

它不是那样工作的。

您在对象上定义的每个属性都为每个实例使用内存中的字段(如果是持久化类,则还会使用磁盘中的字段)。因此,您可能会为read、write、execute和all定义一个类参数,而不是使用初始表达式定义属性。

此外,缓存对象脚本是MUMPS语言的超集,不允许您进行小打小闹。语言有一个允许这样做的扩展-- $BIT内置函数。这将获取/设置字符串中指定位置的位串的值。

因此,您可以尝试:

代码语言:javascript
复制
Parameter READ=1;
Parameter WRITE=2;
Parameter EXECUTE=3;

    Method TestPerm(Permissions as %String) as %Boolean
    {
        If $BIT(Permissions,..#READ) Quit 1
        If $BIT(Permissions,..#WRITE) Quit 1
        If $BIT(Permissions,..#EXECUTE) Quit 1
        Quit 0
    }

如果没有按位的布尔运算符,这就不那么方便了。更糟的是。

如果不使用%Dictionary包中的反射功能,则无法从类外部实际访问类参数。这太难了,也太慢了,所以最好的选择可能是用方法公开枚举值。

代码语言:javascript
复制
Method GetReadParameter()
{
    Quit ..#READ
}

所以现在可以这样写:

代码语言:javascript
复制
Set $BIT(Permissions,MyObject.GetReadParameter())
Set $BIT(Permissions,MyObject.GetWriteParameter())
Set HasPermission=MyObject.TestPerm(Permissions)

因此,一旦我们欣赏完这段代码的美妙之处,可能就应该承认,如果没有本机的逐位布尔运算符,这种C#习惯用法就不值得了。相反,只需创建一个Permissions类,并具有读取、写入和执行的布尔属性。"All“可以是计算属性。

如果您确实需要,可以创建一个具有读取、写入、执行和全部权限的类,每个权限类都是布尔型和计算型的。您可以编写访问私有属性并使用$BIT设置和读取值的getter和setter方法。但是您的布尔逻辑将发生在返回值上,所以不是

代码语言:javascript
复制
Testperm( PermissionType.Read | PermissionType.Write ); 

你会这么做的

代码语言:javascript
复制
If (myPermissions.Read || myPermissions.Write)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12803836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档