2015-11-17 21 views
16

Sto lavorando a Juno con Julia.
julia: OOP o no

Non so se Julia richiede OOP o meno.

Ad esempio, c'è qualcosa come class o struct di C++?

Come dichiararlo con membri come dati o una funzione?

+7

Quando Google 'Julia supporta OOP', ricevo molti articoli correlati. Non sono utili? Veramente? –

+1

Questa domanda è il primo risultato che appare quando lo guardo su google;). In ogni caso è piuttosto difficile passare dal linguaggio Python o C++ a quello nella tua mente e farlo funzionare. Nella mia esperienza =) – silgon

risposta

20

In caso di dubbio, leggere la documentazione ...

http://docs.julialang.org/en/release-0.4/manual/types/#composite-types

farla breve:

type MyType 
    a::Int64 
    b::Float64 
end 

x = MyType(3, 4) 

x.a 

EDIT: I metodi sono definiti di fuori la definizione del tipo, ad esempio,

function double(x::MyType) 
    x.a *= 2 
end 

Metodi fanno non vivono all'interno del tipo, come avrebbero fatto in C++ o Python, per esempio. Ciò consente a una delle funzionalità chiave di Julia, la distribuzione multipla, di funzionare anche con tipi definiti dall'utente, che si trovano esattamente allo stesso livello dei tipi definiti dal sistema.

+0

questo può sembrare un po 'pedante (non sto provando!), In python la tua funzione 'double()' sarà solo una funzione, non un metodo. dettagli: https://stackoverflow.com/questions/20981789/difference-between-methods-and-functions – stucash

+0

Il punto è che in Python si definisce spesso x.double(), cioè un doppio metodo dell'oggetto. –

2

Non sono esperto di lingua, ma la mia comprensione è: Sì ... e no.

Ha l'equivalente di classi e strutture, tuttavia non esistono metodi su tali oggetti diversi da un singolo costruttore.

Nei linguaggi orientati agli oggetti tradizionali, come C++, Java, Python e Ruby, i tipi composti hanno anche denominate funzioni ad essi associate e la combinazione viene chiamata "oggetto". Nei linguaggi puramente orientati agli oggetti, come Python e Ruby, tutti i valori sono oggetti che siano compositi o meno. Nei linguaggi orientati agli oggetti meno puri, inclusi C++ e Java, alcuni valori, come numeri interi e valori a virgola mobile, non sono oggetti, mentre le istanze di tipi compositi definiti dall'utente sono oggetti veri con metodi associati. In Julia, tutti i valori sono oggetti, ma le funzioni non sono raggruppate con gli oggetti su cui operano. Ciò è necessario dal momento che Julia sceglie quale metodo utilizzare per la distribuzione multipla, vale a dire che i tipi di tutti gli argomenti di una funzione vengono considerati quando si seleziona un metodo, anziché solo il primo (vedere Metodi per ulteriori informazioni sui metodi e la spedizione). Pertanto, sarebbe inappropriato che le funzioni "appartengano" solo al loro primo argomento. Organizzare i metodi in oggetti funzione piuttosto che avere un nome di borse di metodi "dentro" ogni oggetto finisce per essere un aspetto molto utile del design del linguaggio.

6

Vorrei menzionare questa conversazione degna di nota all'interno del gruppo utenti Julia Julia and Object-Oriented Programming.
Per me Julia non è come un linguaggio OO convenzionale, e mi piace sempre pensare a Julia, come più di un metodo orientato lingua che un Object Oriented uno, che è perché se si tenta di creare un struttura dati incapsulati e funzionalità a Julia, presto ti metteresti nei guai.

15

Julia non è orientata agli oggetti in senso pieno perché non è possibile associare metodi agli oggetti di Julia ("tipi").I tipi sembrano però molto simili agli oggetti. Tuttavia, poiché non hanno i loro metodi associati e non c'è ereditarietà, gli oggetti stessi non agiscono. Invece hai funzioni che agiscono sugli oggetti.

La differenza è ball.checkCollision() vs checkCollision (ball, Walls). In realtà non è un grosso problema. Puoi creare qualcosa come l'ereditarietà avendo un tipo avere un campo di un altro tipo, e dispatch multipli ti permette di scrivere funzioni che fanno cose diverse in base agli oggetti che gli dai, che possono essere quasi come i metodi degli oggetti. La vera differenza è dove si salva la funzione e i tipi in un file. Quindi puoi creare una sorta di stile orientato quasi a oggetti in Julia, ma è comunque nettamente diverso dai linguaggi OOP.

0

Sì. Semplicemente non può ereditare da "classi" concrete, solo da quelle astratte.

Le funzioni con invio multiplo sono una rigida generalizzazione dei metodi con invio singolo e sono strettamente più polimorfiche. Devi solo definirli al di fuori della definizione di una classe, perché possono "appartenere" a più oggetti.

I metodi tradizionali in un linguaggio OO sono un caso speciale di funzioni di Julia in cui è disponibile solo dispatching basato sul primo argomento.