{}const=>[]async()letfn</>var
Lua開発基礎

Luaの機能:コードを「ブロック」にまとめてコピペをやめる方法🧩

基本的な構文からクロージャやvarargまで、Luaの関数を理解しましょう。無限のコピペの代わりに、クリーンで再利用可能なコードを書くことを学びます。初心者向けの例、ミーム、レーキが含まれています。

К

Kodik

著者

3分で読める

Ctrl+C → Ctrl+V → Ctrl+C → Ctrl+V →「なぜ何も機能しないのですか?」—聞き覚えがありますか?それでは、ようこそ。

あなたはプログラマーではなく、コピペ師です😤

正直に言いましょう。私たち一人一人は、だいたいこんな風に始めました。

print("Hi Vasya!")
print("You are 20 years old")
print("----------")

print("Hi Masha!")
print("You are 22 years old")
print("----------")

print("Hi Dima!")
print("You are 19 years old")
print("----------")

25行。同じものが3回。そして、どこかでリファクタリングが1つ泣いています。

そして、このような挨拶が50回必要だと想像してみてください。または500回。または金曜日の夜に顧客が言う: 「代わりに ---------- あります ==========そして、あなたは座って、500個の仕切りを手で変えます。

スポイラー: もっと良い方法があります。それは 機能.

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

機能はあなたの小さな助手です 🤖

関数は、名前を付けて何度でも呼び出すことができるコードの一部です。一度書けば、どこでも使えます。 DRY原則 (Don't Repeat Yourself — 自分を繰り返さないでください)。

基本構文:

function имяФункции()
  -- тут кодend

恥ずべきことを書き換えます。

function greet(name, age)
  print("Hi, " .. name .. "!")
  print("To you " .. age .. " years")
  print("----------")
end

greet("Vasya", 20)
greet("Masha", 22)
greet("Dima", 19)

25行から9行になりました。 区切り文字を変更する必要がある場合はどうしますか?1つの場所で変更します。1つ。美しさ。

引数:関数に従うことを学ぶ 🎯

引数(またはパラメータ)は、関数に何を渡すかを知らせるために関数に渡すものです。これはカフェで注文するのと同じです。あなたは単に「食べ物を作ってください」と言うのではなく、「チーズバーガー、玉ねぎなし」と指定します。

function makeOrder(dish, extra, remove)
  print("Order: " .. dish)
  print("Add: " .. extra)
  print("Remove: " .. remove)
  print("---")
end

makeOrder("Burger", "cheese", "onion")
makeOrder("Pizza", "mushrooms", "anchovies")

ここで何が起こったか:

  • dish, extra, removeパラメータ (関数内の変数スロット)

  • "Burger", "cheese", "onion"引数 (私たちが伝える具体的な価値観)

多くの人がこの2つの単語を混同しています。技術的には、パラメータは定義にあり、引数は呼び出し時にあります。しかし、面接で「パラメータ」の代わりに「引数」と言えば、世界は崩壊しません。おそらく。

Return:単に実行するだけでなく、返す関数📦

時には、関数は何かを印刷するだけでなく、 結果を返す。そのためには、returnがあります。

function add(a, b)
  return a + b
end

local result = add(5, 3)
print(result) -- 8

これは、料理を作って自分で食べる料理人(printの関数)と、あなたに料理を提供する料理人(returnの関数)の違いのようなものです。

return は関数を実行します 再利用可能。結果は変数に保存したり、別の関数に渡したり、条件で使用したりできます。

function isAdult(age)
  return age >= 18end

if isAdult(20) thenprint("Welcome!")
elseprint("Wait a couple of years 😅")
end

重要なニュアンス: return の後、関数は終了します。returnの後のコード 一度もない 実行されません:

function test()
  return 42print("This line is a ghost 👻") -- никогда не выполнитсяend

Luaトリック:複数の戻り値🤯

多くの言語とは異なり、Luaは 複数の値 これは本当に便利です。

function getUser()
  return "Alexey", 25, "developer"end

local name, age, role = getUser()
print(name)  -- Алексейprint(age)   -- 25print(role)  -- developer

これは、配達員が小包を1つだけではなく、3つまとめて届けてくれたようなものです。Luaはそれができます、そしてそれは素晴らしいことです。

ローカル関数:整理整頓 🧹

Lua では、関数は通常の値です。それらは変数に割り当てることができ、引数として渡すことができます。そして、はい、それらは ローカル:

local function square(x)
  return x * x
end

print(square(5))  -- 25

なぜ localなのか?関数がグローバル名前空間を汚さないようにするため。大規模なプロジェクトでは、グローバル変数は部屋中に散らばっている靴下のようなものです。動作するようですが、必要なものを見つけるのは問題です。

良いマナーのルール: 外部からアクセスする必要がない場合は、常に関数をローカルにしてください。

匿名関数:名前が不要な場合 🥷

関数に名前を付ける必要がない場合もあります。たとえば、引数として渡す場合:

local numbers = {3, 1, 4, 1, 5, 9}

table.sort(numbers, function(a, b)
  return a > b  -- сортировка по убываниюend)

for _, v in ipairs(numbers) doprint(v)
end-- 9, 5, 4, 3, 1, 1

匿名関数は、使い捨てのコップのようなものです。使って忘れてしまいました。名前を考える必要はありません。変数に保存する必要はありません。

クロージャ:ミドル+レベルの魔法

クロージャーは、環境からの変数を「記憶」する関数です。

function createCounter()
  local count = 0return function()
    count = count + 1
    return count
  endend

local counter = createCounter()
print(counter())  -- 1print(counter())  -- 2print(counter())  -- 3

何が起こったのでしょうか?内部関数が外部関数から変数 count をキャプチャしました。そして、createCounterが完了した後でも、countはクロージャ内で生き続けます。

それは、あなたがカフェを出た後でも、ウェイターがあなたの注文を覚えているようなものです。気味が悪いですが、便利です。

これはどこで必要ですか?たとえば、プライベート変数、ファクトリ、コールバックを作成するために、そして一般的に、これは関数プログラミングの基礎です。

Vararg:いくつの引数が来るかわからないとき🎲

関数に渡される引数の数が事前にわからない場合があります。このために、Luaには...があります。

function sum(...)
  local args = {...}
  local total = 0for _, v in ipairs(args) do
    total = total + v
  endreturn total
end

print(sum(1, 2, 3))        -- 6print(sum(10, 20, 30, 40))  -- 100

... は、議論のビュッフェのようなものです。好きなだけ取ってください。

よくあるミス:初心者のレーキボード

1. 呼び出し時に括弧を忘れた

function sayHi()
  print("Hi!")
end

sayHi   -- ничего не произойдёт, это просто ссылка на функциюsayHi() -- вот так правильно!

2. 間違ったタイプの引数

function double(n)
  return n * 2end

print(double("five")) -- ошибка! строку нельзя умножить

3. returnを忘れた

function add(a, b)
  a + b  -- посчитал, но никуда не вернулend

local result = add(2, 3)
print(result) -- nil 😭

このエラーは絶対的なチャンピオンです。関数が何かを返すと思いますが、それはただ静かに計算して結果を無に投げ捨てます。

リファクタリング:スパゲッティから傑作まで🍝→🏗️

ミニゲームを書いているとします。これが「前」のコードです。

-- Игрок атакует монстраlocal playerDamage = 10 + math.random(5)
local monsterHp = 50 - playerDamage
print("The player inflicted " .. playerDamage .. " damage")
print("Monster " .. monsterHp .. " HP")

-- Монстр атакует игрокаlocal monsterDamage = 5 + math.random(3)
local playerHp = 100 - monsterDamage
print("Monster inflicted " .. monsterDamage .. " damage")
print("Player " .. playerHp .. " HP")

そしてこれが「後」です。

local function calcDamage(baseDamage, randomRange)
  return baseDamage + math.random(randomRange)
end

local function attack(attacker, target, baseDmg, randomRange, targetHp)
  local damage = calcDamage(baseDmg, randomRange)
  local remainingHp = targetHp - damage
  print(attacker .. " applied " .. damage .. " damage")
  print("U " .. target .. " " .. remainingHp .. " HP")
  return remainingHp
end

local monsterHp = attack("Player", "monster", 10, 5, 50)
local playerHp = attack("Monster", "player", 5, 3, 100)

コードが 再利用可能, 読み取り可能拡張可能クリティカルヒットを追加しますか?10の場所ではなく、1つの機能を変更します。

📱 Lua(とそれ以外のもの)を実際に練習したいですか?

理論は良いですが、実践がなければ数日で頭から消えてしまいます。聞き覚えがありますか?

アプリを作成しました コディック — たくさんの実践的な課題を通してプログラミングを学べる場所。500ページもの単なる理論ではなく、実際に理解を深めるためのわかりやすい説明と課題だけです。開いて、仕事に行く途中で問題を解いて、あなたはすでに昨日より少し良くなりました。

また、当社には 開発者向けテレグラムチャンネル 💬 — 便利な投稿、分析、チートシート、ミーム(それらなしではどこへも行けません)。すでに2000人以上の開発者が参加しています。登録して、好きな場所で読んで、ストレスなく資料を繰り返してください。 💪

チートシート:すべてが1か所に📋

どのように

なぜ

通常の機能

function name() end

基本ブロック

パラメータ

function name(a, b) end

カスタマイズ可能な動作

リターン付き

return value

結果を取得する

ローカル

local function name() end

グローバルを汚さないでください

匿名

function(a) return a end

引数として渡す

閉鎖

関数内の関数

状態を記憶する

Vararg

function name(...) end

引数の数が不明です

合計

機能は単なる「教科書の内容」ではありません。 基礎 それらがなければ、あなたはただのシートを書くだけで、それらがあれば、あなたは建築を構築します。

3つのルールを覚えておいてください。

  1. コードを 2 回以上コピーする場合は、関数に移動します

  2. 関数は1つのことをし、それをうまく行う必要があります

  3. 関数にわかりやすい名前を付けましょうcalcDamagef1 または doStuff ではありません

さあ、あなたの最後のプロジェクトをリファクタリングしてください。私たちは、関数に出すものがあることを知っています。😏

記事が気に入りましたか?まだコピペしている友達と共有してください。助けが必要です。

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要