GNOME 3.26 の目玉、gjs が ES6 フル対応になった。
これでで class が使えるぞ、Lang.Class の奇妙なコードとはおさらばじゃ。
んと、その前に。
#!/usr/bin/gjs // 'gjs a.js 苗ちゃん' const GLib = imports.gi.GLib; for (let val of ARGV) { print(val); //let s = decodeURIComponent(escape(val)); //print(s); }
変わっていないや、まあいいか。
ClutterImage のセットが激遅なのもそのまんまだね。
ClutterImage PyGObject/Gjs | PaePoi
それはそれとして新機能だ。
GtkWindow を作ってみよう、やっぱり GUI だよね。
#!/usr/bin/gjs imports.gi.versions.Gtk = "3.0"; const Gtk = imports.gi.Gtk; class Test extends Gtk.Window { constructor() { super(); this.connect("hide", ()=> { Gtk.main_quit(); }); this.show_all(); } } Gtk.init(null); let test = new Test(); Gtk.main();
これでウインドウを作るだけの最小限コードのようだ。
imports は PyGObject と同様にバージョン指定が無いと警告が出るようになった。
アロー関数を使えば Lang.bind を使わずにあの this の糞仕様を回避できる。
他の説明はいらないよね。
次はコード分割してみよう。
#!/usr/bin/gjs imports.gi.versions.Gtk = "3.0"; imports.searchPath.unshift('.'); const Gtk = imports.gi.Gtk; const Btn = imports.btn; class Test extends Gtk.Window { constructor() { super(); this.connect("hide", ()=> { Gtk.main_quit(); }); this.btn = new Btn.Btn("睦ちゃん"); this.add(this.btn); this.show_all(); } } Gtk.init(null); let test = new Test(); Gtk.main();
と
var Gtk = imports.gi.Gtk; class Btn extends Gtk.Button { constructor(lb) { super({ label: lb }); } }
で
えーーーーー
let も const も定義していないお!
Java と違って同一ソースに複数の class が書けるのでこうすればいいけど。
#!/usr/bin/gjs imports.gi.versions.Gtk = "3.0"; const Gtk = imports.gi.Gtk; class Test extends Gtk.Window { constructor() { super(); this.connect("hide", ()=> { Gtk.main_quit(); }); this.btn = new Btn("睦ちゃん"); this.add(this.btn); this.show_all(); } } class Btn extends Gtk.Button { constructor(lb) { super({ label: lb }); } } Gtk.init(null); let test = new Test(); Gtk.main();
コードが長くなると…
モジュールとして継承 class は作ってはいけないってことかな?
まだ試したばかりだし他の方法はあるかもしれないけど。
なんか一気にテンションが下がった、PyGObject に戻るかなぁ。。。