In [1]:
importall Base
Em Julia, tipos são como classes em python, com a diferença de que não possuem métodos internos. São então muito mais parecidos com os structs de C.
Podemos definir um tipo imutável (que não pode mudar depois de criado) para representar um vetor em duas dimensões:
In [2]:
immutable Vector2D
x::Float64
y::Float64
end
Temos dois campos, representando as coordenadas em x e y. Podemos criar um "objeto" deste tipo, fazendo:
In [3]:
w = Vector2D(2.0, 1.0)
Out[3]:
Podemos acessar os campos de w
In [4]:
w.x
Out[4]:
Criamos outro vetor fazendo:
In [5]:
v = Vector2D(5.0, 10.0)
Out[5]:
Note que o vetor v
foi impresso na célula acima, mas sua impressão é muito feia. Podemos mudar isto, criando um método show
para nosso novo tipo. Similarmente, temos métodos de show
para quase todos os tipos padrão de Julia.
In [6]:
show(io::IO, v::Vector2D) = print(io, "[$(v.x), $(v.y)]")
Out[6]:
In [7]:
v
Out[7]:
In [8]:
w
Out[8]:
Vetores se somam e podem ser multiplicados por escalares. No entanto, isto ainda não é possível:
In [9]:
v + w
Não existe um método +
que espere dois vetores. Podemos definir este método fazendo:
In [10]:
+(a::Vector2D, b::Vector2D) = Vector2D(a.x + b.x, a.y + b.y)
Out[10]:
In [11]:
v + w
Out[11]:
A multiplicação é definida de forma similar:
In [12]:
*(v::Vector2D, α::Number) = Vector2D(α * v.x, α * v.y)
*(α::Number, v::Vector2D) = v * α
Out[12]:
In [13]:
2v
Out[13]:
Podemos definir uma partícula por sua posição e velocidade:
In [14]:
type Particle
position::Vector2D
velocity::Vector2D
end
# Ensinando Julia a imprimir uma partícula
show(io::IO, p::Particle) = print(io, "pos: $(p.position); vel: $(p.velocity)")
Out[14]:
Criamos uma partícula fazendo:
In [15]:
p = Particle(v, w)
Out[15]:
In [16]:
# A partícula se move em um tempo δt
function move!(p::Particle, δt::Real)
p.position += p.velocity * δt
end
move!(p, 0.1)
Out[16]:
Um gás é apenas uma coleção de partículas:
In [17]:
type Gas
particles::Vector{Particle}
end
# Novo método para criar um gás
function Gas(N::Int)
parts = [Particle(Vector2D(rand(2)...), Vector2D(rand(2)...)) for i in 1:N]
return Gas(parts)
end
# Imprimindo um gás
function show(io::IO, g::Gas)
for particle in g.particles
println(particle)
end
end
Out[17]:
In [18]:
bottle = Gas(10)
Out[18]:
Podemos fazer todas as partículas do gás se moverem, adicionando mais um método move
:
In [19]:
function move!(g::Gas, δt::Real)
for particle in g.particles
move!(particle, δt)
end
end
move!(bottle, 0.1)
In [20]:
bottle
Out[20]: