81 lines
1.5 KiB
Plaintext
81 lines
1.5 KiB
Plaintext
= Deimos
|
|
Jesse Brault <jesse@jessebrault.com>
|
|
0.1.0
|
|
:toc:
|
|
|
|
== Compile Error Explanations
|
|
|
|
=== Not more than one constructor
|
|
|
|
Classes may have up to only one constructor. The following does not compile:
|
|
|
|
[source]
|
|
----
|
|
class Foo
|
|
ctor(bar: Int) end
|
|
ctor(baz: String) end // Error
|
|
end
|
|
----
|
|
|
|
=== Field must be initialized
|
|
|
|
All class fields must be initialized in their declaration, or in the constructor. It
|
|
is an error to leave a field uninitialized.
|
|
|
|
[source]
|
|
----
|
|
class Foo
|
|
bar: Int // Error: no initializer
|
|
end
|
|
|
|
class Bar
|
|
baz: Int // Error: no initializer
|
|
|
|
ctor()
|
|
// some other stuff
|
|
end
|
|
end
|
|
----
|
|
|
|
=== Use of field before initialization
|
|
|
|
A field _without_ a declared initializer (i.e., one present at its declaration, not the constructor) may not be read in
|
|
the initializer of any other field or constructor variable, as the language does not guarantee a specific ordering of
|
|
field initialization and cannot statically analyze field/variable dependencies.
|
|
|
|
[source]
|
|
----
|
|
class Foo
|
|
bar: Int
|
|
baz = bar // Error
|
|
end
|
|
|
|
class Bar
|
|
foo: Int
|
|
baz = fnWithArg(foo) // Error
|
|
end
|
|
|
|
class Baz
|
|
foo: Int
|
|
qux: String
|
|
|
|
ctor(baz: String)
|
|
qux = foo + baz // Error: attempt to read uninitialized foo
|
|
end
|
|
end
|
|
----
|
|
|
|
The exception to this is reading the field inside another field's initializer *only* when that expression is itself a
|
|
closure.
|
|
|
|
[source]
|
|
----
|
|
class Foo
|
|
bar: Int
|
|
baz = { bar } // OK
|
|
|
|
ctor(bar: Int)
|
|
self.bar = bar
|
|
end
|
|
end
|
|
---- |