You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
require_relative "error"
|
|
|
|
|
|
|
|
module Lox
|
|
|
|
class Instance
|
|
|
|
|
|
|
|
def initialize(klass)
|
|
|
|
@klass = klass
|
|
|
|
|
|
|
|
@fields = {}
|
|
|
|
end
|
|
|
|
|
|
|
|
def get(name)
|
|
|
|
return @fields.fetch(name.lexeme) if @fields.has_key?(name.lexeme)
|
|
|
|
|
|
|
|
method = @klass.find_method(name.lexeme)
|
|
|
|
return method.bind(self) unless method.nil?
|
|
|
|
|
|
|
|
raise RuntimeError.new(name, "Undefined property '#{name.lexeme}'.")
|
|
|
|
end
|
|
|
|
|
|
|
|
def set(name, value)
|
|
|
|
@fields[name.lexeme] = value
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_s = "#{@klass.name} instance"
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|