Stringモジュールで遊んでみたシリーズ③ -String.equivalent? ~ String.last の紹介

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はStringモジュールについて学んだことをまとめます。

# 目次
1.[Stringモジュールで遊んでみたシリーズ① -String.at ~ String.chunk の紹介](https://qiita.com/Alicesky2127/items/47fffc38711d7369beee)
2.[Stringモジュールで遊んでみたシリーズ② -String.codepoints ~ String.ends_with? の紹介](https://qiita.com/Alicesky2127/items/5db34c69993d35b8f3a7)
3.Stringモジュールで遊んでみたシリーズ③ -String.equivalent? ~ String.last の紹介(本記事)
4.[Stringモジュールで遊んでみたシリーズ④ -String.length ~ String.next_grapheme の紹介](https://qiita.com/Alicesky2127/items/e3fa2092a67cb9f6ec9c)
5.[Stringモジュールで遊んでみたシリーズ⑤ -String.next_grapheme_size ~ String.printable? の紹介](https://qiita.com/Alicesky2127/items/a315148e966c9f103a7c)
6.[Stringモジュールで遊んでみたシリーズ⑥ -String.replace ~ String.replace_suffix の紹介](https://qiita.com/Alicesky2127/items/94a77afe270587ed21a9)
7.[Stringモジュールで遊んでみたシリーズ⑦ -String.replace_trailing ~ String.split の紹介](https://qiita.com/Alicesky2127/items/1a8e9c92fa758d0b1337)
8.[Stringモジュールで遊んでみたシリーズ⑧ -String.split_at ~ String.to_charlist の紹介](https://qiita.com/Alicesky2127/items/40e74cd622653796df5c)
9.[Stringモジュールで遊んでみたシリーズ⑨ -String.to_existing_atom ~ String.trim の紹介](https://qiita.com/Alicesky2127/items/9bf2b1effc3b68819ac2)
10.[Stringモジュールで遊んでみたシリーズ10 -String.trim_leading ~ String.valid? の紹介](https://qiita.com/Alicesky2127/items/b8310a3f5fc5b040ca78)



# 目的 
Stringモジュールに含まれる関数を触って機能を理解したい

https://hexdocs.pm/elixir/String.html

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0


# String.equivalent?とは
`String.equivalent?(string1, string2)`は`string1`と`string2`が正規化形式で同じか否かをチェックします。
この関数は下記のパターンマッチと同じです。[^1]
```diff_elixir:iex
String.normalize(string1, :nfd) == String.normalize(string2, :nfd)
```
この関数の目的は、目検では異なって見える2つの文字列について正規化形式で同じか否を比較することだと理解しています。

## 例
```diff_elixir:iex
String.equivalent?("abc", "abc")
```
```
true
```

合成文字ありの場合
　・ñはunicodeの`u\00f1`です。合成文字です。
　・`\u0303`はunicodeの` ̃  `(ダイアクリティカルマーク)です。
```diff_elixir:iex
String.equivalent?("n\u0303", "ñ")
```
```
true
```

```diff_elixir:iex
String.equivalent?("man\u0303ana", "mañana")
```
```
true
```

# String.firstとは
`String.first(string)`は`string`の先頭の文字を返します。
## 例
```diff_elixir:iex
String.first("elixir")
```
```
"e"
```

# String.graphemesとは
下記をご参照ください

https://qiita.com/Alicesky2127/items/8dcb4612dd3f6ba6f59b#stringgraphemes1%E3%81%AF%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E6%96%87%E5%AD%97%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%8D%E8%AD%98%E3%81%99%E3%82%8B%E5%8D%98%E4%BD%8D%E3%81%94%E3%81%A8%E3%81%AB%E5%88%86%E5%89%B2



# String.jaro_distanceとは
`String.jaro_distance(string1, string2)`は2つの文字列間の類似度を計算します。
string1 と string2の類似度を表す0から1までの浮動小数点値(jaro distanceと呼ばれる値)を返します。
この関数の目的は、2つの文字列をマッチングし、typoを検出し「もしかして？」のサジェスト機能を提供することです。

## 例
```diff_elixir:iex
String.jaro_distance("田中一郎", "田仲一郎")
```
```
0.8333333333333334
```

```diff_elixir:iex
String.jaro_distance("String.last", "String.rast")
```
```
0.9393939393939394
```

# String.lastとは
`String.first(string)`は`string`の末尾の文字を返します。
## 例
```diff_elixir:iex
String.last("elixir")
```
```
"r"
```



# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

[^1]: nfdとは Normalization Form D: Canonical Decomposition の略記。合成文字を分解するという正規化形式の方法の一つです。


[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！