ด้วยพื้นหลังจากภาษา Python / Java / Golang importเทียบกับuseฉันก็สับสนเช่นกัน สิ่งนี้จะอธิบายกลไกการใช้โค้ดซ้ำพร้อมตัวอย่างภาษาที่เปิดเผย
นำเข้า
กล่าวโดยย่อใน Elixir คุณไม่จำเป็นต้องนำเข้าโมดูล ฟังก์ชันสาธารณะทั้งหมดสามารถเข้าถึงได้โดยไวยากรณ์ MODULE ที่มีคุณสมบัติครบถ้วนฟังก์ชัน FUNCTION:
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
ใน Python / Java / Golang คุณต้องทำimport MODULEก่อนจึงจะสามารถใช้ฟังก์ชันใน MODULE นั้นได้เช่น Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
แล้วสิ่งที่importอาจทำให้คุณประหลาดใจใน Elixir:
เราใช้การนำเข้าเมื่อใดก็ตามที่เราต้องการเข้าถึงฟังก์ชันหรือมาโครจากโมดูลอื่น ๆ ได้อย่างง่ายดายโดยไม่ต้องใช้ชื่อที่มีคุณสมบัติครบถ้วน
https://elixir-lang.org/getting-started/alias-require-and-import.html#import
ดังนั้นหากคุณต้องการที่จะพิมพ์sqrtแทนInteger.sqrt, trimแทนString.trim, importจะช่วยให้
iex()> import Integer
Integer
iex()> sqrt(100)
10.0
iex()> import String
String
iex()> trim(" Hello Elixir ")
"Hello Elixir"
สิ่งนี้อาจทำให้เกิดปัญหาในการอ่านโค้ดและเมื่อชื่อขัดแย้งกันจึงไม่แนะนำให้ใช้ใน Erlang (ภาษาที่มีผลต่อ Elixir) แต่ไม่มีข้อตกลงดังกล่าวใน Elixir คุณสามารถใช้มันโดยเสี่ยงเอง
ใน Python เอฟเฟกต์เดียวกันสามารถทำได้โดย:
from math import *
และขอแนะนำให้ใช้เฉพาะในสถานการณ์พิเศษ / โหมดโต้ตอบ - สำหรับการพิมพ์ที่สั้นลง / เร็วขึ้น
ใช้และต้องการ
สิ่งที่ทำให้use/ requireแตกต่างคือมันเกี่ยวข้องกับ "มาโคร" - แนวคิดที่ไม่มีอยู่ในตระกูล Python / Java / Golang ...
คุณไม่จำเป็นต้องimportใช้โมดูลเพื่อใช้ฟังก์ชันต่างๆ แต่คุณต้องrequireใช้โมดูลเพื่อใช้มาโคร :
iex()> Integer.mod(5, 3) # mod is a function
2
iex()> Integer.is_even(42)
** (CompileError) iex:3: you must require Integer before invoking the macro Integer.is_even/1
(elixir) src/elixir_dispatch.erl:97: :elixir_dispatch.dispatch_require/6
iex()> require Integer
Integer
iex()> Integer.is_even(42) # is_even is a macro
true
แม้ว่าจะis_evenสามารถเขียนเป็นฟังก์ชันปกติได้ แต่ก็เป็นมาโครเนื่องจาก:
ใน Elixir Integer.is_odd / 1 ถูกกำหนดเป็นมาโครเพื่อให้สามารถใช้เป็นตัวป้องกันได้
https://elixir-lang.org/getting-started/alias-require-and-import.html#require
useเพื่อตัดตอนมาจากเอกสาร Elixir:
การใช้งานต้องใช้โมดูลที่กำหนดจากนั้นเรียกการ__using__/1เรียกกลับโดยให้โมดูลฉีดโค้ดบางส่วนลงในบริบทปัจจุบัน
defmodule Example do
use Feature, option: :value
end
รวบรวมเป็นไฟล์
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
ดังนั้นการเขียนuse Xก็เหมือนกับการเขียน
require X
X.__using__()
use/2 เป็นมาโครมาโครจะแปลงรหัสเป็นรหัสอื่นให้คุณ
คุณจะต้องการuse MODULEเมื่อคุณ:
- ต้องการเข้าถึงมาโคร (
require)
- และดำเนินการ
MODULE.__using__()
ทดสอบกับ Elixir 1.5
import Moduleนำเสนอฟังก์ชั่นที่จะใช้ภายในโมดูลของคุณuse Moduleนำฟังก์ชั่นที่จะใช้และเปิดเผยต่อสาธารณะในโมดูลของคุณ