Scala相当于旗帜
Scala中没有等效的标志吗?
就像是 : val flags = Something | SomeOtherThing 我想我可以为每个旗帜组做一个班级并且有一堆布尔但是语法糖怎么样? 解决方法
这在很大程度上取决于你想要完成的事情.
如果您正在使用遗留代码(尤其是无法修改的代码)和/或需要超高效率(you usually don’t),a canonical way将为Int创建类型别名.即,如链接库示例中所示: type MyFlags = Int ... val theseFlags: MyFlags 仅使用Int的优点是,您可以使用类型别名“标记”这些标志的任何用法 – 这可以极大地提高代码可读性并帮助避免由于“混合”标志而导致的错误. 对于这种方法,在Scala特定的代码中,您可以通过(ab)使用BitSet(更多信息here)来帮助自己. 如果你想创建一个更“对象友好”的实现,解决方案类似于Java的enum / EnumSet组合 – 即使用带有ValueSet的 scala> object WeekDay extends Enumeration { | type WeekDay = Value | val Mon,Tue,Wed,Thu,Fri,Sat,Sun = WeekDay | } defined module WeekDay scala> import WeekDay._ import WeekDay._ scala> var newSet = ValueSet.empty newSet: WeekDay.ValueSet = WeekDay.ValueSet() scala> newSet += Mon scala> newSet res1: WeekDay.ValueSet = WeekDay.ValueSet(Mon) scala> newSet & WeekDay.values res2: WeekDay.ValueSet = WeekDay.ValueSet(Mon) ValueSet和Value出现问题 – 缺少类型参数化允许混合两种不同类型的标志.当然,与Java的EnumSet相比,这只是一个缺陷.在Scala的上下文中,解决方法与Int示例完全相同 – 使用类型别名,这次是Value(如上所示). 作为额外的奖励,你所有的旗帜都有独特的名字. 作为一个形式,我还应该提到Value Classes.与类型别名一起,它们允许您在标志中添加自定义运算符,同时保持Ints的效率. 但是,对于大多数使用场景来说,这可能是一种过度杀伤 – 通常最好使用第二种基于枚举的方法.对于大多数情况,它应该足够有效,特别是自 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |