Hi, Sean-- I'm new to Julia myself, so take this with a grain of salt ... also, I'm not going to tell you that what you are trying to do is wrong or not done. However, I do think it is unidiomatic.
I guess that, coming from an OO background, you are accustomed to thinking of 'method' as meaning a function that belongs to a particular object, and has access to that object's internal state. In a language like Julia that uses multiple dispatch, 'method' is a specialized implementation of a generic function. You probably read that somewhere, but if it's a new idea to you perhaps it's not clear what that means. There aren't many languages that fully support multiple dispatch, but it's very powerful. Anyway, I suppose it could be argued that 'methods' in Julia and in Java are in some sense the same thing - but I'll leave that argument to the academic computer scientists. There is no doubt that the two kinds of methods are very different in their surface manifestations. [PS: if you are indeed new to the concept of multiple dispatch, I've included a fun little exercise at the end that might give you some insights] On Sun, Nov 30, 2014 at 12:06 AM, Sean Gerrish <[email protected]> wrote: > I'd find it natural to attach a method to a particular instance of an > object as in traditional object-oriented programming (see the example > below). I can manage this with the constructor NewFoo, which binds the > instance to the method after the object is created. Is this idiomatic in > Julia? Is there a more idiomatic way? The question is, what problem are you trying to solve? You are trying to recreate a familiar programming paradigm in a language that doesn't natively support it. I would guess that as you become more familiar with this language, you'll discover a better solution. But that's hard to say without knowing what you are trying to accomplish in the real world. However, if we define the problem as "create a type that contains two numeric values, and a method that performs a computation with those values," here's my suggestion: type Foo x::Number y::Number end function compute(f::Foo) f.x + f.y end foo = Foo(2, 3) compute(foo) => 5 And here's something you can try. I'm just showing code for you to enter - the results are omitted. julia> + julia> "a" + "b" julia> methods(+) julia> function +(a::String, b::String) string(a, b) end julia> + julia> "a" + "b" julia> methods(+) Pretty cool, huh? NOTE that I am not suggesting you distribute any code that does this for real - I think a lot of people would have a problem with extending '+' in that particular way; this is not Python. Hope that helps, and sorry for being long-winded. -- Matt Gushee
