2014-11-07 4 views
5

Я новичок в ООП. Допустим, у меня есть тип и функцию, как это:Julia: Constructor Внедрение функции внутри типа

type Person 
     name::String 
     male::Bool 
     age::Float64 
     children::Int 

    end 

    function describe(p::Person) 
     println("Name: ", p.name, " Male: ", p.male) 
     println("Age: ", p.age, " Children: ", p.children) 
    end 


    ted = Person("Ted",1,55,0) 

    describe(ted) 

Есть ли способ, чтобы иметь функцию описания внедренный внутри типа. Например, если я что-то вроде ввода этой

ted.describe() 

Я хотел бы получить:

Name Ted Male true 
Age 55.0 Children 0 

ответ

4

Я тоже новичок в Джулии, и у меня была такая же просьба несколько раз назад.

Теперь я бы решить проблему с помощью следующего кода, благодарственное на помощь от
  Understanding object-oriented programming in Julia – Objects-part 1 ,

Я знаю, что анонимный fonction не очень быстро, но я думаю, что накладные расходы не так уж плохо для функции «печати».

#!/usr/bin/env julia 
type Person 
    name::AbstractString 
    male::Bool 
    age::Float64 
    children::Int 
    describe::Function 
    function Person(name,male,age,children) 
     this = new() 
     this.name = name 
     this.male = male 
     this.age = age 
     this.children = children 
     # anonymous functions are not known to be fast ;-) 
     this.describe = function() describe(this) end 
     this 
    end 
end 

function describe(p::Person) 
    println("Name: ", p.name, " Male: ", p.male) 
    println("Age: ", p.age, " Children: ", p.children) 
end 

ted = Person("Ted",1,55,0) 
# describe(ted) 
ted.describe() 

Однако, поскольку 0xMB сказал: это не путь Джулии. Но мне нравится метод вызова цепочек вызовов из Ruby, Итак, я надеюсь, что однажды синтаксическое предложение появится, чтобы иметь возможность легко создать некоторый псевдоним для создания такой «функции-члена».

- Морис

+0

Я только изменил тип «String» на «AbstractString» для совместимости julia-0.4 (чтобы подавить устаревшее предупреждение). – mdiam

3

Джулия не поддерживает эту точечную нотацию. Это может отличаться от других объектно-ориентированных языков, где методы являются частью ваших объектов, но в функции Julia, как полагают, действуют на данные в целом и поэтому не определены внутри данных ваших объектов.

Ваш пример в порядке.

+0

Я получил 'Ошибка вычисления REPL: недействительного переопределения постоянного Person' Я думаю, что вы забыли установить ссылки на что-то в' println'. – ccsv

Смежные вопросы