الدوال والوحدات وPipelining
تعلّموا تعريف الدوال وتنظيم التعليمات البرمجية في وحدات واستخدام عامل pipe لإجراء تحويلات واضحة على البيانات.
الدوال والوحدات وPipelining درس مجاني في Elixir & Phoenix: Scalable Backend Development على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Elixir & Phoenix: Scalable Backend Development، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Elixir & Phoenix: Scalable Backend Development 4 دروس في المجموع.
بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.
Introduction to Elixir Functions
In Elixir, functions are the building blocks of your programs. They take inputs, perform operations, and return outputs.
Elixir functions are designed to be pure: they don't change data outside their scope and always produce the same output for the same input. This makes your code predictable and easier to reason about.
Defining Public Functions
You define public functions using the def keyword. These functions can be called from anywhere within your application, provided they are part of a module.
Let's create a simple function that adds two numbers:
defmodule MathOperations do
def add(a, b) do
a + b
end
end
IO.puts "Sum of 5 and 3: #{MathOperations.add(5, 3)}"Defining Private Functions
Sometimes you need helper functions that should only be used internally within a module. For these, you use the defp keyword.
Private functions cannot be called directly from outside their defining module. This helps encapsulate logic.
defmodule SecretOperations do
defp secret_add(a, b) do
a + b + 10 # A 'secret' addition
end
def public_operation(x, y) do
secret_add(x, y)
end
end
IO.puts "Result of public operation: #{SecretOperations.public_operation(2, 3)}"
# SecretOperations.secret_add(1, 2) would cause an error if called directly outside the module.Function Arity and Clauses
Arity refers to the number of arguments a function takes. Elixir allows you to define multiple function clauses with the same name but different arities or different patterns for arguments.
This enables powerful pattern matching (covered in a previous lesson) to handle different scenarios cleanly within a single function definition.
defmodule Greeter do
def greet("Alice"), do: "Hello, Alice!"
def greet(name), do: "Hi there, #{name}!"
end
IO.puts Greeter.greet("Alice")
IO.puts Greeter.greet("Bob")Anonymous Functions
Anonymous functions (also called lambdas) are functions without a name. They are often used when you need to pass a function as an argument to another function, or for short, one-off operations.
You define them using the fn keyword.
adder = fn a, b -> a + b end
multiplier = fn x, y -> x * y end
IO.puts "Anonymous add: #{adder.(10, 20)}"
IO.puts "Anonymous multiply: #{multiplier.(4, 5)}"Organizing Code with Modules
Modules in Elixir are containers for organizing related functions and data. They help prevent naming conflicts and make your code more structured and maintainable.
You define a module using the defmodule keyword. It's common practice for module names to start with an uppercase letter, following Elixir's naming conventions.
Creating Your First Module
Let's put our add function inside a module called Calculator. This makes it clear that the add function is part of a set of calculator-related operations.
defmodule Calculator do
def add(a, b) do
a + b
end
def subtract(a, b) do
a - b
end
end
IO.puts "Module defined!"Calling Module Functions
To call a function defined within a module, you use the module's name, followed by a dot (.), and then the function name with its arguments.
This explicit naming helps you understand where a function comes from.
defmodule Calculator do
def add(a, b), do: a + b
def subtract(a, b), do: a - b
end
IO.puts "10 + 5 = #{Calculator.add(10, 5)}"
IO.puts "10 - 5 = #{Calculator.subtract(10, 5)}"Introducing the Pipe Operator `|>`
The pipe operator |> is one of Elixir's most beloved features. It makes sequences of function calls incredibly readable, flowing data from one function to the next.
Think of it as taking the result of the expression on the left and passing it as the first argument to the function call on the right.
Pipelining in Action
Instead of nesting function calls like function_c(function_b(function_a(data))), the pipe operator lets you write it as data |> function_a() |> function_b() |> function_c().
This reads like a series of steps, making complex data transformations much clearer.
defmodule DataProcessor do
def double(x), do: x * 2
def add_five(x), do: x + 5
def to_string(x), do: to_string(x)
end
result = 10
|> DataProcessor.double()
|> DataProcessor.add_five()
|> DataProcessor.to_string()
IO.puts "Processed result: #{result}"Check Your Understanding
Which of the following statements about Elixir functions, modules, and the pipe operator are true?
Recap: Functions, Modules & Pipes
Great job! In this lesson, you learned the essentials of organizing and transforming data in Elixir:
- How to define public (`def`) and private (`defp`) functions.
- The importance of modules (`defmodule`) for structuring your code.
- How the pipe operator (`|>`) dramatically improves readability for sequential data transformations.
These concepts are fundamental to writing clear, maintainable, and functional Elixir applications. Keep practicing!
الأسئلة الشائعة
هل درس «الدوال والوحدات وPipelining» مجاني؟
نعم — نص درس «الدوال والوحدات وPipelining» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Elixir & Phoenix: Scalable Backend Development، انتقل إلى CoddyKit PRO. تتضمن دورة Elixir & Phoenix: Scalable Backend Development 4 دروس في المجموع.
ماذا ستتعلم في «الدوال والوحدات وPipelining»؟
تعلّموا تعريف الدوال وتنظيم التعليمات البرمجية في وحدات واستخدام عامل pipe لإجراء تحويلات واضحة على البيانات. تتمرن على Elixir & Phoenix: Scalable Backend Development مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Elixir & Phoenix: Scalable Backend Development؟
لا تُشترط خبرة سابقة. Elixir & Phoenix: Scalable Backend Development على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الدوال والوحدات وPipelining»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Elixir & Phoenix: Scalable Backend Development هذا؟
نعم. كل درس في Elixir & Phoenix: Scalable Backend Development يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال والوحدات وPipelining
- التعامل مع المجموعات القابلة للتعداد
- الاستدعاء الذاتي والدوال عالية الرتبة
- التقييم الكسول باستخدام الوحدة Stream