のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いていますねー。困った人の役とかに立てばいいかなー。とかそういう程度の奴でーす。むぎゅぎゅ~。更新停滞中ですね~。

NIU miniを組みました。(自作初心者)

NIU Miniを組んだ。

タイトルの通りです~。
NIU MINIというKBDFansさんの製品の40%サイズのキーボードを今回自作というか組み立てしてみました。
初めてやりましたが、元々物作りとか好きだったのもありますが、面白いですね~。

買ったもの。

キーボード関連

名前 いくら?
NIU Mini 40% DIY kit aluminum / black 1 $105.00
XDA 40V2 dye sub keycaps set 1 $38.00
GATERON SWITCHES (10 switches) - 5pin / clear 6 $12.00 ($2.00 * 6)
GATERON SWITCHES (10 switches) - 5pin / red 6 $12.00 ($2.00 * 6)

KBDFansの公式サイトから買いましたー。
他にもtaobaoとかaliexpressとかからも買えるのですがー。
ケースの色とかによってはサイトによっては購入出来ない?みたく公式サイトから買いましたー。
paypalを通して買ったため、ドルがいくらくらいだったとかわからんけど合計で18775円だった。

後、2回に分けて買いました。理由としてはー、購入金額に応じてポイントが貯まって、そのポイントを消費してクーポンが使えるためですー。
2回に分けて買いましたがー、1回で纏めて届きました。
1週間~2週間以内?に届いた記憶が…むぎゅ…よく覚えてないですねー。

スイッチを2種類買ったのはGateronの白に興味はあるけど軽すぎないか…?むぎゅ?とか思っている(た)のでー。
赤も一応買っておいて最悪赤を使おうかと。無難?な赤、無難なのは茶か、むぎゅ。
ちなみに、CherryじゃなくてGateronなのはこっちのが安いからですねー。
そのうちお金貯まったら沢山色々軸買ってそうですねー。未来が見えましたー。

キーボード外観

ケースが全金属か半アクリルか選べたのですがー、僕は全金属にしましたねー。
後はPCB自体に既にLEDがついていてー光らす事が出来るのでー、光らせたい場合はですがー。アクリルにするといいのではないでしょーか。
キーキャップは完全に見た目に惹かれましたねー。↓むぎゅぎゅ~。

f:id:ryuugekisya:20180914202108p:plain
XDA 40V2 dye sub keycaps set

はんだ関連

名前 いくら?
白光 FX600-02 [ハッコーFX-600 100V 平型プラグ] 1 ¥4,160
太洋電機産業 goot グット G-33 ST-11 [はんだこて台] 1 ¥722
太洋電機産業 goot グット SD60 [高密度集積基板用はんだ] 1 ¥281
白光 T18-C2 [こて先 2C型] 1 ¥427
太洋電機産業 goot グット CP-3015 [吸取線幅3.0mm長1.5m] 1 ¥190

こっちは合計で5780円だった。
8割方はんだごてなんだよなぁ…。まあ死ぬまで使う気ですが。むぎゅ。
はんだごてと台の会社が違うのはお値段がこっちのが安かったからです。
後はこて先が2C型のがやりやすいらしいのをー調べてたらよく見かけたんですがー。
Amazonだとプライムじゃないと買えないんですよねー。
なのでー、ヨドバシさんで買いました、ヨドバシさんまじで安いし便利。

NIU Miniを組んだ。その2。

というか完全に作業に集中してて写真殆ど撮ってないんですよね。
元から写真あんまり撮らないたちなんですがー。むぎゅ。
何か4コママンガ的な感じで見て。

開封の儀。

こんな感じの箱に入ってました。
ちなみにスイッチが片方が1個だけ足りませんでした。1個だけだったから別にどーでもいいから放置ですが。
まぁ沢山買いましたから1個くらい数え間違えても仕方ないです。
ちなみに商品購入の時のページには書いてないですがー、ケーブルが1本とゴム足が4つついてましたー。

f:id:ryuugekisya:20180914202942j:plain

はんだ付けおわった。

はんだ付けは久しぶりにやったんだけど、むぎゅ?こんなものでしたっけー?とか思いましたねー。
満足しましたねー、一回ここで。
コツ?としましてはー。はんだの融解温度辺りではんだごてのダイヤルで調整して溶けやすい温度の所をまず見つけると楽でしたねー。
少しやりづらいなー。とかあったら周辺のというかまぁそこは自分の感覚で調整してもらえればいいんじゃないでしょーか。むぎゅ。
まぁミスったら吸い取り線なりなんなりでやり直せばいいと思いますー。

f:id:ryuugekisya:20180914202951j:plain

ただキーキャップはめただけ。

完成ですー。
ただはめた後でも前でもいいんですがー。ちゃんと電気が通っているかどうかをー全部のキーでテストするといいと思います。
僕はSキーだけなんか電気通ってませんでした。やり直しました…むぎぎ…(´・ω・`)

f:id:ryuugekisya:20180914202959j:plain

感想。

はんだ付けは結構手間っちゃ手間ですがー。40%だったのでーかなり助かりましたねー、そういう意味ではー。むぎゅ。
ケースが全金属だと重いんですねー。
格子配列ですがー、まだあまり使っているわけではありませんがー、結構好きになりましたー。
もう戻れませーん。
後はShiftとかCtrlとかTabとかEnterとかは実際1uでも十分押せるし長い必要性が感じられなくなりましたねー。
案外使ってみればいけるものですー。むぎゅぎゅ~。
後で調べましたがー。いらなくなったのか知りませんがー。メルカリで1万で売ってる人もみかけましたねー。
まぁ好みとかがありますからねー。むぎゅ。

後書き。

全国の紬ちゃんのファンに怒られそうですねー。
この記事はNIU MINIを使用して書きました。もちろんです~。むぎゅぎゅ~。
今度またQMKについて(ファームウェア)記事書きますー。感動しましたからー。
まぁいつもどーり困ってる人の役に立てばとかそういう記事ですねー。

Franz, Station, Rambox比較

Franz, Station, Rambox比較

Franz

  • 重い、3つの中で一番重いし重い。
  • 対応サービスの量も一番少い。
  • ダークモードに設定で変更出来るのは吉。
  • Mac,Linux,Windowsに確か全部(macが忘れ)対応している。
  • 今の所完全無料。

Station

  • ダークモードない。
  • 対応サービスの量は普通に多い。
  • UIが少し微妙な所も。アイコン小さかったり、その割にオプションの表示が大きすぎたり。
  • Mac,Linux,Windows全部対応している。
  • LinuxはAppImageでの配布。
  • 今の所完全無料。
  • 同期出来ない。

Rambox 無料版

  • ダークモードない。
  • 対応サービスの量は一番多そう。(但し有料版)
  • カスタムでサイトを指定して登録が可能なのがかなり便利。他のに欲しい。
  • Mac,Linux,Windows全部対応している。
  • 有料版がある。
  • UIが少し残念な気が。操作性が微妙では。
  • オープンソース
  • LinuxはAppImage以外にも各ディストリのパッケージやtar.gz等での配布が嬉しい所。
  • 同期出来る。
  • 有料版があるからには機能等は申し分無い。

自分が選んだもの

Stationを選びました。Franzは重すぎるのと、Ramboxは僕のLinux環境にて動作が少し微妙だったり無料版だとサービスの対応数が微妙だったりした為。

多機能ファイラーAs/Rがとても便利

ファイラーAs/Rのすすめ

はじめに

日頃お世話になっているWindows用のファイラーAs/Rについて勝手におすすめの記事を書いてみようと思った
まあ見て使ってみようかな見たいな人が出てくれればいいかななんて
Windowsのファイラーの中では最強だと個人的に思っている
(使いこなせればだけど・・・)
僕のAs/Rさんの外観はこんな感じですねー。

f:id:ryuugekisya:20180914222806j:plain

f:id:ryuugekisya:20180914222810j:plain

As/R公式サイト

特徴

カスタマイズ性が高い

最大の特徴
ファイラーそのもののレイアウトや、マウス、キーボードの動作をユーザーの好みの形にカスタマイズできる
また、ユーザーが自分でスクリプトやバーを追加することも可能になっている

インクリメンタルサーチが可能

元からインクリメンタルサーチに対応していて、開いているフォルダ内でインクリメンタルサーチが可能で、ファイルが多い時や、キーボード操作中心の人にはかなり便利な機能となっている
また、Migemoに対応しているのも便利な点だ
(別途入れないとだが)

機能紹介

カスタマイズ可能なレイアウト

下記の画像はいじった後の状態だが、インストールした状態で、タブバー、お気に入りバー(ないかも)、フォルダバーなど各種バーが入っている

これらのバーはそれぞれのタイトルをドラッグアンドドロップするだけで下記のように案内が出るので置きたい場所に持っていくことで使いやすいようにカスタマイズできる

レイアウトには以下のようなバーが存在する

  1. 最近閉じたフォルダ一覧
  2. フォルダのツリー表示(Windows標準のエクスプローラの左のやつ)
  3. お気に入りバー
  4. タブバー
  5. プレビュー

これだけでなく、ユーザーが自分で定義したバーも登録することができ、例えばお気に入りバーを増やすなどといったことも可能だ

また、画像にある各バーのピンマークを押すことにより自動的に隠すような表示方法も可能になっている

バー以外にも上部にあるメニューに自分の好みのコマンドを設定できるようになっている
画面を縦または横の2分割にすることが可能
開いているタブ全てを並べて配置するなどの様々な機能がある

マウスだけで、もしくはキーボードだけでの使用ができるようになっている

マウス操作中心ならマウスジェスチャの定義ができるようになっていて、デフォルトの状態ですでにいくらかマッピングがされており、もちろん自分の好みに設定できる
また、キーボード操作中心でも、同様に各キーにコマンドが設定してあり、自分の好みにこちらも変更可能

各バーごとにファイルのクリックなどの動作を変えることができる

例えばお気に入りバーではシングルクリックでそのフォルダを開くが、最近閉じたフォルダバーではダブルクリックじゃないと開かないなど自分好みに設定できる

ファイルの移動/コピーが楽

主にファイラーを使うのはファイルの移動とかだと思うのでかなり有用で使わせていただいてる

先ほどあった画像のように2画面ファイラーとして使うことが可能であり、
例えば、元から入っているコマンドのコピー、ファイルの移動を実行したら、自動的にもう片方の画面が選択されていて、そのまま実行を押せば簡単にファイルの移動/コピーがもう片方のフォルダに対してできるようになっている
また、移動/コピーでは、お気に入りバーに登録してあるフォルダ、または他のタブのフォルダの選択が可能になっていて、それらへの移動も簡単にできるようになっている
これにより、いちいちファイルの移動先をWindows標準のエクスプローラのように移動してペーストしなくても楽に移動/コピーができてしまう

拡張子ごとに起動するエディタ、ビューワーを変えれる

設定からエディタ及びビューワーに対する拡張子判別のスクリプトを書くことによって拡張子別に起動するソフトウェアを変えることが可能

拡張子ごとに色付けができる

設定から自分で設定した拡張子のグループごとに好みの色を設定することで、色分けをすることができる
例えば、動画なら緑、音楽なら青、みたいな感じにして、色でぱっと何のファイルかを見分けることも可能になっている

フォルダ内のファイルのソートの方法をいろいろ設定することができる

表示方法が詳細表示からアイコンのみでの表示方法があり並び順も選択できる
また、表示するにあたってファイル名などの各項目のサイズの調整や、不要な項目を消す、好みの項目の並び順にすることも可能になっている
フォルダごとに表示方法を個別で設定することも可能になっている
フォルダを優先するなどの設定もあり、とても便利になっている

おわりに

大体自分が使ってみて便利だと感じたことを書いてみたが、これ以外にも機能はあるのでぜひ触ってみて欲しいと思う
なによりWindows標準のエクスプローラが使えないので乗り換えることをお勧めしたい
後この記事昔書いた奴をそのままてきとーに画像貼って投稿しただけだからー。まぁ知らんって奴ですねー。むぎゅ。

As/R公式サイト

autohotkey2.0勉強中(翻訳)その9~オブジェクト編その1~

最終更新日:2017/12/23

目次

はじめに

その1のコピペ

翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)

一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う

参考:ahkwiki日本版様及び公式ヘルプ

オブジェクト

オブジェクトの基本

AutoHotkeyのオブジェクトは、以下の3つの基本機能を提供する抽象データ型だってさ

  • 値の取得
  • 値の設定
  • メソッド(つまり、対象オブジェクトで何かを行う関数)を呼び出す

オブジェクト参照は、特定のオブジェクトに対するポインタまたは「ハンドル」
文字列や数値と同様に、オブジェクト参照は変数に格納され、関数に渡されるか、関数から返され、オブジェクトに格納される
x := yのようにある変数から別の変数への参照をコピーした後、両方の変数が同じオブジェクトを参照することになる
参照がコピーされるだけなので、別の物が作成できるわけではないので注意
IsObjectを使用して、値がオブジェクトであるかどうかを判断できる

ex:  result := IsObject(式)

オブジェクトの種類

  • Object - スクリプト可能な連想配列
  • File - ファイル入出力用のインターフェース
  • Function Object - Func、BoundFunc、またはユーザ定義
  • ComObject - IDispatchインターフェイス(COMまたは "Automation"オブジェクト)をラップする

基本的な使い方

配列

配列その者についての説明がないのね、まあ図がないとわかりにくいから割愛で

  • 配列の作成方法

ex:

Array := [Item1, Item2, ..., ItemN]
Array := Array(Item1, Item2, ..., ItemN)  
  • 配列内の値の取り出し
ex: Value := Array[Index]
  • 配列に値を代入(格納)する
ex: Array[Index] := Value
  • 特定のインデックスに一つまたは複数の値の代入(格納)する
ex: Array.InsertAt(Index, Value, Value2, ...)
  • 一つまたは複数の要素を追加する
ex: Array.Push(Value, Value2, ...)
  • 一つまたは複数の要素を削除する
ex: RemovedValue := Array.RemoveAt(Index: 
  • 最後の要素を削除する
ex: RemovedValue := Array.Pop()

配列が空でない場合、MinIndex/MaxIndex/Length は、それぞれ配列内で現在使用されている最初(最小)の要素番号/最後(最大)の要素番号/要素数 を返す
最初の要素番号はほぼ常に1なので、MaxIndexは通常要素の数を返す
ただし、整数キーがない場合、MaxIndexは空の文字列を返し、Lengthは0を返す
配列の内容をループするには、インデックスまたはForループを使用しる

ex:

array := ["one", "two", "three"]  ;配列の宣言  

方法その1  
Loop % array.Length()  ;1から配列の最後まで繰り返す  
MsgBox % array[A_Index]

方法その2  
For index, value in array  ;配列の内容の出力  
MsgBox % "Item " index " is '" value "'"

連想配列

  • 連想配列は、ユニークなキーの集合と値の集合を含むオブジェクト
  • 各キーは1つの値に関連付けられている
  • キーには文字列、整数、オブジェクトを指定できる

  • 連想配列の作成方法

    ex:

    Array := {KeyA: ValueA, KeyB: ValueB, ..., KeyZ: ValueZ} ;方法その1 Array := Object("KeyA", ValueA, "KeyB", ValueB, ..., "KeyZ", ValueZ) ;方法その2

    • {key:value}を使用すると、一単語のみで構成されるキーでは引用符を省略できる
    • どんな式もキーとして使用できるが、変数をキーとして使用するには、カッコで囲む必要がある

      ex:{(KeyVar):Value}と{GetKey():Value}

  • 要素を取得する

    ex: Value := Array[Key]

  • 要素を割り当てる

    ex: Array[Key] := Value

  • 要素を削除する

    ex: RemovedValue := Array.Delete(Key)

  • 要素を列挙する

    ex:
    array := {ten: 10, twenty: 20, thirty: 30} For key, value in array MsgBox %key% = %value%

その他
  • 連想配列はまばらに取り込まれる可能性がある - わけわかんない
  • つまり、{1: "a",1000: "b"}には1000ではなく、2つのキーと値のペアのみが含まれる

オブジェクト

Object.LiteralKeyを使用して、プロパティ、配列要素またはメソッドにアクセスできる
LiteralKeyは識別子または整数、Objectは任意の式
識別子は、英数字、アンダースコア、非ASCII文字が使えて、引用符で囲まれていない文字列で記述する
ドットの後にスペースがあってはならない

ex: 下記はそれぞれどちらも同じ扱いになる

match.Pos  match["Pos"]  
arr.1  arr[1]
  • プロパティ(値)の取得

    ex: Value := Object.Property

  • プロパティ(値)の設定

    ex: Object.Property := Value

  • メソッドを呼び出す

    ex: ReturnValue := Object.Method(Parameters)

  • 計算されたメソッド名を持つメソッドを呼び出す

    ex: ReturnValue := Object[MethodName](Parameters)

  • COMオブジェクトとユーザー定義オブジェクトの一部のプロパティの設定

    ex:
    Value := Object.Property[Parameters] Object.Property[Parameters] := Value

既知の制限
  • 現在、x.y[z]() はサポートされていなくて、x["y", z]()として扱われる
  • 回避策として、(x.y)[z]()とすれば、最初にx.yが評価され、結果をメソッド呼び出しのターゲットとして使用される
  • x.y[z].Call()には(x.y[z]).Call()と同じ評価が行われるため、この制限はない

オブジェクトの開放

  • スクリプトはオブジェクトを明示的に解放しない(メモリから消えないと同義と考えていいかな)
  • オブジェクトへの最後の参照が解放されると、オブジェクトは自動的に解放される
  • 変数に格納されているオブジェクトの参照は、その変数に他の値が割り当てられたときに自動的に解放される

ex:

obj := {}  ; オブジェクトの設定
obj := ""  ; 上で設定したオブジェクトの開放
  • 同様に、別のオブジェクトのフィールドに格納されている参照は、そのフィールドに他の値が割り当てられるかオブジェクトから削除されると解放される
    • これは実際にはオブジェクトである配列にも当てはまる

ex:

arr := [{}]  ; Creates an array containing an object.
arr[1] := {}  ; Creates a second object, implicitly freeing the first object.
arr.RemoveAt(1)  ; Removes and frees the second object.
  • オブジェクトが解放される前に、オブジェクトへのすべての参照が解放されなければならなく、循環参照を含むオブジェクトは自動的に解放されない
  • たとえば、x.childがyを参照し、y.parentがxを参照する場合、親オブジェクトにまだ子への参照が含まれているため、xとyを消去するだけでは十分ではなく、この状況を解決するには、循環参照を削除すればよい

ex:

x := {}, y := {}             ; 二つのオブジェクトの作成
x.child := y, y.parent := x  ; 循環参照の作成

y.parent := ""               ; 循環参照がある場合先に開放しないといけない
x := "", y := ""             ; 一つ↑の文がないと開放されない
  • より高度な使い方と詳細については、参照カウントを参照(後ほど)

備考

構文

すべてのタイプのオブジェクトは、配列構文(角括弧)とオブジェクト構文(ドット)の両方をサポートする
さらに、オブジェクト参照自体を式で使用することもできる

  • オブジェクト参照が、= ==!= <>のいずれかを使用して他の値と比較される場合、両方の値が同じオブジェクトへの参照である場合にのみ、それらは等しいとみなされる
  • if obj、 !obj、 obj ? x : y.のように、booleanが必要な場合、オブジェクトは常に真と見なされる
  • オブジェクトのアドレスは、「&」演算子(アドレス参照演算子)を使用して取得できる
  • これは、オブジェクトの作成時点から最後の参照が解放される瞬間まで、オブジェクトを一意に識別することができる
  • オブジェクトが想定されていない構文でオブジェクトが使用される場合、そのオブジェクトは空の文字列として扱われる
  • オブジェクトの中身が変更されてしまうのでこのような使い方はしないこと

ex:

「MsgBox %object%」は空のメッセージを出力し、「object + 1」は空の文字列を生成されることになる
  • オブジェクトメソッドの呼び出しの直後に代入演算子がある場合、それはパラメータでプロパティを設定するのと同ことになる
  • x.y += 1、--arr[1]などの複合割り当てがサポートされている

ex: 以下は同等

obj.item(x) := y
obj.item[x] := y
  • プロパティを取得または設定するときは、パラメータを省略できる →ex1
  • メソッド名も完全に省略することもできる →ex2
  • スクリプトは、プロパティおよびメタ関数のパラメーターのデフォルト値を定義することで省略可能
  • スクリプトは、_Callメタ関数の最初のパラメータのデフォルト値を定義することによって省略可能
  • COMオブジェクトを呼び出すときにプロパティまたはメソッド名が省略された場合、その「既定のメンバ」が呼び出される

ex:

1. x[,2].
2. x[](a).
キー

[]、{}または新しい演算子で作成されたオブジェクトでは、文字列、整数、およびオブジェクトをキーとして使用できるが、次のような注意点がある
キーの値は保持されるが、その値の型の識別は保持されない
つまり、数値が同じであれば(数値文字列の書式も含めて)、整数は文字列として格納することも、その逆も可能になるということ

具体的には
* 整数キーは、可能な場合はネイティブ符号付き整数型を使用して格納される * -2147483648より小さいか、または2147483647より大きい整数は、AutoHotkey 32ビットに文字列として格納されるが、AutoHotkey 64ビットでは整数として格納される(対照的に、64ビット整数はどちらのバージョンでも値として格納できる) * 文字列キーを(符号付き整数型の)整数に変換し、データを失うことなく文字列に戻すことができる場合は、整数として格納される * 言い換えれば、「x[16]」と「x["16"]」は同じだが、「x["0016"]」や「x["0x10"]」とは異なる * しかし、ロード時に数値リテラルは純粋な数値に変換されるため、x [0x10]はx ["16"]と等価 * 浮動小数点数はキーとしてサポートされておらず、代わりに文字列に変換される * 一貫性と明確さのために、スクリプト浮動小数リテラルをキーとして使用しないこと

下記のような文字列は一般的にキーとして使用すべきではない
* デフォルトでは、文字列キー "base"はオブジェクトの基本オブジェクトを取得または設定するために使用されるため、通常の割り当てで保存するためには使用できない * ただし、値がObjRawSet(Object, "base", "")またはObject.SetCapacity("base", 0)などの他の手段によって格納されている場合、キー "base"は他の文字列と同じように動作する * 「Length」などの組み込みメソッド名はキーとして使用できるが、値を格納すると、対応するメソッドが呼び出されなくなってしまう(ObjLengthなどの適切な関数への参照でない限り)

Tips(応用的な使用法)

関数の参照

変数funcに関数名が含まれている場合、関数は%func%()という式で呼び出すことができる
しかし、これは毎回関数名を解決する必要があり、関数が複数回呼び出されると非効率になってしまう
パフォーマンスを向上させるために、関数への参照を取得し、後で使用できるように格納することができる →ex1
また、次の構文を使用して参照することで呼び出すことができる →ex2
関数参照のその他のプロパティの詳細については、Funcオブジェクトを参照(後ほど)

ex:

1. MyFuncRef := Func("MyFunc")

2. RetVal := %MyFuncRef%(Params)
RetVal := MyFuncRef.Call(Params)
配列の配列(多次元配列)

AutoHotkeyは、他の配列の中に配列を透過的に格納することによって、 "多次元"配列をサポートしている
たとえば、表は行の配列として表現でき、各行はそれ自体が列の配列になる
その場合、行xの列yの内容は、以下のいずれかの方法を使用して設定できる

ex:

table[x][y] := content  ; 方法A
table[x, y] := content  ; 方法B

下記の例では、table[x]が存在しない場合、AとBは次の2つの点で異なるものになる * Aは失敗し、Bは自動的にオブジェクトを作成し、テーブル[x]に格納される * テーブルのbaseがメタ関数を定義している場合は、次のように呼び出される * それにより、Bではオブジェクトが割り当てられ、全体のカスタム動作を定義することができる

ex:

table.base.__Get(table, x)[y] := content   ; 方法A
table.base.__Set(table, x, y, content)     ; 方法B

table[a,b,c,d] := value などの多次元の割り当ては、次のように処理される * 残っているキーが1つだけの場合は、割り当てを実行して戻ることになる、層でない場合は以下の動作が繰り返される * リスト内の最初のキーをオブジェクトで検索される * オブジェクトでないものが検出された場合は、失敗する(例外をスローしる) * オブジェクトが見つからない場合は、オブジェクトを作成して保存される * サブオブジェクトを再帰的に呼び出し、残りのキーと値を渡す

また、この動作は、スクリプト作成オブジェクトにのみ適用され、COMオブジェクトやCOM配列などの特殊なタイプのオブジェクトには適用されない

関数の配列

単純に関数の参照や関数名を含むもののこと

ex:

array := [Func("FirstFunc"), Func("SecondFunc")]

; "foo"をパラメータとして両方の関数を呼び出している
Loop 2
array[A_Index].Call("foo")

; 暗黙的に配列自身をパラメータとして両方の関数を呼び出している
Loop 2
array[A_Index]()

FirstFunc(param) {
MsgBox % A_ThisFunc ": " (IsObject(param) ? "object" : param)
}
SecondFunc(param) {
MsgBox % A_ThisFunc ": " (IsObject(param) ? "object" : param)
}

カスタムオブジェクト

  • スクリプトによって作成されたオブジェクトには、あらかじめ定義された構造である必要はない
  • 代わりに、各オブジェクトは基本オブジェクト(「プロトタイプ」または「クラス」とも呼ばれる)からプロパティとメソッドを継承できる
  • プロパティとメソッドはいつでもオブジェクトに追加(またはオブジェクトから削除)することができ、これらの変更は任意のすべての派生オブジェクトに影響を与える
  • より複雑または特殊な状況では、基本オブジェクトは、メタ関数を定義することによって派生したすべてのオブジェクトの標準的な動作を上書きできる
  • 基本オブジェクトは普通のオブジェクトであり、通常は次の2つの方法のいずれかで作成される

ex:

1. class baseObject {
static foo := "bar"
}

2. baseObject := {foo: "bar"}

別のオブジェクトから派生したオブジェクトを作成するために、スクリプトは基本プロパティに割り当てることも、新しいキーワードを使うこともできる

ex:

obj1 := Object(), obj
base := baseObject
obj2 := {base: baseObject}
obj3 := new baseObject
MsgBox % obj
foo " " obj2.foo " " obj3.foo

いつでもオブジェクトのベースを再割当てすることができ、オブジェクトのインジェクションが持つすべてのプロパティとメソッドを効果的に置き換えることができる

autohotkey2.0勉強中(翻訳)その8-2~関数編その2~

はじめに

翻訳とかあんま得意じゃないんだけど、関数編その2
その1はこちら
間違いあったらコメくれれば訂正します。というか自分用だし、間違えて覚えてしまうから(´・ω・`)

参考:公式ヘルプ

以下その1からの続き

ローカル変数とグローバル変数

ローカル変数

  • 関数の中で使用される変数(組み込み変数を除く)は、関数の呼出しごとに作成され、関数から戻る際に破棄される
  • そのため、関数外からは参照できないローカル変数となる
  • その結果、ローカル変数はグローバル変数と同じ名前を持ったとしても、両方とも別の内容を持つ
  • 分離された関数は、同じ変数名を(安全に)使用できる
  • staticでないすべてのローカル変数は、関数が戻るときに自動的に解放される(空になる)
  • 関数内で作成された変数は、デフォルトではローカルだが、次の例外がある
  • 以下のスクリプトは期待通りの動作をしない
ex: xの値を設定する関数を作りたい  
x := 0  
SetX(10)  
MsgBox,%x%  

SetX(val){  
 x := val  
}

グローバル変数

  • 関数外の既存のグローバル変数を参照する(または新しい関数を作成する)には、その変数を使用する前にその変数をグローバルとして宣言する必要がある
  • 変数名の前に「global」と書くとその変数はグローバル変数として扱われる
  • 複数の変数名を「,」で区切ってまとめて書くことができる(例はその他参照)
  • 関数内で「Array%i%」のような動的変数を使用した場合、ローカル変数として扱われる
  • StringSplitコマンドなどで配列を作成する場合、通常はローカル変数として作成される
    • ただし、配列の最初の要素がglobal宣言されている場合は、全ての要素がグローバル変数として作成される
ex: LogToFile(TextToLog)  
{  
    global LogFileName  ;この関数はすでにほかの部分で値がセットされている  
    FileAppend, %TextToLog%`n, %LogFileName%  
}  
仮定(前提)グローバルモード

関数が大量のグローバル変数にアクセスしたり作成したりする必要がある場合、関数の最初の行に"global"という単語をつけて、すべての変数がグローバル変数になるように定義することができる

ex: SetDefaults() { global MyGlobal := 33 ;グローバル変数を作成、必要に応じて変数に初期値を代入する Global1 ;これもグローバル変数になる local x, y:=0, z ;ローカル変数にしたい場合はこのように宣言しなければならない }

この仮定グローバルモードは、関数がArray%A_Index%に値を代入するループなどのグローバル擬似配列を作成するために関数で使用することもできる

スーパーグローバル変数

  • グローバル宣言が関数の外に出現する場合は、デフォルトですべての関数に(グローバルが)適用される
  • これにより、各関数の変数を再宣言する必要がなくなる
  • ただし、同じ名前のパラメータまたはローカル変数が宣言されている場合は、グローバル変数よりもそちいが優先される
  • また、classキーワードによって作成された変数もスーパーグローバルになる

static変数

  • static変数は常に暗黙的にローカルだが、ローカル変数との違いは呼び出し間でその値が記憶されるという点
  • 宣言方法はグローバル変数と同様でいい
  • 複数の変数名を「,」で区切ってまとめて書くことができる(例はその他参照)
ex: LogToFile(TextToLog)  
{  
    static LoggedLines := 0  
    LoggedLines += 1  ; Maintain a tally locally (its value is remembered between calls).  
    global LogFileName  
    FileAppend, %LoggedLines%: %TextToLog%`n, %LogFileName%  
}  
  • static変数は、宣言と同じ行で := の後に任意の式をつけて初期化することができる
  • たとえば、static X:=0, Y:="fox"など
  • 各静的変数は1回だけ初期化される
  • static変数は、スクリプトファイルに表示される順序で、スクリプトの自動実行セクションの実行前に初期化される

仮定(前提)staticモード

関数の最初の行に"static"という単語を付けることによって、すべての変数がstatic(そのパラメータを除く)であると仮定するように定義できる

ex: GetFromStaticArray(WhichItemNumber) { static static FirstCallToUs := true ;static宣言のイニシャライザは、起動時に1回だけ実行される if FirstCallToUs ;最初の呼び出しではstatic配列を作成しるが、それ以降の呼び出しでは作成されない { FirstCallToUs := false Loop 10 StaticArray%A_Index% := "Value #" . A_Index } return StaticArray%WhichItemNumber% }

staticモードでは、staticであってはならない変数は、ローカルまたはグローバルとして宣言する必要がある

ローカルとグローバルについてその他

  • 以下の例のように、複数の変数をカンマで区切って同じ行に宣言することができる
ex: global LogFileName, MaxRetries := 5  
static TotalAttempts := 0, PrevResult
  • ローカル変数またはグローバル変数は、宣言と同じ行で:=の後に任意の式を付けて初期化することができる
  • static初期化子とは異なり、ローカルとグローバルのイニシャライザは、関数が呼び出されるたびに実行されるが、コントロールのフローが実際にそれらに到達する場合にのみ実行される
  • つまり、「local x := 0」のような行は、「local x」の宣言とそれに続く「x := 0」という2つの別々の行を書くのと同じ効果を持つということ
  • ローカル、グローバル、およびstaticという単語は、スクリプトの起動時にすぐに処理されるため、変数はif文によって条件付きで宣言することはできない
  • つまり、ifまたはelseのブロック内の宣言は、宣言と関数の閉じ括弧の間のすべての行に対して無条件に有効になる
  • また現在、グローバル配列%i%などの動的変数を宣言することはできない

関数の動的呼び出し

  • 関数(組み込み関数でさえ)は、パーセント記号で動的に呼び出すことができる
  • たとえば、%Var%(x, "fox")は名前がVarに含まれる関数を呼び出す
  • 同様に、 Func%A_Index%()は、A_Indexの現在の値に応じて、Func1()またはFunc2()などを呼び出す
  • Var in %Var%()には、関数名または関数オブジェクトを含めることができる
  • 関数が存在しない場合は、デフォルトの基本オブジェクトのCallメソッドが代わりに呼び出される(通常、このメソッドが定義されていない場合は、__Callメタ関数が呼び出される)
  • 以下のいずれかの理由により関数を呼び出せない場合は、例外がスローされる
  • 存在しない関数を呼び出すことはIf IsFunc(VarContainingFuncName)を使用して回避することができる
  • 組み込み関数を除いて、呼び出される関数の定義は、#Includeやライブラリ関数への非動的呼び出しなどの手段によってスクリプトに明示的に存在しなければならない
  • IsFunc()の戻り値(必須パラメータの数に1を足した値)をチェックすることによって避けることができるパラメータは少ない
  • 注:あまりにも多くのパラメータを渡すことは許容されるが、余分なパラメータは完全に評価され(関数への呼び出しを含む)、破棄される
  • 関数への動的呼び出しは、スクリプトの実行が開始される前に通常の呼び出しが参照されるため、通常の呼び出しよりもわずかに遅くなる

再帰呼び出し

  • 関数の中からその関数自身を呼び出すテクニックを再帰呼び出しという
  • 下記の例は、パラメータで与えられたnの階乗を求める関数である
ex: Factorial(n){  
If n := 1  
Return 1  
Else  
Return n * Factorial(n * 1)  
}
  • なお、再帰呼び出しを行う関数で、「ByRef」による参照渡しのパラメータにローカル変数を与えると、呼び出し先の当該変数が参照されるようになってしまうため、以下のスクリプトは正しく動作しない
ex: Factorial(ByRef n){  
If n := 1 ;(2)ここのnでは呼び出し元のxではなく、呼び出された側のxが参照されてしまう    
Return  
x := n * 1  
Factorial(x) ;(1)ここでローカル変数xを参照渡しすると  
n *:= x  
}

boolean型の短絡評価

  • 式の中でAND、OR、および3項演算子が使用されている場合、それらは短絡してパフォーマンスを向上させる(関数呼び出しが存在するかどうかにかかわらず)
  • 短絡は、最終結果に影響を及ぼし得ない部分の評価を省略すること
  • 概念の説明
ex: if (ColorName <> "" AND not FindColor(ColorName))  
MsgBox %ColorName% could not be found.
  • 上記の例では、ColorName変数が空の場合、FindColor()関数は呼び出されない
  • これは、ANDの左側が偽であるため、右側が最終結果を真にすることができないから
  • この振る舞いにより、関数がグローバル変数の内容を変更するなどの副作用が起こる
  • また、副作用はその関数がANDまたはORの右側で呼び出されると、決して発生しないことを認識することが重要
  • また、短絡評価がネストされたANDおよびORにカスケードすることにも注意する必要がある
  • たとえば、次の式では、ColorNameが空白のときは常に一番左の比較が行われるこれは、左側が確実に最終的な答えを決定するのに十分であるから
ex: if (ColorName = "" OR FindColor(ColorName, Region1) OR FindColor(ColorName, Region2))
break   ; Nothing to search for, or a match was found.
  • 上記の例で示されているように、パフォーマンスの向上のために、ANDまたはORの右側では、関数が呼び出されないことがある
  • この技法は、パラメータの1つが空の文字列など、不適切とみなされる値を渡されるときに関数が呼び出されないようにするためにも使用できる
  • 三項条件演算子(?:)も、不必要な分岐を評価しないことによって短絡する

関数内でのサブルーチンの使用

  • 関数は他の関数の定義を含むことはできないが、サブルーチンを含めることができる
  • 他のサブルーチンと同様に、Gosubを使用してそれらを起動し、Returnで戻る(この場合、ReturnはGosubに属し、関数ではない)
  • 関数がGosubを使用して関数外にあるサブルーチンにジャンプする場合、外部の変数はすべてグローバルであり、サブルーチンが戻るまで関数のローカル変数にはアクセスできまない
  • ただし、A_ThisFuncには引き続き関数の名前が含まれる
  • Gotoは関数の内部から外部にジャンプすることはできないが、Gosubに外部/パブリックサブルーチンを関数として渡し、そこからGotoを実行することは可能
  • Gotoの使用は一般的には推奨されないが、関数内で同じ関数内の別の位置(ラベル)にジャンプすることがでる
  • これにより、多くのリターンポイントを持つ複雑な関数を簡単にすることができる
  • また、関数外のラベルにGotoでジャンプしようとした場合、その行は無視される
  • これらの関数のすべては、返される前にクリーンアップを行う必要がある
  • 関数には、タイマー、GUI g-label、メニュー項目などの外部呼び出しサブルーチンが含まれている場合がある
  • これは#Includeで使用し、別のファイルにカプセル化するために一般的に行われ、スクリプトの自動実行セクションとの干渉を防げる
  • ただし、次の制限が適用される
  • このようなサブルーチンでは、関数が正常に呼び出される場合は、ローカル変数ではなくstatic変数のみを使用する必要がある
    • これは、関数呼び出しスレッドを中断するサブルーチンスレッド(またはその逆)が中断されたスレッドによって見られるローカル変数の値を変更できるため
    • さらに、関数が呼び出し元に戻ると、そのローカル変数はすべて空白になってメモリが解放される
  • このようなサブルーチンでは、GUI制御変数としてグローバル変数(static変数ではない)のみを使用する必要がある
  • 関数がサブルーチンスレッドによって入力されると、そのスレッドによって作成された動的変数への参照はすべて(配列を作成するコマンドを含む)グローバルとして扱われる
  • 同様に、ローカルラベルは動的に参照することはできない

Return、Exit、および一般的な備考

  • 関数内の実行フローが関数の閉じ括弧(関数の終了地点)に到達する前にReturnに到達すると、関数は終了し、空の値(空文字列)を呼び出し元に返す
  • 関数が明示的にReturnのパラメータを省略するときも、空の値が返される
  • 関数がExitコマンドを使用して現在のスレッドを終了すると、その呼び出し元は戻り値をまったく受け取らない
  • たとえば、Var= Add(2,3)ステートメントは、Add()が終了するとVarを変更しない
  • 存在しないファイルを実行するなどのランタイムエラーが発生した場合(UseErrorLevelが有効でない場合)も同じことが起こる
  • 関数は、覚えやすい余分な値を返す目的で、ErrorLevelの値を変更することがある
  • 空白の値(空文字列)が1つ以上ある関数を呼び出すには、以下の例のように空のクォートペアを使用する
ex: FindColor(ColorName、 "")
  • 関数を呼び出すことは新しいスレッドを開始しないので、SendModeやSetTitleMatchModeなどの設定に対して関数が行った変更は、呼び出し元に対しても有効である
  • 関数の呼び出し元は、存在しない変数または配列要素を渡すことがありるこれは、関数が対応するパラメータがByRefであると期待している場合に便利
  • たとえば、GetNextLine(BlankArray%i%)を呼び出すと、呼び出し元が関数内にあるかどうか、および仮定グローバルモードが有効かどうかによって、変数BlankArray%i%がローカルまたはグローバルとして自動的に作成される
  • 関数内で使用すると、ListVarsは関数のローカル変数とその内容を表示するこれは、スクリプトデバッグに役立つ

スタイルと命名規則

  • 特別な変数に別個の接頭辞が与えられていると、複雑な関数が読みやすく保守的になることがある
  • たとえば、関数のパラメータリストの先頭に "p"または "p_"を付けて名前を付けると、特別な性質が一目でわかりやすくなる
  • 同様に、接頭辞「r」または「r」はByRefパラメータに使用でき、「s」または「s」はstatic変数に使用できる
  • One True Brace(OTB)スタイルは、オプションで関数を定義するために使用できる
ex:  Add(x,y){  
Return x + y  
}

#Includeを使用して複数のスクリプト間で関数を共有する

  • #Includeディレクティブは、外部ファイルから関数をロードするために(スクリプトの先頭でも)使用できる

関数のライブラリ:標準ライブラリとユーザライブラリ

  • スクリプトは、#Includeを使わなくても、外部ファイルの関数を呼び出すことができる
  • これが機能するには、関数と同じ名前のファイルが以下のライブラリディレクトリのいずれかに存在している必要がある
ex: 
%A_ScriptDir%\Lib\  ; ローカルライブラリ  
%A_MyDocuments%\AutoHotkey\Lib\  ; ユーザーライブラリ  
path-to-the-currently-running-AutoHotkey.exe\Lib\  ; 標準ライブラリ
  • たとえば、存在しない関数MyFunc()を呼び出すと、プログラムはユーザーライブラリ内の"MyFunc.ahk"という名前のファイルを検索する
  • そこで見つからなければ、標準ライブラリで検索される
  • まだ見つからず、関数の名前にアンダースコア(たとえばMyPrefix_MyFunc)が含まれている場合、プログラムは両方のライブラリでMyPrefix.ahkという名前のファイルを検索し、存在する場合は読み込まれる
  • これにより、MyPrefix.ahkに、関数MyPrefix_MyFuncと名前がMyPrefix_で始まる他の関連関数の両方が含まれるようになる

  • ローカルライブラリは、ユーザライブラリと標準ライブラリの前に検索される

  • MyFunc()のような直接的な関数呼び出しだけでは、ライブラリを自動インクルードすることができる

  • タイマーやGUIイベントなど、関数が動的にまたは間接的にしか呼び出されない場合は、ライブラリーをスクリプトに明示的に組み込む必要がある

  • ライブラリファイルには通常、ファイル名と同じ名前の関数が1つしか含まれていませんが、プライベート関数とそれによってのみ呼び出されるサブルーチンも含まれている

  • これらの関数はグローバルな名前空間にあるため、別の名前にすべきで、スクリプト内のどこからでも呼び出すことができる

  • ライブラリファイルが#Includeを使用する場合、#Includeの作業ディレクトリはライブラリファイル自身のディレクトリになる

  • これは、その関数とそれに関連する他の関数を含む大きなライブラリファイルへのリダイレクトを作成するために使用できる

  • スクリプトコンパイラ(ahk2exe)は、ライブラリ関数もサポートしている

  • ただし、AutoHotkey.exeのコピーは、コンパイラディレクトリの上のディレクトリに存在する必要がある(通常の状態)
  • AutoHotkey.exeが存在しない場合、コンパイラは引き続き動作しるが、ライブラリ関数は自動的には使用できない

  • ライブラリから取り込まれた関数は、スクリプトの実行が開始される前にプリロードされているため、他の関数と同様に機能する

組み込み関数

  • 組み込み関数のパラメータリストの末尾にある任意のオプションパラメータは、完全に省略することができる
  • たとえば、WinExist("Untitled - 注意pad")は、他の3つのパラメータが空白とみなされるため有効
  • スクリプトが同じ名前の独自の関数を定義している場合、組み込み関数はオーバーライドされる
  • たとえば、標準のスクリプトの代わりに呼び出される独自のカスタムWinExist()関数をスクリプトに含めることができる
  • ただし、スクリプトは元の関数を呼び出す方法はない
  • DLLファイルに存在する外部関数は、DllCall()で呼び出すことができる
  • 下の特定の組み込み関数の詳細については、各リンク先を参照(後日)

組み込み関数一覧

よく使うもの

使い始めでもよく使ってるから実際結構使うんじゃない

関数名 関数の説明
FileExist ファイルまたはフォルダが存在するかを判定してその属性を返す
GetKeyState 指定したキーが下げられている場合はtrue(1)を下げられてない場合はfalse(2)を返す
InStr 指定した文字列が存在するかを右または左から検索
RegExMatch 文字列にパターン(正規表現での指定)が含まれているか判定
RegExReplace 文字列内のパターン(正規表現での指定)を置換する
StrLen 文字列の文字数の取得
StrReplace 指定した文字列を置換する(正規表現でない)
StrSplit 指定した区切り文字を使用して、文字列を分割して、配列にする(配列が返る)
SubStr 文字列の指定した位置の文字を取得
WinActive 指定したウィンドウが存在していて、アクティブなのかを判定し、ID(HWND)を返す
WinExist 指定したウィンドウが存在するかを判定し、ID(HWND)を返す

その他の関数

Dllcallとかは使いそうだけどまだ使ったことないのばかり

関数名 関数の説明
Chr 指定した番号の文字コードに対応する文字列を返す
DllCall 標準のWindows API関数など、DLL内の関数を呼び出す
FileOpen オブジェクト指向のファイルのI/Oが可能
Func 指定された関数への参照を取得
GetKeyName/VK/SC キー名/仮想キーコード/スキャンコードを取得
IsByRef 指定した関数内の変数がByRefかどうかを判定し、そうであれば0以外を返す
IsFunc 指定した関数がスクリプト内に存在するか判定し、そうであれば0以外を返す
IsLabel 指定されたラベルがスクリプト内に存在するか判定し、そうであれば0以外を返す
IsObject 指定された値がオブジェクトかどうか判定し、そうであれば0以外を返す
ListView ListViewの行/列を追加/挿入/変更/削除を行う、またはデータの取得ができる
NumGet 指定されたアドレス+オフセットに格納されているバイナリ値を返す
NumPut 指定されたアドレス+オフセットにバイナリ形式の数値を格納する
OnMessage メッセージ/イベントを監視する
Ord 指定された文字列の最初の文字の文字コード(数値)を返す
StrGet メモリアドレスから文字列をコピーする、必要に応じてコードページ間で変換する
StrPut 文字列をメモリアドレスから文字列にコピーする、必要に応じてコードページ間で変換する
RegisterCallBack 呼び出し時にスクリプト内の関数に呼び出しをリダイレクトとするマシンコードアドレスを作成する
TreeView TreeViewアイテムの追加/挿入/変更/削除を行う、またはデータの取得ができる
Trim 文字列の先頭及び/または末尾の文字を切り除く
VarSetCapacity 変数のメモリの保持容量を拡大する、またはメモリの開放ができる

数学関連

パラメータは基本的に数をとる

関数名 関数の説明
Abs パラメータ(数)の絶対値を返す
Ceil パラメータ(数)を最も近い整数(.00のように小数点以下はつかない)になるように切り上げた数値を返す
Exp e(ネイピア数)を返す
Floor パラメータ(数)を最も近い整数(.00のように小数点以下はつかない)になるように切り捨てた数値を返す
Log パラメータ(数)に対する常用対数(底10)を返す
Ln パラメータ(数)に対する自然対数(底e)を返す(eはネイピア数)
Mod パラメータ(数)を指定した数値での剰余を返す
Round 小数点以下を第四位までになるように丸める
Squrt パラメータ(数)の平方根を返す
Sin/Cos/Tan パラメータ(数)の三角関数のサイン(正弦)/コサイン(余弦)/タンジェント(正接)を返す
ASin/ACos/ATan パラメータ(数)の逆三角関数のアークサイン/アークコサイン/アークタンジェントラジアンで返す

autohotkey2.0勉強中(翻訳)その8-1~関数編その1~

はじめに

翻訳とかあんま得意じゃないんだけど、関数の所らへん自分なりにまとめたやつのその1
というか関数長すぎだしプログラミング学んで浅いから知らない用語とかいろいろでわけわかめ( 一一)
その2はこちら
間違いあったらコメくれれば訂正します。というか自分用だし、間違えて覚えてしまうから(´・ω・`)

参考:ahkwiki日本語版様及び公式ヘルプ

関数編

  • 関数とは、呼び出し元からのパラメータ(入力)を受け入れることができる点を除けば、サブルーチン(Gosub)と似ている
  • さらに、関数は呼び出し元に値を返すこともできる

関数について基本事項

関数の定義方法

関数の定義は、以下のようにする、関数の内容が1行だけでも、「{」「}」は省略できない

ex: 関数名(パラメータリスト){  
関数本体  
}
  • 関数名には、半角英数字と「_」(アンダーバー)などが使用できる
  • 関数名は大文字と小文字は区別されない
  • パラメータリストには、パラメータの名前を「,」で区切って列挙する
  • パラメータを受けとらなくていい場合は、括弧内は空にする、必ず括弧は書かないといけない
  • 関数名と「(」の間には、スペースなどを入れてはいけない
  • 関数本体は、必ず「{」と「}」の行で囲んでブロック化しなければならない
  • 関数内では、パラメータとして与えられた値を変数のように参照することができる
  • 「Return」に続いて記述した式が返り値として呼び出し元に返される
  • 「Return」がない場合、空の文字列が返される
  • 関数の定義は、関数定義の内部以外ならどこに書いてもかまわない
  • スクリプト実行中に、関数定義の行に実行が移った場合、関数定義の終わりまではスキップされ、実行されない
ex: 2つの数値を受け取り、その合計を返す関数Addを定義する例  
Add(x、y)  
{  
 Return x + y "Return"のあとには式が使える  
}

関数の呼び出し

関数を呼び出す一般的な方法は、 := 演算子で変数に関数の結果を代入するように呼び出す
また、戻り値を無視して関数を呼び出すこともできるが、関数が返す値は破棄される

ex: 関数を呼び出して代入する例(↑)と呼び出すだけの例(↓)  
Var := Add(2,3)  ;上の例の関数"Add"を呼び出して、返り値の5がVarに代入される  
Add(2,3)  ;呼び出してるだけ
  • 例外もあるが、パラメータリストと同じ個数のパラメータを入力しなければならない
  • 関数はコマンドのパラメータ内で呼び出すことができる(OutputVarパラメータを除く)
  • 関数呼び出しは式なので、関数のパラメータ内(パラメータリスト)の変数名はパーセント記号で囲まないこと
  • 対照的に、文字列は二重引用符で囲む必要がある
  • ただし、式をサポートしていないパラメータ内で呼び出すには、以下の例のように接頭辞「%」を使用する必要がある
    • また接頭辞「%」は、式をネイティブにサポートするパラメータでも使用できるが、単に無視される
ex: 関数のパラメータに単語(文字列)foxを設定したい場合(↑)と式をサポートしていないパラメータ内で関数を呼びだす例(↓)  
InStr(MyVar, "fox")  
MsgBox % "The answer is: " . Add(3, 2)
  • 関数の中からほかの関数を呼び出すことも可能である
  • 呼び出しの深度の上限は159回で、160回目の呼び出しをしようとするとAutoHotkeyのプログラムが不正終了する

呼び出し元に値を返す

  • 序文で説明したように、関数は呼び出し元に値を返すことができる  
ex: Test := returnTest()  
MsgBox % Test  

returnTest() {  
return 123 ;returnのあとに値(数値、文字列、boolean値)を書くとそれが返る
}  
  • 関数から余分な結果を返す場合は、ByRef(後述)を使用することで可能
ex: returnByRef(A,B,C)  
MsgBox % A "," B "," C  

returnByRef(ByRef val1, ByRef val2, ByRef val3)  
{  
val1 := "A"  
val2 := 100  
val3 := 1  
return  
}
  • オブジェクトと配列を使用すると、複数の値や名前付きの値を返すことができる

ex:

Test1 := returnArray1()  
MsgBox % Test1[1] "," Test1[2]  
  
Test2 := returnArray2()  
MsgBox % Test2[1] "," Test2[2]  
  
Test3 := returnObject()  
MsgBox % Test3.id "," Test3.val  
  
returnArray1() {  
  Test := [123,"ABC"]  
  return Test  
}  
  
returnArray2() {  
  x := 456  
  y := "EFG"  
  return [x, y]  
}  
  
returnObject() {  
  Test := {id: 789, val: "HIJ"}  
  return Test  
}  

関数のパラメータ

  • 関数が定義の時に、パラメータは隣の括弧にリスト化して囲む
  • 名前と括弧の間にスペースは入れてはいけない
  • パラメータを受けとらなくていい場合は、括弧内は空にする、必ず括弧は書かないといけない
ex: パラメータいくつかの例(↑)といらない空の例(↓)  
function(x,y)  
GetCurrentTimestamp( )

ByRefパラメータ(パラメータの参照渡し)

  • ByRefを定義していない限り、パラメータは基本的にローカル変数として扱われる
  • ByRefを使用すると、各パラメータが呼び出し元から渡された変数のエイリアス(違う名前だけど参照は一致)になる
  • つまり、パラメータに値ではなく変数の参照を渡すこと
ex: ByRefにより変数Left,Rightはグローバル変数(それぞれxとy)として扱われ、元のx,yが入れ替わる  
x := 12 , y := 13  
Swap(x,y)  
MsgBox, %x% %y%  

Swap(ByRef Left,ByRef Right){  
    temp := Left  
    Left := Right  
    Right := temp  
}
  • 上記の関数は、呼び出し元の変数を入れ替えるすることができる
  • もし、ByRefが使用されなかった場合、LeftとRightは呼び出し元の変数のコピーであり、このSwap関数は機能しない
  • returnは関数の呼び出し側に1つの値だけを返すことができるため、ByRefを使用したならば余分な結果を返すことができる
    • これは、関数が値を格納する変数(通常は空)に呼び出し元を渡すことによって実現される
    • 何言ってるかよくわかんない、試してみたけど解釈と違う結果になった

Tips

  • 長い文字列を関数に渡すとき、ByRefを用いればその文字列のコピーを作成しなくていいので、パフォーマンスが向上するうえにメモリを節約できる
  • 同様に、ByRefを使って長い文字列を呼び出し側に返すのは、普通にReturnで返すのよりも優れてる
  • 中身が変更可能な変数以外の値がByRefパラメーターに渡された場合、関数はキーワード"ByRef"が存在しないかのように動作する
ex: 下記の例では、A_Indexの値をiに代入するが、スワップ関数が返されると、Leftに割り当てられた値は破棄される  
(一個↑のSwap関数を使用してる)
Swap(A_Index, i)  
  • IsByRef()関数を使用すると、呼び出し元が指定されたByRefパラメータに変数を提供したかどうかを判断できる

既知の制限

  • オブジェクトのプロパティ(foo.barなど)、クリップボードまたはその他の組み込み変数を、参照によって関数に渡すことはできず、代わりに、関数はByRefが省略されたように機能する
  • 関数は自身を再帰的に呼び出すかもしれませんが、独自のローカル変数またはByRef以外のパラメータのいずれかをByRefに渡すと、新しいレイヤのByRefパラメータは、前のレイヤではなくその名前のローカル変数を参照する
    • ただし、関数がグローバル変数、静的変数、またはByRefパラメーターを自身に渡すとき、この問題は発生しない
    • 関数呼び出しのパラメータが変数(たとえば、Varまたは++ VarまたはVar * = 2)に解決された場合、その変数の左または右の他のパラメータは、関数に渡される前にその変数を変更できる
      • たとえば、関数の最初のパラメータがByRefでなくても、Varが最初は0である場合、func(Var、Var ++)は予期せず1と0を渡す
      • この動作は直感的ではないため、将来のリリースで変更される可能性がある
  • ByRefは、COMクライアントが呼び出す関数やCOMメソッドを呼び出すときに直接サポートされていず、代わりに、スクリプトは、VarTypeと値のアドレスを含むラッパー・オブジェクトを受け取るか、渡す必要がある

パラメータのデフォルト値(パラメータのオプション)

  • 関数を定義するとき、そのパラメータの1つ以上をデフォルト値を設定することができまる
  • 下記のように、パラメータリストのパラメータ名の後に「:=」に続いてデフォルト値を記述することで、パラメータを省略した場合にはその値が使われるようにすることが可能である
  • デフォルト値として設定できるのは、数値(定数)と「""」、true、falseのみである
  • 次の関数の「Z」パラメータはオプションパラメータとして認識されている
ex: Add(X、Y、Z := 0){  
Return X + Y + Z  
}
  • 呼び出し元が上記の関数に3つのパラメータを渡すと、Zのデフォルト値は無視されるが、呼び出し側が2つのパラメータだけを渡すと、Zは自動的に値0を受け取る
  • オプションのパラメータをパラメータリストの途中に挿入することはできない
  • 言い換えれば、最初のオプションパラメータの右側にあるすべてのパラメータもデフォルト値を設定する必要がある
  • ただし、以下のように、関数を呼び出すときにパラメータリストの途中から省略可能なパラメータを省略することができる
ex: Func(1、3)    
Func(X、Y:= 2、Z:= 0){  ;この場合、Zはオプションでなければならないことに注意  
MsgBox%X%、%Y%、%Z%  
}
  • ByRefパラメータはデフォルト値もサポートしている
  • たとえば:Func(ByRef p1 = "")
  • 呼び出し元がこのようなパラメータを省略すると、関数はデフォルト値を含むローカル変数を作成する
  • 言い換えれば、関数はキーワード "ByRef"が存在しないかのように振る舞う
  • パラメータメータのデフォルト値は、true、false、リテラル整数、リテラル浮動小数点数、または "fox"や ""などの引用符/リテラル​​文字列のいずれかでなければならない

可変長パラメータ関数(バリアディック関数)

  • 関数を定義するときに、最後のパラメータの後ろにアスタリスクを書いて、可変長変数としてマークし、可変数のパラメータを受け取るようにする
ex: Join(sep, params*) {  
for index,param in params  
  str .= param . sep  
return SubStr(str, 1, -StrLen(sep))  
}  
MsgBox % Join("`n", "one", "two", "three")  
MsgBox%Join( "n"、 "one"、 "two"、 "three")  
  • 可変長パラメータ関数が呼び出されると、関数の最終パラメータに格納されているオブジェクトを介して余剰パラメータにアクセスできる
  • 第1の余剰パラメータはparams [1]にあり、第2の余剰パラメータはparams [2]に、、これは標準オブジェクトであるため、params.Length()を使用してパラメータの数を決定できる

Tips

  • 可変長パラメータはパラメータリストの最後にのみ使用できる
  • RegExコールアウトは可変ではない 可変長パラメータは許容されるがブランクのままになる
  • コールバックは、余剰パラメータを配列ではなくアドレスで渡す

可変長パラメータ関数呼び出し

可変長子パラメータ関数は可変長のパラメータを受け入れることができるが、関数呼び出しに同じ構文を適用することによって、任意の関数にパラメータの配列を渡すことができる

ex: substrings := ["one", "two", "three"]  
MsgBox % Join("`n", substrings*)
Tips
  • ソース配列内のパラメータの番号は1から始まる
  • オプションパラメータは、配列から完全に省略することができる
  • パラメータの配列には、ユーザ定義関数を呼び出すときに名前付き項目を含めることができる
  • それ以外の場合はサポートされない
  • ターゲット関数は、可変長パラメータであってもよく、この場合、名前付き項目は、対応する仮パラメータを持たなくてもコピーされる
  • この構文は、メソッドを呼び出したり、オブジェクトのプロパティを設定または取得したりするときにも使用できる
  • たとえば、Object.Property[Params*]
既知の制限
  • 右端のパラメータのみを可変長パラメータとすることができる
  • たとえば、Func(x, y)は可能だが、Func(x, y)は不可能
  • アスタリスク(*)とパラメータリストを終了するシンボル「)」の間に空白以外の文字を入れてはならない

次→(関数編その2)

autohotkey2.0勉強中(翻訳)その7~繰り返しや分岐編~

はじめに

翻訳とかあんま得意じゃないんだけど、繰り返しと条件分岐の所らへん自分なりにまとめたやつ
間違いあったらコメくれれば訂正します。というか自分用だし、間違えて覚えてしまうから(´・ω・`)

参考:ahkwiki日本語版様及び公式ヘルプ

繰り返しや条件分岐

繰り返し処理

  • Loop文で繰り返し処理が使用できる
    • 繰り返し回数や、対象データは組み込み変数として取得できる
  • Continue、Break文が使用できる
  • whileやforのような終了条件を使った繰り返しは出来ないので、自前でIf文とBreak文で記述する必要がある

その他の繰り返し

  • Loop 指定回数の繰り返し
  • LoopFile ワイルドカードなどにマッチするファイルやフォルダそれぞれに対する処理
  • LoopReg レジストリの指定キー以下のキーに対する処理
  • LoopReadFile ファイルを1行ずつ読みながら処理
  • LoopParse 文字列の1文字ごと、あるいは指定の区切り記号で区切られたフィールドごとに処理

サブルーチン呼び出し、ジャンプ

  • Gosub文でサブルーチン呼び出しが、Gotoでジャンプが使用できる
  • Gosubから戻るには、Return文を使用する
  • Goto文はプログラムの可読性が損なわれるので、あまり推奨されない
  • ジャンプ先のラベルは、「LabelName:」のようなコロンで終わる行で記述される
  • また、ホットキーラベルも指定できる

スレッド割り込み

  • 以下のコマンドでも、ラベルによるサブルーチン指定を行う
  • これらの理由によるサブルーチン呼び出しでは、スレッドの割り込みが行われる
    • SetTimer タイマーで定期的に実行されるサブルーチンを指定
    • Menu カスタムメニューを作成し、選択されたときに実行されるサブルーチンを指定
    • GUI GUIを作成し、ボタンが押されたときなどに実行されるサブルーチンを指定
    • OnExit スクリプトが終了するときに実行されるサブルーチンを指定
    • ホットキー 指定されたホットキーが押されたときに実行されるサブルーチンを指定
    • ホットストリング 特定の文字列をタイプしたときにサブルーチンが実行されるように設定

次→(関数編)