Tidak ada cara langsung untuk mendapatkan jenis variabel di Elixir / Erlang.
Anda biasanya ingin mengetahui jenis variabel untuk bertindak sesuai; Anda bisa menggunakan is_*
fungsi untuk bertindak berdasarkan tipe variabel.
Learn You Some Erlang memiliki bab yang bagus tentang mengetik di Erlang (dan karenanya dalam Elixir).
Cara paling idiomatis untuk menggunakan is_*
keluarga fungsi mungkin adalah menggunakannya dalam pencocokan pola:
def my_fun(arg) when is_map(arg), do: ...
def my_fun(arg) when is_list(arg), do: ...
def my_fun(arg) when is_integer(arg), do: ...
# ...and so on
apa yang kamu sembunyikan
sumber
typeof(variable)
?foo = [1, "hello", [1, 2, 3]]
, dengan kodeEnum.map(foo, fn(x) -> IO.puts x end)
karena [1,2, 3] akan dibaca sebagai karakter (mengapa erlang !!?), Dan akan menunjukkan kepada Anda banyak wajah tersenyum (coba saja!). jadi kita dipaksa untuk menggunakan inspeksi meskipun inspeksi hanya diperlukan jika itu daftar, jika tidak, sebagian besar waktu kita tidak membutuhkannya. typeof memungkinkan kita mengubah jika pernyataan (O (n)) menjadi pencarian kamus (O (1)).Printable
protokol Anda sendiri yang membungkus dan mengubah perilaku pencetakan misalnya daftar bilangan bulat. Pastikan Anda tidak menggunakannya dengan kode Erlang — atau Anda akan menggaruk-garuk kepala bertanya-tanya mengapa bukannya pesan yang Anda lihat daftar bilangan bulat.Mulai di elixir 1.2 ada
i
perintah dalam iex yang akan mencantumkan jenis dan lebih dari variabel Elixir.Jika Anda melihat dalam kode untuk
i
perintah Anda akan melihat bahwa ini diimplementasikan melalui Protokol.https://github.com/elixir-lang/elixir/blob/master/lib/iex/lib/iex/info.ex
Jika Anda ingin mengimplementasikan fungsi untuk tipe data apa pun di Elixir, cara untuk melakukannya adalah dengan mendefinisikan Protokol dan implementasi Protokol untuk semua tipe data yang Anda inginkan fungsi berfungsi. Sayangnya, Anda tidak dapat menggunakan fungsi Protokol dalam penjaga. Namun, protokol "tipe" sederhana akan sangat mudah diimplementasikan.
sumber
undefined function i/1
- sama untuk info / 1&i/1
adalah fungsi aktifIEx.Helpers
. Jika Anda memasukkan&IEx.Helpers.i/1
Elixir vanilla Anda ke dalamnya, Anda akan menghasilkanCompileError
kecuali Anda telah dimasukkan:iex
sebagai aplikasi dimix.exs
.Juga untuk tujuan debugging, jika Anda tidak di iex, Anda dapat memanggilnya langsung:
sumber
Pendekatan lain adalah menggunakan pencocokan pola. Katakanlah Anda menggunakan Timex, yang menggunakan
%DateTime{}
struct, dan Anda ingin melihat apakah suatu elemen adalah satu. Anda dapat menemukan kecocokan menggunakan pencocokan pola dalam metode ini.sumber
switch
/case
.Saya hanya akan meninggalkan ini di sini demi seseorang semoga mencari tahu versi yang benar-benar waras. Saat ini tidak ada jawaban yang baik untuk ini di google ...
Demi kelengkapan, uji kasus:
Inilah solusi dengan protokol; Saya tidak yakin apakah mereka lebih cepat (saya yakin berharap mereka tidak melakukan loop atas semua jenis), tetapi itu cukup jelek (dan rapuh; jika mereka menambah atau menghapus tipe dasar atau mengganti nama, itu akan merusaknya).
sumber
Saya hanya menempelkan kode dari https://elixirforum.com/t/just-created-a-typeof-module/2583/5 :)
sumber
Saya menemukan situasi perlu memeriksa parameter perlu jenis tertentu. Mungkin bisa aktif dengan cara yang lebih baik.
Seperti ini:
Pemakaian:
sumber
Hanya karena tidak ada yang menyebutkannya
IO.inspect/1
Output untuk menghibur objek ... hampir sama dengan JSON.stringify
Sangat membantu ketika Anda tidak bisa seumur hidup mencari tahu seperti apa suatu benda dalam sebuah tes.
sumber