এলিক্সির: ব্যবহার বনাম আমদানি


134

মধ্যে পার্থক্য কি useএবং import?

বর্তমান প্রসঙ্গে একটি প্রদত্ত মডিউল ব্যবহারের জন্য ব্যবহার একটি সহজ প্রক্রিয়া mechanism

https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2

অন্যান্য মডিউল থেকে ফাংশন এবং ম্যাক্রোগুলি আমদানি করে

মনে হচ্ছে একটি পার্থক্য হ'ল importআসুন আপনি নির্দিষ্ট ফাংশন / ম্যাক্রোগগুলি বেছে নিন যেখানে useসমস্ত কিছু আনা যায়।

অন্যান্য পার্থক্য আছে কি? আপনি কখন অন্যটির উপরে ব্যবহার করবেন?


দ্রুত সংক্ষিপ্তসার: import Moduleআপনার মডিউলটির অভ্যন্তরে ব্যবহৃত ফাংশন আনবে। use Moduleব্যবহারের জন্য ফাংশন নিয়ে আসে এবং এগুলি আপনার মডিউলটিতে সর্বজনীনভাবে প্রকাশ করে
জেরেড

উত্তর:


213

import ModuleModuleআন-নেমস্পিডের সমস্ত ফাংশন এবং ম্যাক্রোগুলি আপনার মডিউলে নিয়ে আসে।

require Moduleআপনাকে ম্যাক্রোগুলি ব্যবহার করতে দেয় Moduleতবে সেগুলি আমদানি করে না। (এর কার্যকারিতা Moduleসর্বদা নেমস্পিডে উপলভ্য।

use Moduleপ্রথম requiresমডিউল এবং তারপরে __using__ম্যাক্রোটিকে কল করে Module

নিম্নোক্ত বিবেচনা কর:

defmodule ModA do
  defmacro __using__(_opts) do
    IO.puts "You are USING ModA"
  end

  def moda() do
    IO.puts "Inside ModA"
  end
end

defmodule ModB do
  use ModA

  def modb() do
    IO.puts "Inside ModB"
    moda()     # <- ModA was not imported, this function doesn't exist
  end
end

এই যেমন কম্পাইল করা হবে না ModA.moda()আমদানি করা হয়েছে ModB

নিম্নলিখিতগুলি যদিও সংকলন করবে:

defmodule ModA do
  defmacro __using__(_opts) do
    IO.puts "You are USING ModA"
    quote do          # <--
      import ModA     # <--
    end               # <--
  end

  def moda() do
    IO.puts "Inside ModA"
  end
end

defmodule ModB do
  use ModA

  def modb() do
    IO.puts "Inside ModB"
    moda()            # <-- all good now
  end
end

হিসাবে আপনি useModAএটি একটি উত্পন্ন importবিবৃতি যে মধ্যে ঢোকানো হয়েছে ModB


6
দুর্দান্ত উত্তর! আরও তথ্যের জন্য: elixir-lang.org/getting-started/alias-require-and-import.html
জাস্টিন

এলিক্সির সাথে প্রবেশ করা, এবং পাইথন ওয়ার্ল্ড থেকে আগত আমি মডিউলগুলি *.exফাইল এবং defmoduleব্লকগুলি সম্পর্কে বিভ্রান্ত হয়েছি , এবং আপনি কীভাবে কোনও ফাইল থেকে একটি মডেলটিকে আইএএক্স রিপ্লেয়ারে টানতে চান
নিক টি

2
উদাহরণ / ধারণাটি বোঝার চেষ্টা করছি। এই বিশেষ ক্ষেত্রে আপনি কেবল প্রদর্শন করছেন যে __using__পদ্ধতিটি চালানো হয়েছে use ModA? ModBআপনি যে উদাহরণটি সঠিকভাবে উপস্থাপন করেছেন তাতে কেবল আমদানিটি ব্যবহার করা বোধগম্য হবে ?
রায়ান-নিল মেস

35

useবর্তমান মডিউলে কোড ইনজেকশনের উদ্দেশ্যে করা হয়েছে, যখন importব্যবহারের জন্য ভাল, আমদানি করে ফাংশন ব্যবহার করা হয়। আপনি এমন একটি useবাস্তবায়ন তৈরি করতে পারেন যা স্বয়ংক্রিয়ভাবে ফাংশনগুলি আমদানি করে উদাহরণস্বরূপ, যেমন আপনি টাইমেক্সের সাথে আমি যখন use Timexমডিউলে যোগ করি তখন টাইমেক্স.েক্সে একবার দেখুন, আপনি কী বলতে চাইছেন তা বোঝার জন্য , এটি কীভাবে তৈরি করবেন তার একটি খুব সাধারণ উদাহরণ মডিউল যা হতে পারে use'ডি


1
তাহলে কি useসাধারণের চেয়ে বেশি সাধারণ বলা সঠিক import? এটির কার্যকারিতা importহ'ল একটি উপসেটuse
ব্যবহারকারী 314159

1
importএখনও প্রয়োজনীয়, যেহেতু আমি জানি না যে আপনি একা importদিয়ে রিম্প্লেমেন্ট করতে পারবেন তা সঠিক কিনা use, তবে এটি সম্ভব হলে আমি অবাক হব না। useযদিও একেবারে আরও শক্তিশালী। আপনি এটির সাথে খুব জটিল জিনিসগুলি করতে পারেন, উদাহরণস্বরূপ, আমি useআমার exprotobufপ্রকল্পে প্রচুর ব্যবহার করি যা আপনি এটির সীমাতে ঠেলাঠেলি দেখতে চান কিনা তা পরীক্ষা করে দেখতে পারেন। আপনি কোড সহ মডিউলগুলি প্রসারিত করতে পারেন, সংকলন সময়ে কোড সম্পাদন করতে পারেন, একটি মডিউলে ফাংশন যুক্ত করতে পারেন Bas ইত্যাদি মূলত এটি সংমিশ্রণ importএবং ম্যাক্রোগুলির শক্তি।
বিটওয়াকার

কোডের বিস্তারিত ব্যাখ্যা এবং রেফারেন্সের জন্য ধন্যবাদ। আমি এখন এটি পেয়েছি বলে মনে করি। আমি এখনও এলিক্সিরে নতুন কিন্তু আমি মনে করি একবার ব্যবহারের দিকে তাকালে পার্থক্য সুস্পষ্ট হয়ে উঠবে।
ব্যবহারকারী314159

আরে কোনও সমস্যা নেই, দেখার আরও একটি দুর্দান্ত জায়গা হ'ল ফিনিক্স ওয়েব কাঠামো। ক্রিস ম্যাককার্ড এলিক্সির ম্যাক্রোসের উপর একটি বই লিখেছেন এবং তিনি সেগুলি ফিনিক্সে (সহ use) প্রচুর ব্যবহার করেছেন । শিক্ষানবিশদের চেয়ে পড়াশোনা করা প্রায় স্পষ্টতই সহজ exprotobuf, তবে আমি মনে করি আমি সম্ভবত useএটির সীমাটি ঠেলে দিচ্ছি exprotobufযাতে আপনি এটি কতটা দূরে নিয়ে যেতে পারেন তা কেবল এটি কার্যকর হতে পারে।
বিটওয়াকার

5
useআসলে অনেক কিছু করে না, এটি কেবল __using__নির্দিষ্ট মডিউলটিতে কল করে।
প্যাট্রিক অসিটি

25

দেখুন «ওরফে প্রয়োজন, এবং আমদানি» স্পর্শমণি কর্মকর্তা থেকে পৃষ্ঠা নির্দেশিকা শুরু করা:

# Ensure the module is compiled and available (usually for macros)
require Foo

# Import functions from Foo so they can be called without the `Foo.` prefix
import Foo

# Invokes the custom code defined in Foo as an extension point
use Foo

দরকার

এলিক্সির মেটা-প্রোগ্রামিংয়ের জন্য একটি প্রক্রিয়া হিসাবে ম্যাক্রোগুলি সরবরাহ করে (লিখিত কোড যা কোড উত্পন্ন করে)।

ম্যাক্রোজ হ'ল কোডের কিছু অংশ যা সংকলনের সময় কার্যকর এবং প্রসারিত হয়। এর অর্থ, ম্যাক্রো ব্যবহার করার জন্য, আমাদের এর মডিউলটির গ্যারান্টি দেওয়া দরকার এবং সংকলনের সময় বাস্তবায়ন উপলব্ধ। এটি requireনির্দেশ দিয়ে করা হয় ।

সাধারণভাবে ব্যবহারের আগে একটি মডিউল প্রয়োজন হয় না, যদি আমরা সেই মডিউলে উপলব্ধ ম্যাক্রোগুলি ব্যবহার করতে চাই তবে।

আমদানি

আমরা importযখনই পুরোপুরি যোগ্যতাসম্পন্ন নামটি ব্যবহার না করে সহজেই অন্যান্য মডিউল থেকে ফাংশন বা ম্যাক্রো অ্যাক্সেস করতে চাই তখনই আমরা ব্যবহার করি। উদাহরণস্বরূপ, আমরা মডিউল duplicate/2থেকে Listবেশ কয়েকবার ফাংশনটি ব্যবহার করতে চাইলে আমরা এটি আমদানি করতে পারি:

iex> import List, only: [duplicate: 2]
List
iex> duplicate :ok, 3
[:ok, :ok, :ok]

এই ক্ষেত্রে, আমরা কেবলমাত্র ফাংশনটি duplicate(আরতি 2 সহ) আমদানি করছি List

নোট করুন যে importকোনও মডিউলটি স্বয়ংক্রিয়ভাবে requireএটি সক্রিয় করে।

ব্যবহার

যদিও কোনও নির্দেশনা নয়, useএকটি ম্যাক্রো এটি শক্তভাবে সম্পর্কিত requireযা আপনাকে বর্তমান প্রসঙ্গে মডিউল ব্যবহার করতে দেয়। useম্যাক্রো ঘন ঘন মডিউল বর্তমান আভিধানিক সুযোগ মধ্যে বাহ্যিক কার্যকারিতা আনতে প্রায়ই ডেভেলপারদের দ্বারা ব্যবহার করা হয়।

পর্দার পিছনে, useপ্রদত্ত মডিউলটির প্রয়োজন হয় এবং তারপরে __using__/1কলব্যাক কল করে মডিউলটিকে বর্তমান প্রসঙ্গে কিছু কোড ইনজেক্ট করার অনুমতি দেয়। সাধারণভাবে বলতে গেলে, নিম্নলিখিত মডিউল:

defmodule Example do
  use Feature, option: :value
end

সংকলিত হয়

defmodule Example do
  require Feature
  Feature.__using__(option: :value)
end

14

পাইথন / জাভা / Golang ভাষা থেকে পটভূমি সঙ্গে, importবনাম useআমার বিশৃঙ্খলা শুরু হয়ে গিয়েছিল। এটি কিছু ঘোষণামূলক ভাষার উদাহরণ সহ কোড পুনঃব্যবহারের প্রক্রিয়াটি ব্যাখ্যা করবে।

আমদানি

সংক্ষেপে, এলিক্সিতে, আপনাকে মডিউলগুলি আমদানি করতে হবে না। সমস্ত পাবলিক ফাংশন সম্পূর্ণ যোগ্যতাযুক্ত মোডিয়ুল দ্বারা অ্যাক্সেস করা যায় F ফাংশন সিনট্যাক্স:

iex()> Integer.mod(5, 2)
1

iex()> String.trim(" Hello Elixir  ")
"Hello Elixir"

পাইথন / জাভা / গোলংয়ে, আপনাকে import MODULEএই মডুলিতে যেমন ফাইথন ব্যবহার করতে পারে তার আগে আপনার প্রয়োজন

In []: import math

In []: math.sqrt(100)
Out[]: 10.0

তারপরে importএলিক্সারের যা কিছু হতে পারে তা আপনাকে অবাক করে দিতে পারে:

আমরা যখনই পুরোপুরি যোগ্যতাসম্পন্ন নামটি ব্যবহার না করে সহজেই অন্যান্য মডিউল থেকে ফাংশন বা ম্যাক্রো অ্যাক্সেস করতে চাই আমরা আমদানি ব্যবহার করি

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"

এটি কোড পড়ার ক্ষেত্রে সমস্যা তৈরি করতে পারে এবং যখন নাম বিরোধী রয়েছে তাই এরলং (এলিক্সির প্রভাবিত ভাষা) এর ক্ষেত্রে এটি প্রস্তাবিত নয় । তবে এলিক্সিরে এমন কোনও কনভেনশন নেই, আপনি এটি নিজের ঝুঁকিতে ব্যবহার করতে পারেন।

পাইথনে, একই প্রভাব দ্বারা করা যেতে পারে:

from math import * 

সংক্ষিপ্ত / দ্রুত টাইপ করার জন্য - এটি কেবলমাত্র কিছু বিশেষ পরিস্থিতিতে / ইন্টারেক্টিভ মোডে ব্যবহার করার পরামর্শ দেওয়া হয় recommended

ব্যবহার এবং প্রয়োজন

যা ভিন্ন use/ requireভিন্ন হয় তা হ'ল তারা "ম্যাক্রো" - যে ধারণাটি পাইথন / জাভা / গোলং ... পরিবারে বিদ্যমান নয় তার সাথে সম্পর্কিত।

আপনি প্রয়োজন হবে না 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এটি একটি সাধারণ ফাংশন হিসাবে লেখা যায় তবে এটি ম্যাক্রো কারণ:

এলিক্সিতে, ইন্টিজার.আইস_ওডি / 1 ম্যাক্রো হিসাবে সংজ্ঞায়িত করা হয় যাতে এটি প্রহরী হিসাবে ব্যবহার করা যায়।

https://elixir-lang.org/getting-started/alias-require-and-import.html#require

use, এলিক্সির ডক থেকে উদ্ধৃত অংশ:

ব্যবহারের জন্য প্রদত্ত মডিউলটি প্রয়োজন এবং তারপরে __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__()

এলিক্সির 1.5 তে পরীক্ষা করা হয়েছে


3

use Module এটি প্রয়োজন Module এবং প্রয়োজন__using__

import Moduleকেবলমাত্র এটি প্রয়োজন হয় না, বর্তমান প্রসঙ্গেModule কার্যকারিতা নিয়ে আসে ।


0

আমদানি

প্রদত্ত মডিউলটি যেখানে ডাকা হয় তার ভিতরে প্রবেশ করার জন্য সমস্ত ফাংশন এবং ম্যাক্রো তৈরি করে। মনে রাখবেন যে বেশিরভাগ ক্ষেত্রে আপনার কেবলমাত্র এক বা একাধিক ফাংশন / ম্যাক্রোগুলি আমদানি করতে হবে।

উদাহরণ:

defmodule TextPrinter do
  import IO, only: [puts: 1]

  def execute(text) do
    puts(text)
  end
end

iex> TextPrinter.execute("Hello")
Hello
:ok

ব্যবহার

এই ম্যাক্রো আপনাকে বর্তমান মডিউলটিতে যে কোনও কোড ইনজেক্ট করতে দেয় । বাহ্যিক গ্রন্থাগারগুলি ব্যবহার করার সময় আপনার সতর্কতা অবলম্বন করা উচিত use, যেহেতু আপনি নিশ্চিত হতে পারেন না যে পর্দার আড়ালে ঠিক কী ঘটে।

উদাহরণ:

defmodule Printer do
  defmacro __using__(_opts) do
    quote do
      def execute(text) do
        IO.puts(text)
      end
    end
  end
end

defmodule TextPrinter do
  use Printer
end

iex> TextPrinter.execute("Hello")
Hello
:ok

এর ভিতরে দৃশ্যের কোডের পিছনে মডিউলটিতে __using__ইনজেকশন দেওয়া হয়েছে TextPrinter

উপায় দ্বারা, এলিক্সিরগুলিতে আরও নির্ভরতা পরিচালনার নির্দেশাবলী রয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.