Lihat Bagian Pembaruan untuk pertanyaan yang diperbarui

Butuh bantuan untuk memahami apa ini di Elixir.

Apakah ini objek/peta seperti di JavaScript atau Python atau fungsi?

config :some_api,
  something: %{
    "user" => "xxx",
    "name" => "xxx"
  }

config :someStr, Some.Module.Repo, parameters: [somestring: "${USER}-some-str"]

MEMPERBARUI

Saya mencari melalui dokumen Elixir dan tidak dapat benar-benar menemukan referensi ke sintaks ini.

1)

def myFunc() do
[
 {Some.Module, someParam: 1},
 {SomeDef, [someParam: someData]}
]

Saya menduga ketika fungsi ini dipanggil, ia melakukan semua yang ada dalam daftar secara berurutan?

2)

def someFunc() do
 |>someFunc()
 ~> someModule.func()

Apa yang dilakukan panah berlekuk?

0
hnhl 1 Desember 2020, 21:22

3 jawaban

Jawaban Terbaik

Elixir adalah salah satu bahasa yang dapat menghilangkan tanda kurung (seperti Ruby), jadi terkadang saat Anda membaca kode, Anda mungkin tidak menyadari bahwa Anda sedang melihat fungsi dengan argumen. config adalah salah satu dari kasus tersebut. Secara khusus, Anda sedang melihat Config.config/2 dan Config.config/3.

Pernyataan config pertama:

config :some_api,
  something: %{
    "user" => "xxx",
    "name" => "xxx"
  }

Sebenarnya dapat ditulis ulang sebagai:

config(:some_api, something: %{"user" => "xxx", "name" => "xxx"})

Argumen kedua adalah untuk opsi, yang merupakan konvensi umum di Elixir, mirip dengan argumen kata kunci di Python. Seperti fungsi dengan tanda kurung opsional, daftar kata kunci di Elixir memiliki tanda kurung opsional, sehingga argumen ke-2 dapat ditulis sebagai [something: %{"user" => "xxx", "name" => "xxx"}], atau untuk membuatnya lebih panjang, Anda dapat menulis [{:something, %{"user" => "xxx", "name" => "xxx"}}]. -- sintaks yang lebih bertele-tele dapat sedikit merepotkan, jadi Anda dapat melihat mengapa sering disingkat.

Anda dapat melihat peta (yang setara dengan Elixir dari kamus Python atau hash Ruby): %{"user" => "xxx", "name" => "xxx"} -- triknya di sini adalah ketika kuncinya berupa string, mereka harus dikutip DAN Anda harus menggunakan panah gemuk =>. Jika kuncinya adalah atom, Anda dapat menggunakan sintaks yang disingkat: %{user: "xxx", name: "xxx"}

Contoh konfigurasi kedua menggunakan config/3, jadi ini:

config :someStr, Some.Module.Repo, parameters: [somestring: "${USER}-some-str"]

Dapat ditulis ulang dengan tanda kurung sebagai:

config(:someStr, Some.Module.Repo, [parameters: [somestring: "${USER}-some-str"]])

Lagi, argumen terakhir sering digunakan untuk argumen opsional (dinamai opts oleh konvensi), dan seperti sebelumnya, ini adalah daftar kata kunci yang sering menghilangkan tanda kurung opsional.

Mudah-mudahan itu menghilangkan kebingungan; ada beberapa gotcha dengan sintaks, tetapi tidak terlalu banyak sebelum semuanya mulai masuk akal.

0
Everett 1 Desember 2020, 21:14

Elixir memiliki apa yang disebut daftar kata kunci, yang merupakan daftar tupel 2 elemen tempat elemen pertama , kuncinya, adalah atom.

Saya cenderung menganggap daftar kata kunci sebagai peta dengan 3 perbedaan:

  • kunci harus atom
  • kunci duplikat diperbolehkan
  • ketertiban dipertahankan

Peta juga akan menawarkan pencarian yang lebih cepat ketika berhadapan dengan koleksi yang lebih besar, tetapi saya tidak tahu apakah saya pernah melihat daftar kata kunci yang cukup besar untuk membuat peta lebih efisien.

Elixir juga memiliki sintaks di mana [key: value] mewakili [{:key, :value}] dan juga memungkinkan menghilangkan tanda kurung dalam beberapa situasi.

Jadi contoh pertama Anda sama dengan

config :some_api, [{:something, %{"user" => "xxx", "name" => "xxx"}}]

Anda paling sering melihat penghilangan braket dengan opsi untuk fungsi. Seperti ini:

IO.inspect(term, label: "some label")
0
Brett Beatty 1 Desember 2020, 20:48

memiliki dokumentasi yang bagus. Jadi ketika Anda menemukan hal yang sama, Anda dapat membuka sesi iex dan menanyakan keraguan Anda di sana.

❯ iex -S mix
Erlang/OTP 23 [erts-11.1.3] [...]
Interactive Elixir (1.11.2) [...]

iex|1 ▶ import Mix.Config
#⇒ Mix.Config

iex|2 ▶ h config

# a ton of information

Catatan: Saya secara membabi buta memanggil import Mix.Config untuk sepenuhnya mereplikasi env yang Anda miliki di file Anda.

0
Aleksei Matiushkin 2 Desember 2020, 06:22