class LtdTemplate::Code::Subscript
Public Class Methods
new(template, base, subscripts)
click to toggle source
Calls superclass method
LtdTemplate::Code::new
# File lib/ltdtemplate/code/subscript.rb, line 13 def initialize (template, base, subscripts) super template @base, @subscripts = base, subscripts end
Public Instance Methods
do_set(opts)
click to toggle source
Implement = and ?=
# 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 = {})
click to toggle source
Evaluate the target's value.
# 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)
click to toggle source
Return subscripts calculated from the supplied code blocks.
# 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)
click to toggle source
Return the target value, variable[sub1, …, subN]
# 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