MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Juliaの構造体とPythonのif __name__ == '__main__':を模擬するTips

目次

はじめに

この記事はJulia Advent Calendar 2017の20日目の記事です.

qiita.com

 

以前、プログラミング言語のJuliaを紹介しましたが、

myenigma.hatenablog.com

最近気がついたJuliaのTipsをまとめてみました。

 

Pythonのif name == 'main': をJuliaで実現する

個人的にPythonのコードを開発する時は、

個別のライブラリを一つのPythonコードにして、

それらのテストコードを

if name == 'main':で格納し、

そのスクリプトを起動させた時だけ、

テストを実行させる方法を良く使っていました。

しかし、下記の記事のように、

Juliaではif name == 'main':と同じような機能は無いようでした。

stackoverflow.com

 

そこで自分は下記のようなコードスニペットを使っています。

if length(PROGRAM_FILE)!=0 && contains(@__FILE__, PROGRAM_FILE)
    #Test code
end

一つ目の条件文はPROGRAM_FILEを使い、

REPLからincludeされた時はPROGRAM_FILEが空文字になる

機能を使って、REPLからincludeされる時はテストを起動しないようにしています。

二つ目の条件文は

PROGRAM_FILE名が@_FILEのファイルパスに含まれているかを確認し、

他のコードからimportされた時は、テストを起動しないようにしています。    

今の所、このコードを使うことで、

Pythonのif name == 'main':と同じような機能を実現できています。

 

Juliaにおける構造体

まずJuliaにおける構造体は大きくわけて、

mutable (データ可変)な構造体と、

immutable (データ不変)な構造体があります。

 

julia v0.6時点で、

immutableな構造体は下記のサンプルコードのようにstructを使います。

以前は immutableという予約語を使っており、

Julia v0.6ではstructもimmutableも同じ意味で使用できるのですが、

将来的にimmutableで構造体を作るのは廃止される可能性があるみたいなので、

structを使ったほうが良さそうです。

下記のコードのように、

structで宣言された構造体のデータは初期化時のみデータを入力することができますが、

途中で変更するようにするとエラーが発生します。

 

同じように、mutableな構造体は、

mutable structを使います。

以前は typeという予約語を使って、

mutableな構造体を生成していましたが、

こちらもJulia v0.6では、typeとmutable structの両方が使えます。

しかし、将来的にtypeは廃止される可能性があるので、

mutable structを使ったほうがいいようです。

 

また、構造体の初期化をする

いわゆるコンストラクタは、

下記のコードのStruct3で示すように、

書くことができます。

このコンストラクタは、C++のように引数の数に応じて、

複数設定することができます。

#
# Struct sample on Julia
#
# author: Atsushi Sakai
#

using PyCall

@pyimport matplotlib.pyplot as plt

# 以前は struct = imutable だった
struct Struct1
    x::Float64
    y::Float64
    yaw::Float64
end

# 以前は mutable struct = type だった
mutable struct Struct2
    x::Float64
    y::Float64
    z::Float64
end


mutable struct Struct3
    x::Float64
    y::Float64
    z::Float64

   #コンストラクタ的なもの
    Struct3() = new(1.0,1.0,1.0)
    Struct3(x) = new(x,1.0,1.0)
    Struct3(x,z) = new(x,1.0,z)
end

function main()
    println(PROGRAM_FILE," start!!")

    st1 = Struct1(0.0, 0.0, 0.0)
    println(st1)
    st2 = Struct2(0.0, 0.0, 0.0)
    println(st2)

    # st1.x = 1.0 # Error
    println(st1)

    st2.x = 2.0
    println(st2)

    st3 = Struct3()
    println(st3)
    st4 = Struct3(2.0)
    println(st4)
    st5 = Struct3(2.0, 5.0)
    println(st5)

    println(PROGRAM_FILE," Done!!")
end

if contains(@__FILE__, PROGRAM_FILE)
    @time main()
end

github.com

 

上記のコードを実行すると、

下記の結果が得られます。

f:id:meison_amsl:20171209094044p:plain

 

参考資料

github.com

stackoverflow.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com