7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 18

Stringモジュールで遊んでみたシリーズ⑧ -String.split_at ~ String.to_charlist の紹介

Last updated at Posted at 2024-12-14

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

目次

1.Stringモジュールで遊んでみたシリーズ① -String.at ~ String.chunk の紹介
2.Stringモジュールで遊んでみたシリーズ② -String.codepoints ~ String.ends_with? の紹介
3.Stringモジュールで遊んでみたシリーズ③ -String.equivalent? ~ String.last の紹介
4.Stringモジュールで遊んでみたシリーズ④ -String.length ~ String.next_grapheme の紹介
5.Stringモジュールで遊んでみたシリーズ⑤ -String.next_grapheme_size ~ String.printable? の紹介
6.Stringモジュールで遊んでみたシリーズ⑥ -String.replace ~ String.replace_suffix の紹介
7.Stringモジュールで遊んでみたシリーズ⑦ -String.replace_trailing ~ String.split の紹介
8.Stringモジュールで遊んでみたシリーズ⑧ -String.split_at ~ String.to_charlist の紹介(本記事)
9.Stringモジュールで遊んでみたシリーズ⑨ -String.to_existing_atom ~ String.trim の紹介
10.Stringモジュールで遊んでみたシリーズ10 -String.trim_leading ~ String.valid? の紹介

目的

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

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0

String.split_atとは

String.split_at(string, position)は書記素ベースで、stringに対してpositionの位置で分割したタプルを返します。

iex
String.split_at("いろはにほへと", 5)
{"いろはにほ", "へと"}

positionstringの長さより大きい場合。

iex
String.split_at("いろはにほへと", 7)
{"いろはにほへと", ""}

positionが負の数の場合。
stringの末尾からインデックスを数えます

iex
String.split_at("いろはにほへと", -1)
{"いろはにほへ", "と"}

positionが負の数かつstringの長さより大きい場合。

iex
String.split_at("いろはにほへと", -7)
{"", "いろはにほへと"}

String.splitterとは

String.splitter(string, pattern, options \\ [])patternに応じて文字列を分割する列挙型(=enumreable)を返します。
この関数にはString.splitと異なり正規表現のサポートがありません。

正規表現のサポートについては、String.splitもご参照ください↓

カンマを区切り文字として部分文字列に分割。
分割されたうち先頭の4要素だけを返します。

iex
String.splitter("1,2,3,4,5,6,7,8,9", ",") |> Enum.take(4)
["1", "2", "3", "4"]

半角スペースおよびカンマを区切り文字として部分文字列に分割。
分割されたうち先頭の4要素だけを返します。

iex
String.splitter("1,2 3,4 5,6 7,8,...,99999", [" ", ","]) |> Enum.take(4)
["1", "2", "3", "4"]
iex
String.splitter("1,2,3,4,5,6,7,8,9", ",") |> Enum.take(4)
["1", "2", "3", "4"]

String.starts_with?とは

String.starts_with?(string, prefix)stringprefixで始まるか否かをチェックします。

iex
String.starts_with?("いろはにほへと", "いろ")
true

prefixを複数指定する場合。
stringがリスト内のいずれかのprefixで始まればtrueを返します。

iex
String.starts_with?("いろはにほへと", ["い","ろ"])
true

prefix = ""の場合。
常にtrueを返します。

iex
String.starts_with?("いろはにほへと", "")
true

prefix = []の場合。
常にfalseを返します。

iex
String.starts_with?("いろはにほへと", [])
false

String.to_atomとは

String.to_atom(string)stringをatomに変換します。

この関数はアトムを動的に作成します。
アトムは自身の名前が値になるもので、ガベージコレクションされません。
したがってstringにソケットから受信した入力やWebリクエスト中の入力など信頼できない値を渡してはいけません。

※もし動的な値をstringに渡してしまうと、名前と値の異なるアトムが大量に作られてErlang VMのアトムの許容範囲外に出てしまうリスクがあると理解しています1

iex
String.to_atom("my_atom")
:my_atom

String.to_charlistとは

String.to_charlist(string)stringを文字リストに変換します。

iex
String.to_charlist("いろはにほへと")

※下記12356はUnicodeのコードポイントU+3044の10進数表記です

[12356, 12429, 12399, 12395, 12411, 12408, 12392]
iex
String.to_charlist("foo")
~c"foo"

補足1

~cは文字列リストを指すシギルです2

補足2

具体的には、この関数は UTF-8 でエンコードされたバイナリを受け取り、そのコードポイントのリストを返します。

下記のRaw representation部分から、整数コードポイントのリストを返していることが確認できます

iex
i ~c"foo"
Term
  ~c"foo"
Data type
  List
Description
  This is a list of integers that is printed using the `~c` sigil syntax,
  defined by the `Kernel.sigil_c/2` macro, because all the integers in it
  represent printable ASCII characters. Conventionally, a list of Unicode
  code points is known as a charlist and a list of ASCII characters is a
  subset of it.
Raw representation
  [102, 111, 111]
Reference modules
  List
Implemented protocols
  Collectable, Enumerable, IEx.Info, Inspect, List.Chars, String.Chars

~Elixirの国のご案内~

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

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

We Are The Alchemists, my friends!:bouquet:3
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。4

  1. https://www.erlang.org/doc/system/memory.html#system-limits

  2. https://hexdocs.pm/elixir/sigils.html

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

  4. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?