Help us understand the problem. What is going on with this article?

Elixir(iex)の出力で文字リストと出会った

More than 1 year has passed since last update.

iexでelixirの関数とか実行して遊んでいた時の話。

出力でIO.puts使っていたのですが、いちいち書くのも面倒だし、
返り値(という表現であっているか?)が実行文の下に表示されるんで、
必要な時以外は書いていなかった。

ある日、

iex(96)> values = [hoge: 1, fuga: 3]
[hoge: 1, fuga: 3]

iex(97)> for {:hoge, n} <- values, do: n * n 
[1]

配列を定義して、forでループさせるって処理を書いていました。
ここまでは普通だけど、

iex(98)> for {:fuga, n} <- values, do: n * n
'\t'

[9]が表示されて欲しかったんですが、なんか、こんな表示になった。

ナニコレ、、、?

色々調べた結果「\t」の10進数ASCIIコードが「9」だった。
つまり、数値がASCIIコードとして認識されて表示されてることがわかった。
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html

なんでなん、、、?と思って調べたところ、
https://elixirschool.com/ja/lessons/basics/strings/#%E6%96%87%E5%AD%97%E3%83%AA%E3%82%B9%E3%83%88
こんな記述があった。

Elixir の文字列はダブルクオートで生成され、一方文字リストはシングルクオートで生成されます。
内部では Elixir の文字列は文字の配列というよりはバイトのシーケンスとして表現されており、
Elixirは(複数の文字のリストである)文字リストという型を別に持っています。
Elixir の文字列はダブルクオートで生成され、一方文字リストはシングルクオートで生成されます。
これらの違いは何でしょう?

文字リストから得られる個々の値はバイナリで表現されているコードポイントで、 UTF-8 でエンコードされています。

つまり、[9]はintの配列ではなく、9というコードポイントの文字リストとして認識されていたようです。
確かに出力されてる文字(\t)がシングルクォートで括られていますね。
単に数字の9だけじゃなくて、forで返り値を配列にしてしまったがために発生していた感じです。

IO.putsとかto_stringするとちゃんと文字列として出力もされますね。

iex(4)> values = [hoge: 1, fuga: 3]
[hoge: 1, fuga: 3]
iex(5)> for {:fuga, n} <- values, do: to_string n * n
["9"]
iex(6)> for {:fuga, n} <- values, do: IO.puts n * n  
9
[:ok]

注意、、、するほどでもないし特に支障ない事象だとは思うんですが、
不思議だったので書き記しておきます!

それにしても、自分がそういうシチュエーションに出会ってないだけカモですが、
文字リストって実際の業務アプリケーション作る時とかって使用することあるんだろうか?

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away