Most people coming from the object-oriented programming (OOP) world are used to using "." to access member methods/functions of a class. Consider the following simple example in Python that defines a class AA which has two members: an integer variable N to store the number of people attended, and a split(cost) function to calculate the cost split evenly among all attendees.
20 people attended the group dinner, and each should pay $25.00
In Julia, with multiple dispatch and functions as first-class objects, the code would usually be written this way:
type AA
N :: Int
end
split(event::AA, x::Number) = x/event.N
groupdinner = AA(20)
totalcost = 500.00
@printf("%d people attended the group dinner, and each should pay \$%.2f\n", groupdinner.N, split(groupdinner, totalcost))
However, if someone insists that a class (or type in Julia) should "own" the member functions, I do see a workaround using inner constructor, like this:
type AA
N :: Int
split :: Function
AA(n::Int) = new(n, (x::Number) -> x/n)
end
groupdinner = AA(20)
totalcost = 500.00
@printf("%d people attended the group dinner, and each should pay \$%.2f\n", groupdinner.N, groupdinner.split(totalcost))
This approach treats member functions as Function objects owned by a type, and the implementations of member functions are actually written in an inner constructor.
Obviously this is a workaround and workarounds are awkward. However, I do see one potential practical use: modern IDEs often provide intellisense which will display an object's members once "." is typed after an object name. It's quite handy when I want to use a mature 3rd party module that I don't have time to learn by reading documentation; instead I just want to quickly try and use it by exploring the class hierarchy. It also saves a lot of memorizing/typing when I can be constantly reminded/auto-completed of matching variable/function names filtered by the object before the "." and the first few letters I typed in after the ".".
In Julia one can use methods(AA) to display all functions that take AA object(s) as input(s). However, the list produced is often quite long and hard to read, since multiple dispatch will create many versions of the same function, with each differing only in the parameter types, and "methods" will show all of them with parameter types but no meaningful names. Also not sure how intellisense can help here. So the only way to explore for now is to know the function name (or at least a significant leading part of the name) and read its documentation by using "?" in a terminal, separate from the source code editor.
With the "." workaround shown above intellisense should be able to prompt the name "split" alongside with "N".
I just wonder if this workaround would be considered way too "unJulian" that it ought to be denounced. :-)
Thanks,
-Zhong