Class: LtdTemplate::Code::Subscript
- Inherits:
-
LtdTemplate::Code
- Object
- LtdTemplate::Code
- LtdTemplate::Code::Subscript
- Defined in:
- lib/ltdtemplate/code/subscript.rb
Instance Method Summary collapse
-
#do_set(opts) ⇒ Object
Implement = and ?=.
-
#evaluate(opts = {}) ⇒ Object
Evaluate the target’s value.
-
#evaluate_subscripts(meter = false) ⇒ Object
Return subscripts calculated from the supplied code blocks.
-
#initialize(template, base, subscripts) ⇒ Subscript
constructor
A new instance of Subscript.
-
#target(meter = false) ⇒ Object
Return the target value, variable[sub1, …, subN].
Methods inherited from LtdTemplate::Code
Constructor Details
#initialize(template, base, subscripts) ⇒ Subscript
Returns a new instance of Subscript.
13 14 15 16 |
# File 'lib/ltdtemplate/code/subscript.rb', line 13 def initialize (template, base, subscripts) super template @base, @subscripts = base, subscripts end |
Instance Method Details
#do_set(opts) ⇒ Object
Implement = and ?=
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/ltdtemplate/code/subscript.rb', line 69 def do_set (opts) subscripts = evaluate_subscripts true if subscripts.empty? # Treat expression[] as expression rubyversed(@base).evaluate opts elsif opts[:method] != '?=' || rubyversed(@base).evaluate.in_rubyverse(@template)[*subscripts, {}].nil? # Assign if unconditional or unset params = opts[:parameters] params = params[0] if params.is_a? LtdTemplate::Univalue rubyversed(@base).evaluate.in_rubyverse(@template)[*subscripts, {}] = params end nil end |
#evaluate(opts = {}) ⇒ Object
Evaluate the target’s value.
21 22 23 24 25 26 |
# File 'lib/ltdtemplate/code/subscript.rb', line 21 def evaluate (opts = {}) case opts[:method] when '=', '?=' then do_set opts # Support array assignment else rubyversed(target(true)).evaluate opts end end |
#evaluate_subscripts(meter = false) ⇒ Object
Return subscripts calculated from the supplied code blocks.
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/ltdtemplate/code/subscript.rb', line 31 def evaluate_subscripts (meter = false) subscripts = [] @subscripts.each do |code| subscript = rubyversed(code).evaluate case subscript when LtdTemplate::Value::Array_Splat if meter && (size = subscript.positional.size) > 1 # RESOURCE subscripts: Total number of subscripts # RESOURCE subscript_depth: Deepest subscript depth @template.use :subscripts, size - 1 @template.using :subscript_depth, size end subscripts.concat subscript.positional when Numeric, String then subscripts << subscript end end if meter @template.use :subscripts, @subscripts.size @template.using :subscript_depth, subscripts.size end subscripts end |
#target(meter = false) ⇒ Object
Return the target value, variable[sub1, …, subN]
59 60 61 62 63 64 |
# File 'lib/ltdtemplate/code/subscript.rb', line 59 def target (meter = false) subscripts = evaluate_subscripts meter if subscripts.empty? then rubyversed(@base).evaluate else rubyversed(@base).evaluate.in_rubyverse(@template)[*subscripts, {}] end end |