def parse_literal(string_boundary_charset = LINE_END)
spacing_without_comment
value = if skip(/\[/)
scan_json(true)
elsif skip(/\{/)
scan_json(false)
else
scan_string(string_boundary_charset)
end
value
end
ここで [ と { を予約語にしてしまっているが、config_param でブロック評価するときに :hash または :array 型だったら、JSON.parse するようにすれば、予約語から外せるのでは?
proxy.params.each_pair do |name, defval|
varname = name.to_sym
block, opts = defval
if conf.has_key?(name.to_s) || opts[:alias] && conf.has_key?(opts[:alias].to_s)
val = if conf.has_key?(name.to_s)
conf[name.to_s]
else
conf[opts[:alias].to_s]
end
section_params[varname] = self.instance_exec(val, opts, name, &block)
end
config_param のブロック評価は、Engine#configure から Plugin の configure の呼び出しがされて、super を辿ってこの辺に来る。
Configurable.register_type(:array, Proc.new { |val, opts|
param = val.is_a?(String) ? JSON.load(val) : val
if param.class != Array
raise ConfigError, "array required but got #{val.inspect}"
end
param
})
JSON.load がすでに書いてあった。
では、予約語はずせるのでは?と思ったが、
def scan_json(is_array)
....
if char == "\n"
buffer << line_buffer + "\n"
line_buffer = ""
next
end
改行を扱いたいがために、予約語になっているのであった。うーむ。