ด้วยพื้นหลังจากภาษา 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
นำฟังก์ชั่นที่จะใช้และเปิดเผยต่อสาธารณะในโมดูลของคุณ