Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
What is the difference between `static let` and `static member` in F#?
Taking the example from this Stackoverflow question:
type Vector2D(dx : float, dy : float) =
static let zero = Vector2D(0.0, 0.0)
static let onex = Vector2D(1.0, 0.0)
static let oney = Vector2D(0.0, 1.0)
/// Get the zero vector
static member Zero = zero
/// Get a constant vector along the X axis of length one
static member OneX = onex
/// Get a constant vector along the Y axis of length one
static member OneY = oney
1 answer
Paraphrasing the F# language guide's let
Bindings in Classes article:
A
let
binding in a class creates a private field or function; to expose data or functions publicly, declare a property or a member method.
An instance
let
binding is alet
binding that is not preceded by thestatic
keyword.Instance
let
bindings execute when objects are created.Static
let
bindings are part of the static initializer for the class.Static
let
bindings are guaranteed to execute before the type is first used.
If one tried to refactor the Vector2D
type by removing the static
keywords before zero
, onex
, and oney
private functions,
type Vector2D(dx : float, dy : float) =
let zero = Vector2D(0.0, 0.0)
let onex = Vector2D(1.0, 0.0)
let oney = Vector2D(0.0, 1.0)
/// Get the zero vector
static member Zero = zero
/// Get a constant vector along the X axis of length one
static member OneX = onex
/// Get a constant vector along the Y axis of length one
static member OneY = oney
then they would have received
error FS0039: The value or constructor 'zero' is not defined.
as zero
and co. are only guaranteed to evaluate when the class is instantiated.
0 comment threads