Dartは良い言語です

皆さん、突然なんですが**Dart**を**flutter**専用言語だと思っていませんか？？？
僕も昔はそう思っていました。(ほんとにすいません）
もしかしたら**Ruby**と**Rails**みたいな関係だと思っている人がいるかも知れません。
それは個人的にそれはすごくもったいないと思うので、この記事を見て**Dart**ちょっとおもしろそう！！使ってみよ！ってなることを願ってます！


## そもそもDartとは
> [An approachable, portable, and productive language for high-quality apps on any platform
](https://dart.dev)

とトップページに書いてある通りいろんなプラットフォームでめっちゃ簡単に動かせるのが魅力な言語です。
もともとはJavaScriptを置き換えるためにGoogleが開発した言語です。

>DartとはGoogle社によって2011年に開発されたWebアプリケーション向けのプログラミング言語です。開発された目的はJavaScriptにおける課題を解決するためであり、あらゆるプラットフォームの高速アプリ向けにクライアントに最適化された言語として誕生しました。しかし行き足は思ったようにいかず、開発者のGoogleはDartのあり方をJavaScriptへコンパイルする言語として位置づけ直しました。2018年にはDart2をリリースしており、強力な型システムなどの言語機能の強化が行われております。
[元記事](https://anken-hyouban.com/blog/2021/03/15/dart/)

[Worst Programming Languages to Learn in 2018](https://www.codementor.io/blog/worst-languages-to-learn-3phycr98zk)という記事では一時期学ぶべきではない言語1位にもなっていました...
![](https://process.filestackapi.com/cache=expiry:max/92NHJ6zTLClJg8SNGVQa)
(2019年にFlutterが出てからはビリは抜け出しました)
![](https://process.filestackapi.com/cache=expiry:max/zxbeKtYuToGco7DIqguW)
こんな感じの結構不憫な言語です。


## Dartとの出会い
僕はもともと**Python**を使ってまして(小4くらいで)その時にPythonのインデントに苦しめられまして高2くらい(2024くらいですね)にやっぱりWebやりてえと思って**Progate**でRailsを途中までやりましたが後半がそれなりに難しくて飽きてやめてしまいました。これじゃだめだと思って
[the-web-developer-bootcamp-2021-japan](https://www.udemy.com/course/the-web-developer-bootcamp-2021-japan/)という素晴らしいUdemyの教材を見つけてJSを勉強しました。
そのあとやっぱりRubyが好きだなと思ってRails tutorialを少しやったんですが飽きてしまって...
TechTrainでRailsをやろうと思ってRails tutorialを完全に終わらせました(最後の方めちゃむずかった)
で昔一回触ったけどプログラミングの知識がほぼなくて、しかもAIがなかった時代に触って挫折したFlutterを触ってみようと思って色々調べたときにDartって言語はなんぞや？ってなりました。
でもとりあえずFlutter触ってみて割と使いやすいぞ？？？？
これDartのおかげなんか？と思ってDart単体で使おうとしたのが始まりです。

## Dartのいいところ
- exeファイルにコンパイルできるからRuby,js,Pythonとかのスクリプト言語よりプログラミングしない人でも渡しやすい。
- 静的型付け言語だけどあんまり明示的に書かなくても動く(動的型付けのが得意だったから)
- いい感じに機能が多すぎないし少なすぎない(GoはちょっとCLI書くのには機能が少なすぎる資格コード多すぎる)
- TSの記述が嫌い(なんかダサいし読みづらい)
- 関数の戻り値を宣言時に一番左に書く(めっちゃ見やすくなる)

## Dartで遊んでみよう!!
まずはみんなおなじみHello Worldですね

```dart
void main(){
print("Hello World");
}
```
さきほどメリットで言った関数宣言時に戻り値を左に書くはこういうことです

```dart
void main(){
print(helloWorld());
}

String helloWorld(){
return "Hello World";
}

int numberFunc(int num){
return num ** num;
}
```
ちなみにDartには**演算子がないので標準ライブラリから **pow**関数を呼び出します
```dart
import "dart:math";

void main(){
print(numberFunc(11));
}

num numberFunc(int num){ //* num型(number型)を返す
return pow(num,num); //* pow関数はnum型が返される
}
```
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754495/8eaea252-1f65-3062-490d-5e8fec6aacf4.png)
この画像のようにDartの拡張機能をvscodeに入れとくと返ってくる型が見えるのがめちゃいいです。
個人的にはTypeScriptみたいな言語よりも返ってくる方と受け取る型が見やすいので好きです

### Dartで遊んでみる(finalとconstの違い)
Dartを触ったことがある人なら**final**と**const**の違いが一回は迷ったことあるんじゃないすか？(特にJS触ったことある人なら)
最近やっと完全に理解したので一応書いときます。
#### finalとは
完全にJSでいうconstです。
**実行時に決まる値**です。
#### constとは
じゃあ**const**は何やねんって思ったと思うんですけどね
Dartは**コンパイルできる**言語なんですよ。
だから**常に一定の値である**値しかconstにできません。(ただの数字とか)
若干わからないと思うのでコード例をこれから出します。

#### コード例
まずは動く基本のfinalとconst
```dart
void main(){
final String name = "aqa"; //* これは当然行ける
const String nm = "aqa"; //* これもどんなときでも値が変わらないから行ける
}
```
大丈夫なfinal
```dart
void main(){
final today = DateTime.now(); 
//* jsでいうDate.now()ね　あとfinalとかつけたら型名省略できるよ
}
```
finalは実行時に決まるのでDateTime.now()のような実行時によって変わるものでも大丈夫です。
ですがconstは先程言ったように**常に一定の値である**値しかconstにできません。
なので上のコードをconstに変えるとエラーが出ます。
```dart
void main(){
const today = DateTime.now(); 
}
```
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754495/f22f0bf6-4129-3999-2f80-ab46970f9eb2.png)
のようにエラーが出ます。
これが**const**と**final**の決定的な違いです。

こっから先はCLI作成してみようってコーナーです。
今書いてます