Thanks, Matt and others! All the best, Sean
On Sunday, November 30, 2014 2:18:48 AM UTC-8, Matt Gushee wrote: > > 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] > <javascript:>> 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 >
