Как мы проводим занятия в Юлии? - PullRequest
1 голос
/ 22 мая 2019

У меня проблема с написанием уроков на Юлии. Я просмотрел документацию и не видел документов по классам.

В Python классы, например,

class Dog:
   # ----blah blah---
end

Как это возможно в Юлии?

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Ближайшим к классам с методами в Julia можно воспользоваться:

module DogClass

export Dog, bark

struct Dog
    name::String
end

function bark(d::Dog)
    println(d.name, " says woof!")
end

end #MODULE

using .DogClass  # note the . here, means look locally for module, not library

mydog = Dog("Fido")

bark(mydog)
0 голосов
/ 29 мая 2019

Юля не имеет классов. Вместо этого мы определяем новые типы, а затем определяем методы для этих типов. Методы не принадлежат тем типам, с которыми они работают. Вместо этого можно сказать, что метод принадлежит общей функции с тем же именем, что и метод. Например, существует много версий («методов») функции length; вместе они образуют обобщенную функцию length.

Вот расширенный пример «юлианского» подхода к программированию с типами и методами. Новые типы объявляются с использованием ключевого слова struct:

struct Person
    name::String
    age::Int64
end

Теперь мы можем определять методы для типа Person:

name(p::Person) = p.name
age(p::Person) = p.age

bio(p::Person) = println("My name is ", name(p)," and I am ", age(p), " years old.")

Методы могут быть определены для различных комбинаций типов аргументов. Чтобы проиллюстрировать это, давайте сначала определим некоторые новые типы:

abstract type Pet end

struct Cat <: Pet
    name::String
    color::String
end

name(c::Cat) = c.name
color(c::Cat) = c.color
species(::Cat) = "cat"

struct Dog <: Pet
    name::String
    color::String
end

name(d::Dog) = d.name
color(d::Dog) = d.color
species(::Dog) = "dog"

bio(p::Pet) = println("I have a ", color(p), " ", species(p), " named ", name(p), ".")

struct Plant
    type::String
end

type(p::Plant) = p.type
bio(p::Plant) = println("I have a ", type(p), " house plant.")

На данный момент мы видим, что мы определили три различных метода с одним аргументом для bio:

julia> methods(bio)
# 3 methods for generic function "bio":
[1] bio(p::Plant) in Main at REPL[17]:1
[2] bio(p::Person) in Main at REPL[4]:1
[3] bio(p::Pet) in Main at REPL[14]:1

Обратите внимание на комментарий в выводе methods(bio): «3 метода для универсальной функции« био »». Мы видим, что bio является обобщенной функцией , которая в настоящее время имеет 3 метода, определенных для другой функции сигнатуры . Теперь давайте добавим пару методов с двумя аргументами для bio:

function bio(person::Person, pet::Pet)
    bio(person)
    bio(pet)
end

function bio(person::Person, plant::Plant)
    bio(person)
    bio(plant)
end

... что дает нам всего пять методов для bio:

julia> methods(bio)
# 5 methods for generic function "bio":
[1] bio(person::Person, plant::Plant) in Main at REPL[20]:2
[2] bio(p::Plant) in Main at REPL[17]:1
[3] bio(p::Person) in Main at REPL[4]:1
[4] bio(p::Pet) in Main at REPL[14]:1
[5] bio(person::Person, pet::Pet) in Main at REPL[19]:2

Теперь давайте создадим несколько экземпляров наших типов:

alice = Person("Alice", 37)
cat = Cat("Socks", "black")
dog = Dog("Roger", "brown")
plant = Plant("Boston Fern")

Итак, наконец, мы можем проверить наши bio методы:

julia> bio(alice, cat)
My name is Alice and I am 37 years old.
I have a black cat named Socks.

julia> bio(alice, dog)
My name is Alice and I am 37 years old.
I have a brown dog named Roger.

julia> bio(alice, plant)
My name is Alice and I am 37 years old.
I have a Boston Fern house plant.

Примечание: Модули используются главным образом для управления пространством имен . Один модуль может содержать определения для нескольких типов и нескольких методов.

...