striuct 0.3.3 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +35 -34
- data/.travis.yml +6 -6
- data/Gemfile +12 -12
- data/History.rdoc +279 -273
- data/LICENSE +21 -21
- data/Manifest.txt +91 -90
- data/README.ja.old.rdoc +297 -297
- data/README.md +128 -128
- data/Rakefile +11 -11
- data/benchmark/basics.rb +56 -56
- data/example/README.rb +44 -44
- data/example/example.old.rdoc +187 -187
- data/example/example1.rb +233 -233
- data/example/example2.rb +22 -22
- data/example/see_trace.rb +32 -32
- data/lib/striuct/classmethods/README.md +5 -5
- data/lib/striuct/classmethods/adjustment.rb +32 -32
- data/lib/striuct/classmethods/constructor.rb +63 -63
- data/lib/striuct/classmethods/default.rb +27 -27
- data/lib/striuct/classmethods/enum.rb +48 -48
- data/lib/striuct/classmethods/inner.rb +91 -91
- data/lib/striuct/classmethods/length.rb +14 -14
- data/lib/striuct/classmethods/macro.rb +144 -144
- data/lib/striuct/classmethods/named.rb +113 -113
- data/lib/striuct/classmethods/object.rb +54 -54
- data/lib/striuct/classmethods/prevent_conflicts.rb +89 -89
- data/lib/striuct/classmethods/requiremnets.rb +11 -11
- data/lib/striuct/classmethods/to_struct.rb +23 -25
- data/lib/striuct/classmethods/validation.rb +55 -55
- data/lib/striuct/classmethods.rb +1 -1
- data/lib/striuct/instancemethods/README.md +5 -5
- data/lib/striuct/instancemethods/assign.rb +30 -30
- data/lib/striuct/instancemethods/cast.rb +34 -34
- data/lib/striuct/instancemethods/compare.rb +30 -30
- data/lib/striuct/instancemethods/default.rb +13 -13
- data/lib/striuct/instancemethods/delegate_class_methods.rb +28 -28
- data/lib/striuct/instancemethods/enum.rb +103 -103
- data/lib/striuct/instancemethods/hashy.rb +121 -121
- data/lib/striuct/instancemethods/inner.rb +60 -60
- data/lib/striuct/instancemethods/keyvalidatable.rb +14 -14
- data/lib/striuct/instancemethods/lock.rb +61 -61
- data/lib/striuct/instancemethods/object.rb +52 -52
- data/lib/striuct/instancemethods/requirements.rb +14 -14
- data/lib/striuct/instancemethods/safety.rb +11 -11
- data/lib/striuct/instancemethods/subscript.rb +55 -55
- data/lib/striuct/instancemethods/validation.rb +29 -25
- data/lib/striuct/instancemethods/values.rb +57 -57
- data/lib/striuct/instancemethods.rb +1 -1
- data/lib/striuct/requirements.rb +5 -5
- data/lib/striuct/singleton_class.rb +66 -66
- data/lib/striuct/specificcontainer.rb +19 -19
- data/lib/striuct/structs.rb +7 -7
- data/lib/striuct/version.rb +5 -5
- data/lib/striuct.rb +13 -13
- data/striuct.gemspec +24 -24
- data/test/helper.rb +5 -5
- data/test/test_striuct-singleton_class-define.rb +19 -19
- data/test/test_striuct-subclass-class-cloning.rb +20 -20
- data/test/test_striuct-subclass-class-close.rb +36 -36
- data/test/test_striuct-subclass-class-constructor.rb +82 -82
- data/test/test_striuct-subclass-class-freeze.rb +36 -36
- data/test/test_striuct-subclass-class-inheritable.rb +57 -57
- data/test/test_striuct-subclass-class-macro.rb +13 -13
- data/test/test_striuct-subclass-class-safety_naming.rb +72 -72
- data/test/test_striuct-subclass-class-validation.rb +26 -26
- data/test/test_striuct-subclass-feature-alias_member.rb +53 -53
- data/test/test_striuct-subclass-feature-to_struct.rb +61 -25
- data/test/test_striuct-subclass-feature-validation_util.rb +57 -0
- data/test/test_striuct-subclass-instance-accessor.rb +137 -137
- data/test/test_striuct-subclass-instance-adjuster.rb +94 -94
- data/test/test_striuct-subclass-instance-assign.rb +30 -30
- data/test/test_striuct-subclass-instance-basic.rb +32 -32
- data/test/test_striuct-subclass-instance-cloning.rb +22 -22
- data/test/test_striuct-subclass-instance-compare.rb +51 -51
- data/test/test_striuct-subclass-instance-default_value.rb +128 -128
- data/test/test_striuct-subclass-instance-enum.rb +92 -92
- data/test/test_striuct-subclass-instance-freeze.rb +19 -19
- data/test/test_striuct-subclass-instance-hashlike.rb +153 -153
- data/test/test_striuct-subclass-instance-keyvalidatable.rb +24 -24
- data/test/test_striuct-subclass-instance-lock.rb +39 -39
- data/test/test_striuct-subclass-instance-to_s_family.rb +25 -25
- data/test/test_striuct-subclass-instance-validation_functional_condition.rb +50 -50
- data/test/test_striuct-subclass-instance-validation_inference.rb +50 -50
- data/test/test_striuct-subclass-instance-validation_specific_conditions.rb +247 -247
- data/test/test_striuct-subclass-instance-validation_with_getter.rb +33 -33
- data/test/test_striuct-subclass-instance_names.rb +18 -18
- data/test/test_striuct-version.rb +10 -10
- metadata +4 -2
@@ -1,62 +1,62 @@
|
|
1
|
-
class Striuct; module InstanceMethods
|
2
|
-
|
3
|
-
# @group Lock
|
4
|
-
|
5
|
-
# @overload lock(key)
|
6
|
-
# lock a setter for key
|
7
|
-
# @param [Symbol, String, Fixnum] key
|
8
|
-
# @overload lock(true)
|
9
|
-
# lock setters for all members
|
10
|
-
# @param [true] true
|
11
|
-
# @return [self]
|
12
|
-
def lock(key=true)
|
13
|
-
raise "can't modify frozen #{self.class}" if frozen?
|
14
|
-
|
15
|
-
if key.equal? true
|
16
|
-
_autonyms.each do |autonym|
|
17
|
-
@locks[autonym] = true
|
18
|
-
end
|
19
|
-
else
|
20
|
-
__subscript__(key){|autonym|@locks[autonym] = true}
|
21
|
-
end
|
22
|
-
|
23
|
-
self
|
24
|
-
end
|
25
|
-
|
26
|
-
# @overload lock?(key)
|
27
|
-
# predicate locking a setter for key
|
28
|
-
# @param [Symbol, String, Fixnum] key
|
29
|
-
# @overload lock?(true)
|
30
|
-
# predicate locking for all members
|
31
|
-
# @param [true] true
|
32
|
-
def lock?(key=true)
|
33
|
-
if key.equal? true
|
34
|
-
_autonyms.all?{|autonym|@locks[autonym]}
|
35
|
-
else
|
36
|
-
__subscript__(key){|autonym|@locks[autonym]} || false
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
# @overload unlock(key)
|
43
|
-
# unlock a setter for key
|
44
|
-
# @param [Symbol, String, Fixnum] key
|
45
|
-
# @overload unlock(true)
|
46
|
-
# unlock setters for all members
|
47
|
-
# @param [true] true
|
48
|
-
def unlock(key=true)
|
49
|
-
raise "can't modify frozen #{self.class}" if frozen?
|
50
|
-
|
51
|
-
if key.equal? true
|
52
|
-
@locks.clear
|
53
|
-
else
|
54
|
-
__subscript__(key){|autonym|@locks.delete autonym}
|
55
|
-
end
|
56
|
-
|
57
|
-
self
|
58
|
-
end
|
59
|
-
|
60
|
-
# @endgroup
|
61
|
-
|
1
|
+
class Striuct; module InstanceMethods
|
2
|
+
|
3
|
+
# @group Lock
|
4
|
+
|
5
|
+
# @overload lock(key)
|
6
|
+
# lock a setter for key
|
7
|
+
# @param [Symbol, String, Fixnum] key
|
8
|
+
# @overload lock(true)
|
9
|
+
# lock setters for all members
|
10
|
+
# @param [true] true
|
11
|
+
# @return [self]
|
12
|
+
def lock(key=true)
|
13
|
+
raise "can't modify frozen #{self.class}" if frozen?
|
14
|
+
|
15
|
+
if key.equal? true
|
16
|
+
_autonyms.each do |autonym|
|
17
|
+
@locks[autonym] = true
|
18
|
+
end
|
19
|
+
else
|
20
|
+
__subscript__(key){|autonym|@locks[autonym] = true}
|
21
|
+
end
|
22
|
+
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
# @overload lock?(key)
|
27
|
+
# predicate locking a setter for key
|
28
|
+
# @param [Symbol, String, Fixnum] key
|
29
|
+
# @overload lock?(true)
|
30
|
+
# predicate locking for all members
|
31
|
+
# @param [true] true
|
32
|
+
def lock?(key=true)
|
33
|
+
if key.equal? true
|
34
|
+
_autonyms.all?{|autonym|@locks[autonym]}
|
35
|
+
else
|
36
|
+
__subscript__(key){|autonym|@locks[autonym]} || false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
# @overload unlock(key)
|
43
|
+
# unlock a setter for key
|
44
|
+
# @param [Symbol, String, Fixnum] key
|
45
|
+
# @overload unlock(true)
|
46
|
+
# unlock setters for all members
|
47
|
+
# @param [true] true
|
48
|
+
def unlock(key=true)
|
49
|
+
raise "can't modify frozen #{self.class}" if frozen?
|
50
|
+
|
51
|
+
if key.equal? true
|
52
|
+
@locks.clear
|
53
|
+
else
|
54
|
+
__subscript__(key){|autonym|@locks.delete autonym}
|
55
|
+
end
|
56
|
+
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
# @endgroup
|
61
|
+
|
62
62
|
end; end
|
@@ -1,52 +1,52 @@
|
|
1
|
-
class Striuct; module InstanceMethods
|
2
|
-
|
3
|
-
# @group Basic Methods for Ruby's Object
|
4
|
-
|
5
|
-
def initialize(*values)
|
6
|
-
@db, @locks = {}, {}
|
7
|
-
replace_values(*values)
|
8
|
-
end
|
9
|
-
|
10
|
-
# @return [String]
|
11
|
-
def inspect
|
12
|
-
"#<struct' #{self.class} strict?:#{strict?}".tap {|s|
|
13
|
-
each_pair do |autonym, value|
|
14
|
-
suffix = (has_default?(autonym) && default?(autonym)) ? '/default' : nil
|
15
|
-
s << " #{autonym}=#{value.inspect}#{suffix}("
|
16
|
-
s << "valid?:#{valid? autonym}, "
|
17
|
-
s << "lock?:#{lock? autonym}"
|
18
|
-
s << '),'
|
19
|
-
end
|
20
|
-
|
21
|
-
s.chop!
|
22
|
-
s << '>'
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
# @return [String]
|
27
|
-
def to_s
|
28
|
-
"#<struct' #{self.class}".tap {|s|
|
29
|
-
each_pair do |autonym, value|
|
30
|
-
s << " #{autonym}=#{value.inspect},"
|
31
|
-
end
|
32
|
-
|
33
|
-
s.chop!
|
34
|
-
s << '>'
|
35
|
-
}
|
36
|
-
end
|
37
|
-
|
38
|
-
# @return [self]
|
39
|
-
def freeze
|
40
|
-
[@db, @locks].each(&:freeze)
|
41
|
-
super
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def initialize_copy(original)
|
47
|
-
@db, @locks = @db.dup, {}
|
48
|
-
end
|
49
|
-
|
50
|
-
# @endgroup
|
51
|
-
|
52
|
-
end; end
|
1
|
+
class Striuct; module InstanceMethods
|
2
|
+
|
3
|
+
# @group Basic Methods for Ruby's Object
|
4
|
+
|
5
|
+
def initialize(*values)
|
6
|
+
@db, @locks = {}, {}
|
7
|
+
replace_values(*values)
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [String]
|
11
|
+
def inspect
|
12
|
+
"#<struct' #{self.class} strict?:#{strict?}".tap {|s|
|
13
|
+
each_pair do |autonym, value|
|
14
|
+
suffix = (has_default?(autonym) && default?(autonym)) ? '/default' : nil
|
15
|
+
s << " #{autonym}=#{value.inspect}#{suffix}("
|
16
|
+
s << "valid?:#{valid? autonym}, "
|
17
|
+
s << "lock?:#{lock? autonym}"
|
18
|
+
s << '),'
|
19
|
+
end
|
20
|
+
|
21
|
+
s.chop!
|
22
|
+
s << '>'
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [String]
|
27
|
+
def to_s
|
28
|
+
"#<struct' #{self.class}".tap {|s|
|
29
|
+
each_pair do |autonym, value|
|
30
|
+
s << " #{autonym}=#{value.inspect},"
|
31
|
+
end
|
32
|
+
|
33
|
+
s.chop!
|
34
|
+
s << '>'
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [self]
|
39
|
+
def freeze
|
40
|
+
[@db, @locks].each(&:freeze)
|
41
|
+
super
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def initialize_copy(original)
|
47
|
+
@db, @locks = @db.dup, {}
|
48
|
+
end
|
49
|
+
|
50
|
+
# @endgroup
|
51
|
+
|
52
|
+
end; end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
require_relative 'delegate_class_methods'
|
2
|
-
require_relative 'keyvalidatable'
|
3
|
-
require_relative 'inner'
|
4
|
-
require_relative 'object'
|
5
|
-
require_relative 'compare'
|
6
|
-
require_relative 'values'
|
7
|
-
require_relative 'cast'
|
8
|
-
require_relative 'default'
|
9
|
-
require_relative 'enum'
|
10
|
-
require_relative 'hashy'
|
11
|
-
require_relative 'subscript'
|
12
|
-
require_relative 'assign'
|
13
|
-
require_relative 'lock'
|
14
|
-
require_relative 'validation'
|
1
|
+
require_relative 'delegate_class_methods'
|
2
|
+
require_relative 'keyvalidatable'
|
3
|
+
require_relative 'inner'
|
4
|
+
require_relative 'object'
|
5
|
+
require_relative 'compare'
|
6
|
+
require_relative 'values'
|
7
|
+
require_relative 'cast'
|
8
|
+
require_relative 'default'
|
9
|
+
require_relative 'enum'
|
10
|
+
require_relative 'hashy'
|
11
|
+
require_relative 'subscript'
|
12
|
+
require_relative 'assign'
|
13
|
+
require_relative 'lock'
|
14
|
+
require_relative 'validation'
|
15
15
|
require_relative 'safety'
|
@@ -1,12 +1,12 @@
|
|
1
|
-
class Striuct; module InstanceMethods
|
2
|
-
|
3
|
-
# @group Safety
|
4
|
-
|
5
|
-
# freezed, fixed familar members, all members passed any condition
|
6
|
-
def secure?
|
7
|
-
(frozen? || lock?) && self.class.closed? && strict?
|
8
|
-
end
|
9
|
-
|
10
|
-
# @endgroup
|
11
|
-
|
1
|
+
class Striuct; module InstanceMethods
|
2
|
+
|
3
|
+
# @group Safety
|
4
|
+
|
5
|
+
# freezed, fixed familar members, all members passed any condition
|
6
|
+
def secure?
|
7
|
+
(frozen? || lock?) && self.class.closed? && strict?
|
8
|
+
end
|
9
|
+
|
10
|
+
# @endgroup
|
11
|
+
|
12
12
|
end; end
|
@@ -1,55 +1,55 @@
|
|
1
|
-
class Striuct; module InstanceMethods
|
2
|
-
|
3
|
-
# @group Subscript
|
4
|
-
|
5
|
-
# @param [Symbol, String, Fixnum] key
|
6
|
-
def [](key)
|
7
|
-
__subscript__(key){|autonym|__get__ autonym}
|
8
|
-
end
|
9
|
-
|
10
|
-
# @param [Symbol, String, Fixnum] key
|
11
|
-
# @param [Object] value
|
12
|
-
# @return [value]
|
13
|
-
def []=(key, value)
|
14
|
-
true_name = nil
|
15
|
-
__subscript__(key){|autonym|
|
16
|
-
true_name = autonym
|
17
|
-
__set__ autonym, value
|
18
|
-
}
|
19
|
-
rescue Validation::InvalidWritingError
|
20
|
-
$!.set_backtrace([
|
21
|
-
"#{$!.backtrace[-1].sub(/[^:]+\z/){''}}in `[#{key.inspect}(#{true_name})]=': #{$!.message}",
|
22
|
-
$!.backtrace[-1]
|
23
|
-
])
|
24
|
-
|
25
|
-
raise
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
# @param [Symbol, String, Fixnum] key
|
31
|
-
# @yield [autonym]
|
32
|
-
# @yieldparam [Symbol] autonym
|
33
|
-
def __subscript__(key)
|
34
|
-
case key
|
35
|
-
when Symbol, String
|
36
|
-
name = keyable_for key
|
37
|
-
if member? name
|
38
|
-
yield autonym_for(name)
|
39
|
-
else
|
40
|
-
raise NameError
|
41
|
-
end
|
42
|
-
when Fixnum
|
43
|
-
if autonym = _autonyms[key]
|
44
|
-
yield autonym
|
45
|
-
else
|
46
|
-
raise IndexError
|
47
|
-
end
|
48
|
-
else
|
49
|
-
raise ArgumentError
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# @endgroup
|
54
|
-
|
55
|
-
end; end
|
1
|
+
class Striuct; module InstanceMethods
|
2
|
+
|
3
|
+
# @group Subscript
|
4
|
+
|
5
|
+
# @param [Symbol, String, Fixnum] key
|
6
|
+
def [](key)
|
7
|
+
__subscript__(key){|autonym|__get__ autonym}
|
8
|
+
end
|
9
|
+
|
10
|
+
# @param [Symbol, String, Fixnum] key
|
11
|
+
# @param [Object] value
|
12
|
+
# @return [value]
|
13
|
+
def []=(key, value)
|
14
|
+
true_name = nil
|
15
|
+
__subscript__(key){|autonym|
|
16
|
+
true_name = autonym
|
17
|
+
__set__ autonym, value
|
18
|
+
}
|
19
|
+
rescue Validation::InvalidWritingError
|
20
|
+
$!.set_backtrace([
|
21
|
+
"#{$!.backtrace[-1].sub(/[^:]+\z/){''}}in `[#{key.inspect}(#{true_name})]=': #{$!.message}",
|
22
|
+
$!.backtrace[-1]
|
23
|
+
])
|
24
|
+
|
25
|
+
raise
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# @param [Symbol, String, Fixnum] key
|
31
|
+
# @yield [autonym]
|
32
|
+
# @yieldparam [Symbol] autonym
|
33
|
+
def __subscript__(key)
|
34
|
+
case key
|
35
|
+
when Symbol, String
|
36
|
+
name = keyable_for key
|
37
|
+
if member? name
|
38
|
+
yield autonym_for(name)
|
39
|
+
else
|
40
|
+
raise NameError
|
41
|
+
end
|
42
|
+
when Fixnum
|
43
|
+
if autonym = _autonyms[key]
|
44
|
+
yield autonym
|
45
|
+
else
|
46
|
+
raise IndexError
|
47
|
+
end
|
48
|
+
else
|
49
|
+
raise ArgumentError
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# @endgroup
|
54
|
+
|
55
|
+
end; end
|
@@ -1,25 +1,29 @@
|
|
1
|
-
class Striuct; module InstanceMethods
|
2
|
-
|
3
|
-
# @group Validation
|
4
|
-
|
5
|
-
# @param [Symbol, String] name
|
6
|
-
# @param [Object] value - no argument and use own
|
7
|
-
# passed under any condition
|
8
|
-
def sufficient?(name, value=self[name])
|
9
|
-
autonym = autonym_for name
|
10
|
-
return true unless restrict? autonym
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
1
|
+
class Striuct; module InstanceMethods
|
2
|
+
|
3
|
+
# @group Validation
|
4
|
+
|
5
|
+
# @param [Symbol, String] name
|
6
|
+
# @param [Object] value - no argument and use own
|
7
|
+
# passed under any condition
|
8
|
+
def sufficient?(name, value=self[name])
|
9
|
+
autonym = autonym_for name
|
10
|
+
return true unless restrict? autonym
|
11
|
+
|
12
|
+
begin
|
13
|
+
_valid? condition_for(autonym), value
|
14
|
+
rescue Exception
|
15
|
+
false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method :accept?, :sufficient?
|
20
|
+
alias_method :valid?, :sufficient?
|
21
|
+
|
22
|
+
# all members passed under any condition
|
23
|
+
def strict?
|
24
|
+
each_pair.all?{|autonym, value|sufficient? autonym, value}
|
25
|
+
end
|
26
|
+
|
27
|
+
# @endgroup
|
28
|
+
|
29
|
+
end; end
|
@@ -1,57 +1,57 @@
|
|
1
|
-
class Striuct; module InstanceMethods
|
2
|
-
|
3
|
-
# @group Behavior under Values
|
4
|
-
|
5
|
-
# @param [Fixnum, Range] _keys
|
6
|
-
# @return [Array]
|
7
|
-
def values_at(*_keys)
|
8
|
-
[].tap {|r|
|
9
|
-
_keys.each do |key|
|
10
|
-
case key
|
11
|
-
when Fixnum
|
12
|
-
r << self[key]
|
13
|
-
when Range
|
14
|
-
key.each do |n|
|
15
|
-
raise TypeError unless n.instance_of? Fixnum
|
16
|
-
r << self[n]
|
17
|
-
end
|
18
|
-
else
|
19
|
-
raise TypeError
|
20
|
-
end
|
21
|
-
end
|
22
|
-
}
|
23
|
-
end
|
24
|
-
|
25
|
-
# @return [self]
|
26
|
-
def replace_values(*values)
|
27
|
-
unless values.size <= size
|
28
|
-
raise ArgumentError, "struct size differs (max: #{size})"
|
29
|
-
end
|
30
|
-
|
31
|
-
values.each_with_index do |value, index|
|
32
|
-
self[index] = value
|
33
|
-
end
|
34
|
-
|
35
|
-
excess = _autonyms.last(size - values.size)
|
36
|
-
|
37
|
-
excess.each do |autonym|
|
38
|
-
if has_default? autonym
|
39
|
-
self[autonym] = (
|
40
|
-
value = default_for autonym
|
41
|
-
if value.kind_of? DefaultProcHolder
|
42
|
-
block = value.value
|
43
|
-
args = [self, autonym][0, block.arity]
|
44
|
-
block.call(*args)
|
45
|
-
else
|
46
|
-
value
|
47
|
-
end
|
48
|
-
)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
self
|
53
|
-
end
|
54
|
-
|
55
|
-
# @endgroup
|
56
|
-
|
57
|
-
end; end
|
1
|
+
class Striuct; module InstanceMethods
|
2
|
+
|
3
|
+
# @group Behavior under Values
|
4
|
+
|
5
|
+
# @param [Fixnum, Range] _keys
|
6
|
+
# @return [Array]
|
7
|
+
def values_at(*_keys)
|
8
|
+
[].tap {|r|
|
9
|
+
_keys.each do |key|
|
10
|
+
case key
|
11
|
+
when Fixnum
|
12
|
+
r << self[key]
|
13
|
+
when Range
|
14
|
+
key.each do |n|
|
15
|
+
raise TypeError unless n.instance_of? Fixnum
|
16
|
+
r << self[n]
|
17
|
+
end
|
18
|
+
else
|
19
|
+
raise TypeError
|
20
|
+
end
|
21
|
+
end
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [self]
|
26
|
+
def replace_values(*values)
|
27
|
+
unless values.size <= size
|
28
|
+
raise ArgumentError, "struct size differs (max: #{size})"
|
29
|
+
end
|
30
|
+
|
31
|
+
values.each_with_index do |value, index|
|
32
|
+
self[index] = value
|
33
|
+
end
|
34
|
+
|
35
|
+
excess = _autonyms.last(size - values.size)
|
36
|
+
|
37
|
+
excess.each do |autonym|
|
38
|
+
if has_default? autonym
|
39
|
+
self[autonym] = (
|
40
|
+
value = default_for autonym
|
41
|
+
if value.kind_of? DefaultProcHolder
|
42
|
+
block = value.value
|
43
|
+
args = [self, autonym][0, block.arity]
|
44
|
+
block.call(*args)
|
45
|
+
else
|
46
|
+
value
|
47
|
+
end
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
# @endgroup
|
56
|
+
|
57
|
+
end; end
|
@@ -1 +1 @@
|
|
1
|
-
require_relative 'instancemethods/requirements'
|
1
|
+
require_relative 'instancemethods/requirements'
|
data/lib/striuct/requirements.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require_relative 'version'
|
2
|
-
require_relative 'structs'
|
3
|
-
require_relative 'specificcontainer'
|
4
|
-
require_relative 'classmethods'
|
5
|
-
require_relative 'instancemethods'
|
1
|
+
require_relative 'version'
|
2
|
+
require_relative 'structs'
|
3
|
+
require_relative 'specificcontainer'
|
4
|
+
require_relative 'classmethods'
|
5
|
+
require_relative 'instancemethods'
|
6
6
|
require_relative 'singleton_class'
|