Closed9

Observables.jlまったくわからん.jl

hnakano863hnakano863

juliaのパッケージObservables.jlについて理解するためのメモ。
プロットパッケージのMakie.jlについて理解するのに、Observables.jlも知っておいた方が良さそうだな、ということで勉強する。

hnakano863hnakano863

ヘルプを読んだ感じ、Refはポインタを表現する型らしい。ただし、ヌルポにならないことが保障されているのかな?Ptrより少し安全装置があるような記述をしている。

Ref(x)xへの参照ができる。[]で参照先の値にアクセスできる。

hnakano863hnakano863

ObservableRefと似ているのは、それ自体はRefのように値への参照なのだろう。[]で参照先の値を得られるのも同じ。ただ、Refと違って、Observableは参照先の値の変更をlistenしている。
つまり、参照先の値が変更されるたびに関数を実行できるっぽい。

hnakano863hnakano863

on(f, o::Observable)で、関数foの参照先が変更されるたびに実行されるように登録することができるみたい。
off(o::Observable, f)で、onによって登録された関数fを外すことができる。

on(o::Observable) do ... endの書き方をすることが多そう?

hnakano863hnakano863

やってみた

using Pkg
p = mktempdir()
Pkg.activate(p)
Pkg.add("Observables")
using Observables

x = 3
o = Observable(x)

on(o) do x
    println("x is updated!: ", x)
end

oの参照先であるxの値を直接書き換えても意味はなさそう

julia> x = 4
4

o[]に値を入れると関数が実行される。

julia> o[] = 5;
x is updated!: 5

ちなみにこのときxは変更されないっぽい

julia> x === o[]
false

julia> @show x
x = 4
hnakano863hnakano863

Reactive.jlと似ているらしいけれど、Observables.jlは同期的で、Reactive.jlは非同期的らしい?
ひとまずは今はこの辺の話は無視。

hnakano863hnakano863

他のAPI

onany(f, args...)
argsは全部Observableで、argsのどれか一つが更新されるたびにfを実行するように登録する

map!(f, o::Observable, args...)
argsは全部Observableで、argsのどれか一つが更新されるたびに、f(args)の実行結果でoを更新する。

ソースはこんな感じ

function map!(f, o::Observable, os...)
    onany(os...) do val...
        o[] = f(val...)
    end
    return o
end

connect!(o1::Observable, o2::Observable)
o1が更新されるたびに、o2o1と同じ値で更新する。

ソースはこんな感じ

connect!(o1::Observable, o2::Observable) = map!(identity, o2, o1)
このスクラップは2022/04/04にクローズされました