前言:
https://www.cnblogs.com/LoveBB/p/17277662.html
枚:量词。一般用于较小的片状物,相当于“个”。
举:提出:列举。举一反三。举个例子。
所以,枚举就是一个个列举出来
魔功的作用,就不过多描述了,主打的就是一个优雅。
在学习枚举之前,我们很有必要了解他的几个比较重要的成员方法。我们先定义一个枚举如下:
public enum TestEnum {
}

| 方法名称 | 具体含义 | 使用方法 |
|---|---|---|
| values() | 该方法可以将枚举类型成员以数组的形式返回 | 枚举类型名称.values() |
| valueOf() | 该方法可以实现将普通字符串转换为枚举实例 | 枚举类型名称.valueOf("ABC") |
// 规范写法
public enum TestEnum {
BOY,GIRL
}
// 属性大写只是一种规范,小写也是可以的
public enum TestEnum {
Boy,Girl
}
// 既然小写可以,那么乱写也是没有问题的
public enum TestEnum {
BoY,giRL
}


从上面可以看到,这三者的返回值是一样的,类型都是 TestEnum。那这个方法就没啥好看的了,就是拿到 TestEnum 中的单个属性。
枚举类
public enum TestEnum {
BOY,GIRL
}
常量类
public class TestConstant {
private static Integer BOY;
private static Integer GIRL;
}
public class TestConstant {
// 男
private static final Integer BOY = 0;
// 女
private static Integer GIRL = 1;
}
@Getter
public enum TestEnum {
BOY(0),GIRL(1);
private Integer code;
TestEnum(Integer code){
this.code = code;
}
}
public static void main(String[] args) {
// 使用常量类
Integer boy = TestConstant.BOY;
Integer girl = TestConstant.GIRL;
// 使用枚举
Integer enumBoy = TestEnum.BOY.getCode();
Integer girlCode = TestEnum.GIRL.getCode();
}
@Data
public class People {
private String gender;
}
People people = new People();
// int 转为 String
Integer boy = TestConstant.BOY;
if (boy == 0) {
people.setGender("男");
}
Integer girl = TestConstant.GIRL;
if (girl == 1) {
people.setGender("女");
}
People people = new People();
// 使用枚举
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {
people.setGender("男");
}
Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {
people.setGender("女");
}
毫无违和感,那还要枚举干啥勒。别着急,下面就介绍枚举的另一种用法 :
@Getter
public enum TestEnum {
BOY(0,"男"),GIRL(1,"女");
private Integer code;
private String name;
TestEnum(Integer code,String name){
this.code = code;
}
}
People people = new People();
// 使用枚举
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {
String name = TestEnum.BOY.getName();
people.setGender(name);
}
Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {
String name = TestEnum.GIRL.getName();
people.setGender(name);
}
真好,如果工资是按代码行数发的,那你就能多拿两打工资了
上面 2 的写法,基本上都是固定了,不符合面向对象的写法,我们应该抽象出来这一个方法,方法的入参是 int 类型,返回值是 String 类型。比如传入一个 0,返回一个男,传入一个 1,返回一个女。这个时候前面的这个 values() 方法就派上用场了
@Getter
public enum TestEnum {
BOY(0,"男"),GIRL(1,"女");
private Integer code;
private String name;
TestEnum(Integer code,String name){
this.code = code;
}
// 这个是抽象的方法,放在枚举里面
public static String getName(int code) {
// 遍历 TestEnum.values()
for (TestEnum testEnum : TestEnum.values()) {
// 如果枚举 code 和传入的 code相同,返回对应的文字
if (testEnum.getCode() == code) {
return testEnum.name;
}
}
// 不匹配,返回默认值
return null;
}
}
People people = new People();
// 使用枚举
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {
people.setGender(TestEnum.getName(0));
}
Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {
people.setGender(TestEnum.getName(1));
}
是不是有高手那味了,这就是魔功枚举的强大之处,随随便便一个常量,就硬生生给你整成高手范。
要获取每个网站的地址,要把每个网站的地址存储起来,网站地址都是已知的。并且不做维护。

@Getter
public enum InternetEnum {
BAIDU(1,"百度","www.baidu.com"),
HUOHU(2,"火狐","www.huohu.com"),
GUGLE(3,"谷歌","www.guge.com"),
SLO(4,"360","www.360.com"),
QQ(5,"qq","www.qq.com");
private Integer code;
private String name;
private String address;
private InternetEnum(int code,String name,String address) {
this.code = code;
this.name = name;
this.address = address;
}
private String getName(int code){
for (InternetEnum internetEnum : InternetEnum.values()) {
if (internetEnum.getCode()==code){
return internetEnum.getName();
}
}
return null;
}
private String getAddress(int code){
for (InternetEnum internetEnum : InternetEnum.values()) {
if (internetEnum.getCode()==code){
return internetEnum.getAddress();
}
}
return null;
}
}
这里只是举个例子,前提是这些属性不经常变的,如果是经常变的,还是得考虑使用数据表。至于哪些是不变的,如果你维护过别人的代码,就一定能见过很多这样的东西,这时候大胆使用枚举改掉他。


假设我有一个可枚举对象enum,现在我想获取第三个项目。我知道一种通用方法是转换成数组,然后使用索引访问,如:enum.to_a[2]但这种方式会创建一个临时数组,效率可能很低。现在我使用:enum.each_with_index{|v,i|breakvifi==2}但这非常丑陋和多余。执行此操作最有效的方法是什么? 最佳答案 你可以使用take剥离前三个元素,然后剥离last从take给你的数组中获取第三个元素:third=enum.take(3).last如果您根本不想生成任何数组,那么也许:#Ifenumisn'tanEnum
以下是我认为的一些下拉列表:'form-control')%>和'form-control')%>这是我的application_helper.rbdefget_advance_bookingret=[{:require_booking=>'No'},{:require_booking=>'Yes'}]enddefget_instant_bookingret=[{:instant_booking=>'No'},{:instant_booking=>'Yes'}]end但现在的问题是,在我的模型product.rb中,我无法设置具有相同名称的枚举:classProduct我收到的错误是您
我正在使用Enumerizegemhttps://github.com/brainspec/enumerize/它允许我以简单的形式使用漂亮的选择。并且此选择中的所有选项均已翻译。en:enumerize:user:sex:male:'Man'female:'Woman'所以,在我的表单中,我选择了变体“男人”和“女人”。当我用“男人”值保存记录时,我得到了“男性”值的性别属性。现在我想在显示页面上将该值显示为“Man”,但是=@user.sex输出为'male'而不是'Man' 最佳答案 我可能会使用.text方法(您可以通过使用
给定这个类:classUser我想创建一个如下所示的fixture:testuser1:id:1username:sampermission::permission_staff我尝试了多种语法变体,但没有找到有效的方法。结果user.permission为nil或0。我知道enum是最近添加的。这可以做到吗? 最佳答案 根据enumdocs你可以像这样通过类引用可枚举的:User.permissions[:permission_staff]工厂只是ruby代码——所以他们应该能够以相同的方式访问值testuser1:id:1us
我有以下数组:arr=[1,3,2,5,2,4,2,2,4,4,2,2,4,2,1,5]我想要一个包含前三个奇数元素的数组。我知道我可以做到:arr.select(&:odd?).take(3)但我想避免遍历整个数组,而是在找到第三个匹配项后返回。我想出了以下解决方案,我相信它可以满足我的要求:my_arr.each_with_object([])do|el,memo|memo但是有没有更简单/惯用的方法来做到这一点? 最佳答案 使用lazyenumerator与Enumerable#lazy:arr.lazy.select(&:o
我有一个表,'jobs'和一个枚举字段'status'。status具有以下枚举集:enumstatus:[:draft,:active,:archived]使用ransack,我如何过滤表,比如说,所有事件记录? 最佳答案 你可以像这样在模型中声明自己的掠夺者:ransacker:status,formatter:proc{|v|statuses[v]}do|parent|parent.table[:status]end然后您可以使用默认的搜索语法_eq来检查相等性,如下所示:Model.ransack(status_eq:'ac
ruby中有没有一个很好的方法来删除可枚举列表中的重复项(即拒绝等) 最佳答案 对于数组你可以使用uniq()方法a=["a","a","b","b","c"]a.uniq#=>["a","b","c"]所以如果你只是(1..10).to_a.uniq或%w{antbatcatant}.to_a.uniq因为无论如何,几乎所有您实现的方法都将作为Array类返回。 关于Ruby删除可枚举列表中的重复项,我们在StackOverflow上找到一个类似的问题: h
我想从不同线程调用一个公共(public)枚举器。当我执行以下操作时,enum=(0..1000).to_enumt1=Thread.newdopenum.nextsleep(1)endt2=Thread.newdopenum.nextsleep(1)endt1.joint2.join它引发了一个错误:Fibercalledacrossthreads.当enum在从t1调用一次后从t2调用时。为什么Ruby设计为不允许跨线程调用枚举器(或纤程),以及是否有其他方法可以提供类似的功能?我猜测枚举器/纤程上的操作的原子性在这里是相关的,但我不完全确定。如果这是问题所在,那么在使用时独占锁定
我要遍历一棵树。当我遍历它时,我保留了一堆枚举器,其中每个枚举器都用于枚举树的子级。我希望能够复制这个枚举器堆栈并将其交给另一个对象,以便它可以从堆栈状态指示的位置开始遍历树。当我尝试调用Enumerator上的#dup时,出现错误。是否可以复制枚举器?如果没有,我怎么能完成同样的事情?(我考虑过将一堆整数作为索引,但担心效率。这里有一些代码来展示我所看到的...一旦第一个枚举器启动,您就无法复制它。这就是我的情况。a=[1,2,3].each=>#a.next=>1b=a.dupTypeError:can'tcopyexecutioncontextfrom(irb):3:in`ini
例如:a=[1,2,3,4,5]a.delete_if{|x|x>3}相当于:a=[1,2,3,4,5]a.delete_if.each.each.each.each{|x|x>3}我知道a.delete_if返回一个枚举器。但是当eachblock返回true时,它如何知道应该删除对象呢?如何手动(和在Ruby中)实现delete_if? 最佳答案 可以看看Rubinius源码:enumerablemodule这里是一个拒绝方法的例子:defrejectreturnto_enum(:reject)unlessblock_giv