はじめに
最近、あじ太郎は人のプログラムやQiitaの記事を見ていて、いくつか発見があったので、共有してみたいと思いました。
発見その1:for-else構文(Python)
for-else構文を使うと、以下のような書き方ができてしまう!
たぶん、Pythonの人にとったら当然なのでしょうけど、他の言語でも使いたいな。。
for i in hoge:
# 繰り返し処理
else:
# イテレータのすべての要素が処理されたあと、 else 節がもしあれば実行され、ループ処理が終了します。
for-else構文は、@nonakayasuo さんの記事を見ていて知りました。
https://qiita.com/nonakayasuo/items/ced6d1c882736bf64e63
そして、この記事を書いていて、ショックなことがあって、、
実は、あじ太郎の主戦場 PHP というか Laravel に
@forelse
ディレクティブがあることを今回知りました。。
(ちなみに Pythonの for-else と似ているけどちょっと違うと思います)
発見その2:デコレータ(TypeScript)
今年になって取り組み始めたプロダクトは NestJS を使っていて、それでTypeScriptのデコレータを知りました。
以下の例で説明します。
@Controller('prefix')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('hoge')
getHello(): string {
return this.appService.getHello();
}
}
この例は NestJS でプロジェクトを新規作成して、少しだけ変更したものです。
@Controller('prefix')
と @Get('hoge')
がデコレータなのですが、詳細な意味を知らなくてもバックエンドのプログラムしている人なら、ある程度想像できますね。
@Controller()
で AppController をコントローラーにして
@Get()
で getHello()を GETメソッドのハンドラにしていることがわかります。
なお、@Controller()
と @Get()
の引数は、URLのパスになります。
※この例の場合
'/' + 'prefix' + '/' + 'hoge'
↓
https://~~~/prefix/hoge でアクセスできる。
適切に使うとプログラムがわかりやすくなりそう。
※NestJS の hello world を試して、Github にアップしました。
興味があれば覗いてみていただければ。(本当に単なる hello world ですけど)
https://github.com/aji-taro/nestjs-hello
番外編:名前付き引数
最近の話ではないので番外編ということで。
今では様々な言語で当たり前の名前付き引数ですが、あじ太郎が最初にそれっぽいものを見たのは、一昔かそこら前 Objective-C のときだったかなと。
(厳密に言うと Objective-C のは名前付き引数とは違うと思うのですが、、)
以下、Wikipedia に掲載されている Objective-C の例です。
// 単項メッセージ
[receiver msg];
// 引数付きメッセージ。この場合「msg:with:」でセレクタ一つ
val = [receiver msg: arg1 with: arg2];
出典:https://ja.wikipedia.org/wiki/Objective-C
上記の例にあるようにラベル(msg: や with:)を指定できます。
それにしても、久しぶりに Objective-C を見ましたが、やっぱり独特。。
当時、メソッドをオーバーロードしたいときは
andAaa: aaa andBbb: bbb andCcc: ccc … みたいにめっちゃ繋げてました。
どの言語が一番最初に名前付き引数をサポートしたか知りたくて AI に聞いてみたのですが、知らない言語が回答され、それが本当か確認できなかったので言及は止めておきましょう。
取り組んでみて
そのうち、こういった機能をいいとこどりしたプログラミング言語とか出てくるのかな?と想像したあじ太郎なのでした。