Top Level Namespace
Defined Under Namespace
Modules: DefEnumHelper
Classes: EnumHelperStruct
Constant Summary
collapse
- DEFAULT_ENUM_BASE_INDEX =
puts YinYang::YANG #1 puts YinYang::YIN #2 y = YinYang puts y.index #1 puts y.display #阳puts YinYang #same as YinYang puts YinYang #same as YinYang YinYang.all #所有枚举的struct array [#<struct index=1, display=“阳”>, #<struct index=2, display=“阴”>] puts YinYang.count #2 YinYang.each{|x| puts x} #<struct index=1, display=“阳”> #<struct index=2, display=“阴”> puts YingYang.to_json_array #[“index”:1,“display”:“阳”,“index”:2,“display”:“阴”]
1
Instance Method Summary
collapse
-
#def_enum(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, index_name: :index, display_name: :display) ⇒ Object
-
#def_enum_struct(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, index_name: :index, display_name: :display) ⇒ Object
-
#def_enum_struct_with_index(module_name, enum_hash, index_name: :index, display_name: :display) ⇒ Object
-
#def_enum_with_index(module_name, *value_array) ⇒ Object
-
#define_convert_methods(m, enum_index_hash) ⇒ Object
-
#define_enum_methods(m, enum_index_hash, enum_display_hash) ⇒ Object
-
#define_iterator_methods(m, enum_index_hash) ⇒ Object
-
#define_subscript_method(m, enum_index_hash, enum_display_hash) ⇒ Object
Instance Method Details
#def_enum(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, index_name: :index, display_name: :display) ⇒ Object
21
22
23
24
25
26
27
28
|
# File 'lib/def_enum_helper.rb', line 21
def def_enum(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, index_name: :index, display_name: :display)
temp_struct = Struct.new(index_name, display_name)
new_enum_hash = {}
enum_hash.each do |k, v|
new_enum_hash[k] = temp_struct.new(0, v)
end
def_enum_struct(module_name, new_enum_hash, enum_base: enum_base)
end
|
#def_enum_struct(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, index_name: :index, display_name: :display) ⇒ Object
30
31
32
33
34
35
36
37
38
39
40
|
# File 'lib/def_enum_helper.rb', line 30
def def_enum_struct(module_name, enum_hash, enum_base: DEFAULT_ENUM_BASE_INDEX, index_name: :index, display_name: :display)
i = 0
set_index = (index_name.to_s + '=').to_sym
enum_hash.each do |_k, v|
enum_value = enum_base + i
v.public_send(set_index, enum_value)
i += 1
end
def_enum_struct_with_index(module_name, enum_hash, index_name: index_name, display_name: display_name)
end
|
#def_enum_struct_with_index(module_name, enum_hash, index_name: :index, display_name: :display) ⇒ Object
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# File 'lib/def_enum_helper.rb', line 95
def def_enum_struct_with_index(module_name, enum_hash, index_name: :index, display_name: :display)
m = Module.new
enum_index_hash = {}
enum_display_hash = {}
i = 0
enum_hash.each do |k, v|
enum_value = v.public_send(index_name)
m.const_set(k, enum_value)
enum_index_hash[enum_value] = v
enum_display_hash[v.public_send(display_name)] = v
i += 1
end
define_enum_methods(m, enum_index_hash, enum_display_hash)
Kernel.const_set(module_name, m)
end
|
#def_enum_with_index(module_name, *value_array) ⇒ Object
44
45
46
47
48
49
50
51
|
# File 'lib/def_enum_helper.rb', line 44
def def_enum_with_index(module_name, *value_array)
h = {}
value_array.each do |variable|
h[variable[0]] = EnumHelperStruct.new(variable[1], variable[2])
end
def_enum_struct_with_index module_name, h
end
|
#define_convert_methods(m, enum_index_hash) ⇒ Object
75
76
77
78
79
|
# File 'lib/def_enum_helper.rb', line 75
def define_convert_methods(m, enum_index_hash)
m.define_singleton_method(:to_hash_array) { enum_index_hash.each_value.map(&:to_h) }
m.define_singleton_method(:to_json_array) { to_hash_array.to_json }
end
|
#define_enum_methods(m, enum_index_hash, enum_display_hash) ⇒ Object
81
82
83
84
85
86
87
88
89
90
91
92
93
|
# File 'lib/def_enum_helper.rb', line 81
def define_enum_methods(m, enum_index_hash, enum_display_hash)
define_iterator_methods(m, enum_index_hash)
m.define_singleton_method(:include?) { |n| n.is_a?(Symbol) ? constants.include?(n) : enum_index_hash.key?(n) }
m.define_singleton_method(:member?) { |n| include?(n) }
m.define_singleton_method(:count) { enum_index_hash.count }
define_convert_methods(m, enum_index_hash)
define_subscript_method(m, enum_index_hash, enum_display_hash)
end
|
#define_iterator_methods(m, enum_index_hash) ⇒ Object
53
54
55
56
57
|
# File 'lib/def_enum_helper.rb', line 53
def define_iterator_methods(m, enum_index_hash)
m.define_singleton_method(:each) { |&blk| enum_index_hash.each_value { |v| blk.call(v) } }
m.define_singleton_method(:all) { enum_index_hash.values }
end
|
#define_subscript_method(m, enum_index_hash, enum_display_hash) ⇒ Object
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/def_enum_helper.rb', line 59
def define_subscript_method(m, enum_index_hash, enum_display_hash)
divisor = enum_index_hash.count
m.define_singleton_method(:from_number) { |n| (n - DEFAULT_ENUM_BASE_INDEX) % divisor + DEFAULT_ENUM_BASE_INDEX }
m.define_singleton_method(:[]) do |k|
case k
when String
enum_display_hash[k]
when Symbol
enum_index_hash[const_get(k)]
else
enum_index_hash[from_number(k)]
end
end
end
|