I had a university criminal law lecturer, way back in the day, who had an expression called ‘self-organising stupid’. Self-organising stupid is why otherwise sane people suddenly start doing crazy things, until the crazy becomes so prevalent that everybody will do crazy things for no other reason but to keep up. This is how riots, […]
Tag Archives: code
String indexing in Julia
Julia has a few peculiarities in string indexing, an area generally blissfully devoid of such gotchas in most programming languages. Some of these can cause quite unpleasant results, and as such it’s helpful to have a good understanding of how string indices work. The other day, I have helped someone through a bit of code […]
Revisiting emulated OOP behaviour and multiple dispatch in Julia
Re-posted from: https://thenewphalls.wordpress.com/2014/06/02/revisiting-emulated-oop-behaviour-and-multiple-dispatch-in-julia/
In an earlier post, I explored one approach to emulating bundling functionality with the data on which it operates, akin to object methods in OOP languages such as C# and PHP. A comment posted by Matthew Browne questioned whether this approach was compatible with Julia’s multiple dispatch.
This is something I thought about at the time of writing the original article, but I had assumed it wouldn’t be possible due to the way in which the anonymous functions are assigned to variables i.e. assigning one definition would overwrite the previous. However, Matthew’s question prompted me to reconsider – and after some brief experimentation and some small alterations, I found that there is indeed a way to maintain compatibility with multiple dispatch.
Below is an updated example type definition:
type MDTest method::Function function MDTest() this = new() function TestFunction(input::String) println(input) end function TestFunction(input::Int64) println(input * 10) end this.method = TestFunction return this end end
The theory is basically the same, with the constructor assigning the methods to their respective fields within the type. The difference is in how the functions are defined and assigned.
On lines 7 and 11, methods are defined with different argument types. These methods could be defined outside of the type definition without error, but defining them within the constructor has the advantage of not polluting the global scope.
On line 15, the function is assigned to its field using some slightly different syntax, which allows both methods to be called.
With this, the example code below:
test = MDTest() test.method("String") test.method(5)
Produces the output:
String
50
Another advantage to this approach is the absence of anonymous functions – which, according to benchmarks and GitHub issues, have significantly worse performance compared to named functions.