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 ซึ่งจะทำให้อักขระที่ส่งคืนทั้งหมดอยู่ในสตริง