2019年9月4日水曜日

ラムダ式について


cにはないと思うが、++にはあるみたい、ただし新しそう
最近の言語には取り入れられている概念なのかな

関数のポインタを引数付きで渡す感じだと思う
この場合は無名のままだけど名前をつけることもできる
関数定義が面倒な場合に気軽に使える

Qtでスロットに設定する関数に引数をつけたいときに使った
①button.clicked.connect(self.hoge)
②button.clicked.connect(self.hoge(str))
③button.clicked.connect( ( lambda : self.hoge(str) ) )
①はイケるが②は文法的にはじかれる
この場合に③のように書く
Qtではこの方法の他にmapという手法があるが、非推奨でlambdaが推奨らしい

①の()の中は関数ポインタになってると思う
②は引数を与えてしまってるから関数が実行され戻り値になってしまい型が合わなくなる
③だとラムダ関数へのポインタになる、関数は実行されない

自分で書いておきながらだけどわかりづらいな
ラムダはやはり難しい

add = lambda a, b : a + b
print( add(2, 3) )
こういう使い方は理解が優しいと思う。単純に関数addを定義していると思えば良い
この場合の1行目はaddだがこれが関数ポインタなんだな
addはポインタ、add(*,*) だと関数の戻り値

そもそもポインタとはなんぞやって話になるとcでイロイロ書いてエラーが出るのをみながら半分体で覚えていくしかないと思う
ポインタの解説はちょっと検索すればものすごい数が出てくるけど、ポインタをわからない人が解説を読んでわかるようになる可能性はゼロに近いんじゃないか?

一つ未だに謎がある
Qtでスロットに設定する関数だが、デザイナーが吐いたモノをみると[]で引数を与えていると思われる書き方があるが何??

調べたら引数そのものでは無くて引数の型を明示するって事だった
self.button1.clicked.connect(self.with_optional)
self.button2.clicked[bool].connect(self.with_optional)

0 件のコメント:

コメントを投稿