Elixir - ความเข้าใจ

ความเข้าใจในรายการเป็นน้ำตาลเชิงวากยสัมพันธ์สำหรับการวนรอบตัวนับใน Elixir ในบทนี้เราจะใช้ความเข้าใจในการทำซ้ำและการสร้าง

พื้นฐาน

เมื่อเราดูโมดูล Enum ในบทแจงนับเราเจอฟังก์ชันแผนที่

Enum.map(1..3, &(&1 * 2))

ในตัวอย่างนี้เราจะส่งผ่านฟังก์ชันเป็นอาร์กิวเมนต์ที่สอง แต่ละรายการในช่วงจะถูกส่งไปยังฟังก์ชันจากนั้นรายการใหม่จะถูกส่งกลับซึ่งมีค่าใหม่

การทำแผนที่การกรองและการแปลงร่างเป็นการกระทำทั่วไปใน Elixir ดังนั้นจึงมีวิธีที่แตกต่างกันเล็กน้อยในการบรรลุผลลัพธ์เช่นเดียวกับตัวอย่างก่อนหน้านี้ -

for n <- 1..3, do: n * 2

เมื่อเรารันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

[2, 4, 6]

ตัวอย่างที่สองคือความเข้าใจและอย่างที่คุณเห็นมันเป็นเพียงแค่น้ำตาลในการสังเคราะห์สำหรับสิ่งที่คุณสามารถทำได้หากคุณใช้ Enum.mapฟังก์ชัน อย่างไรก็ตามไม่มีประโยชน์ที่แท้จริงในการใช้ความเข้าใจเกี่ยวกับฟังก์ชันจากโมดูล Enum ในแง่ของประสิทธิภาพ

ความเข้าใจไม่ จำกัด เฉพาะรายการ แต่สามารถใช้ได้กับตัวนับทั้งหมด

กรอง

คุณอาจคิดว่าตัวกรองเป็นเครื่องป้องกันความเข้าใจ เมื่อค่าที่กรองกลับมาfalse หรือ nilไม่รวมอยู่ในรายการสุดท้าย ให้เราวนซ้ำช่วงหนึ่งและกังวลเฉพาะเลขคู่ เราจะใช้ไฟล์is_even ฟังก์ชันจากโมดูลจำนวนเต็มเพื่อตรวจสอบว่าค่าเท่ากันหรือไม่

import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)

เมื่อรันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

[2, 4, 6, 8, 10]

เรายังสามารถใช้ตัวกรองหลายตัวในความเข้าใจเดียวกัน เพิ่มตัวกรองอื่นที่คุณต้องการหลังจากis_even ตัวกรองคั่นด้วยลูกน้ำ

: เป็นตัวเลือก

ในตัวอย่างข้างต้นความเข้าใจทั้งหมดจะแสดงรายการเป็นผลลัพธ์ อย่างไรก็ตามผลของความเข้าใจสามารถแทรกลงในโครงสร้างข้อมูลที่แตกต่างกันได้โดยส่งไฟล์:into ตัวเลือกเพื่อความเข้าใจ

ตัวอย่างเช่นก bitstring เครื่องกำเนิดไฟฟ้าสามารถใช้ร่วมกับตัวเลือก: into เพื่อลบช่องว่างทั้งหมดในสตริงได้อย่างง่ายดาย -

IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)

เมื่อรันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

helloworld

โค้ดด้านบนจะลบช่องว่างทั้งหมดออกจากสตริงโดยใช้ c != ?\s กรองจากนั้นใช้ตัวเลือก: into ซึ่งจะทำให้อักขระที่ส่งคืนทั้งหมดอยู่ในสตริง