🐙
【Dart3】type_literal_in_constant_patternのすすめ
はじめに
皆さんDart3には慣れましたか?僕はあまり使いこなせていないです😇
今回はDart3使う時type_literal_in_constant_patternってLintルールを有効にしないと罠だな〜と思ったので共有します。
本編
自分が罠と感じた部分について触れていきます。
変数のTypeでパターンマッチするシンプルな書き方
Object?型の変数xのTypeでパターンマッチするとき、シンプルな書き方としては以下のようなものがあります。
if文の場合(Variable patterns + Wildcard patterns)
void f(Object? x) {
if (x case num _) {
print('int or double');
}
}
```text
```dart:if文の場合(Object patterns)
void f2(Object? x) {
if (x case num()) {
print('int or double');
}
}
```text
```dart:switch文の場合(Variable patterns + Wildcard patterns)
void f3(Object? x) {
switch (x) {
case num _:
print('int or double');
}
}
```text
```dart:switch文の場合(Object patterns)
void f4(Object? x) {
switch (x) {
case num():
print('int or double');
}
}
```text
Variable patterns、Wildcard patternsなどについては以下参照
<https://dart.dev/language/pattern-types>
## 更にシンプルにしたい
どうせコードを書くならシンプルにしたいですよね。そこで先程のケースを以下のようにしてみたくなる人もいると思います。
```dart:if文の場合(???)
void f5(Object? x) {
if (x case num) {
print('int or double');
}
}
```text
```dart:switch文の場合(???)
void f6(Object? x) {
switch (x) {
case num:
print('int or double');
}
}
```text
f5とf6の書き方は一見さらにシンプルになって良さそうに見えますが、f1〜f4のころとは意味が変わってしまいます。実際に実行するとprintを通らない様になっているかと思います。
### 何が違うのか
f1〜f4は変数xのTypeがnumかをパターンマッチしているのに対し、f5,f6は変数xがnumかをパターンマッチしています。
以下の様な感じです。
```dart
void main() {
const x = 1;
const x2 = num;
// printされる
f(x);
// printされない
f(x2);
// printされない
f5(x);
// printされる
f5(x2);
}
```text
## 対策方法
Dart3から追加された[type_literal_in_constant_pattern]というルールを有効にするとf5, f6の書き方をした際に警告がでるようになります。
更にquick fixでVariable patterns + Wildcard patternsに修正されるようになります。
この[type_literal_in_constant_pattern]ですが、flutter createしたときにデフォルトで設定される[flutter_lints]のルールには含まれていません。
### 具体的な対策方法1:ルールを追加する
analysis_options.yamlに[type_literal_in_constant_pattern]を追加することで対策できます
```yaml:analysis_options.yaml
linter:
rules:
- type_literal_in_constant_pattern
```text
### 具体的な対策方法2:他のパッケージを使う
Flutter推奨の[flutter_lints]以外のパッケージを使うことも考えられます。例えば[pedantic_mono](https://pub.dev/packages/pedantic_mono)だと[type_literal_in_constant_pattern]がはじめから有効です。
## 変数xがnum Typeかをパターンマッチしたい場合は?
[type_literal_in_constant_pattern]を有効にすると変数xがnumかパターンマッチしたくてf5, f6の書き方をしてもquick fixで修正されてしまいます。
その場合は以下のように書きます。こうすれば警告がでません。
```dart
void f7(Object? x) {
if (x case const (num)) {
print('int or double');
}
}
void f8(Object? x) {
switch (x) {
case const (num):
print('int or double');
}
}
まとめ
type_literal_in_constant_patternのすすめでした👍
GitHubで編集を提案
Discussion