Class | String::Mask |
In: |
lib/more/facets/string/mask.rb
|
Parent: | Object |
ESC | = | "\032" |
string | [R] |
# File lib/more/facets/string/mask.rb, line 30 def initialize(string, re=nil) @string = string.dup mask!(re) if re end
Mask AND. Only where they are then same filters through.
"abc..123" "ab..789." & "ab..789." | "abc..123" ---------- ---------- "ab......" "ab......"
# File lib/more/facets/string/mask.rb, line 132 def &(other) i = 0 o = '' while i < string.size if (c = string[i,1]) == other[i,1] o << c else o << ESC end i += 1 end self.class.new(o) end
Mask XAND. Where the characters are the same, the result is the same, where they differ the result reflects the later.
"abc..123" "ab..789." * "ab..789." | "abc..123" ---------- ---------- "ab..789." "abc..123"
# File lib/more/facets/string/mask.rb, line 110 def *(other) i = 0 o = '' while i < string.size if (c = string[i,1]) == other[i,1] o << c else o << other[i,1] end i += 1 end self.class.new(o) end
Mask ADD. As long as there is a value other then empty the character filters though. The last string takes precedence.
"abc..123" "ab..789." + "ab..789." + "abc..123" ---------- ---------- "abc.7893" "abc.7123"
# File lib/more/facets/string/mask.rb, line 84 def +(other) i = 0 o = '' while i < string.size if other[i,1] == ESC o << string[i,1] else o << other[i,1] end i += 1 end self.class.new(o) end
Mask subtraction. Where the characters are the same, the result is "empty", where they differ the result reflects the last string.
"abc..123" "ab..789." - "ab..789." - "abc..123" ---------- ---------- "....789." "..c..123"
# File lib/more/facets/string/mask.rb, line 61 def -(other) i = 0 o = '' while i < string.size if string[i,1] == other[i,1] o << ESC else o << other[i,1] end i += 1 end self.class.new(o) end
# File lib/more/facets/string/mask.rb, line 171 def ==(other) case other when String::Mask string == other.string else string == other.to_s end end
Mask XOR operation. Only where there is an empty slot will the value filter.
"abc..123" "ab..789." | "ab..789." | "abc..123" ---------- ---------- "..c.7..3" "..c.7..3"
# File lib/more/facets/string/mask.rb, line 154 def ^(other) i = 0 o = '' while i < string.size if string[i,1] == ESC o << other[i,1] elsif other[i,1] == ESC o << string[i,1] else o << ESC end i += 1 end self.class.new(o) end
# File lib/more/facets/string/mask.rb, line 48 def mask!(re) string.gsub!(re){ |s| ESC * s.size } end
Delegate any missing methods to underlying string.
# File lib/more/facets/string/mask.rb, line 209 def method_missing(s, *a, &b) begin str = string.send(s, *a, &b) rescue NoMethodError super(s, *a, &b) end end