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個の仕切りを手で変えます。
スポイラー: もっと良い方法があります。それは 機能.
機能はあなたの小さな助手です 🤖
関数は、名前を付けて何度でも呼び出すことができるコードの一部です。一度書けば、どこでも使えます。 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 👻") -- никогда не выполнитсяendLuaトリック:複数の戻り値🤯
多くの言語とは異なり、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か所に📋
何 | どのように | なぜ |
|---|---|---|
通常の機能 |
| 基本ブロック |
パラメータ |
| カスタマイズ可能な動作 |
リターン付き |
| 結果を取得する |
ローカル |
| グローバルを汚さないでください |
匿名 |
| 引数として渡す |
閉鎖 | 関数内の関数 | 状態を記憶する |
Vararg |
| 引数の数が不明です |
合計
機能は単なる「教科書の内容」ではありません。 基礎 それらがなければ、あなたはただのシートを書くだけで、それらがあれば、あなたは建築を構築します。
3つのルールを覚えておいてください。
コードを 2 回以上コピーする場合は、関数に移動します
関数は1つのことをし、それをうまく行う必要があります
関数にわかりやすい名前を付けましょう —
calcDamage、f1またはdoStuffではありません
さあ、あなたの最後のプロジェクトをリファクタリングしてください。私たちは、関数に出すものがあることを知っています。😏
記事が気に入りましたか?まだコピペしている友達と共有してください。助けが必要です。
