From 9923326b6dcd7a9d921c3036202adf301cd9c311 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 22 Feb 2026 12:04:26 +0000 Subject: [PATCH 01/25] Initial plan From b39ae29de2b58867d50733968f588182a75a22fd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 22 Feb 2026 12:14:39 +0000 Subject: [PATCH 02/25] Restructure public/docs/ into per-language directory format with index.yml Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- public/docs/cpp/0-intro/-intro.md | 1 + public/docs/cpp/0-intro/0.md | 9 ++ public/docs/cpp/0-intro/1.md | 14 ++ public/docs/cpp/0-intro/10-int-main-main.md | 12 ++ .../0-intro/11-stdcout-stdendl-namespace.md | 12 ++ public/docs/cpp/0-intro/12.md | 14 ++ public/docs/cpp/0-intro/2.md | 14 ++ public/docs/cpp/0-intro/3.md | 11 ++ public/docs/cpp/0-intro/4-ide.md | 15 +++ public/docs/cpp/0-intro/5.md | 11 ++ public/docs/cpp/0-intro/6.md | 22 ++++ public/docs/cpp/0-intro/7.md | 35 +++++ public/docs/cpp/0-intro/8.md | 9 ++ public/docs/cpp/0-intro/9-include-iostream.md | 12 ++ public/docs/cpp/1-types-control/-intro.md | 1 + public/docs/cpp/1-types-control/0.md | 16 +++ public/docs/cpp/1-types-control/1.md | 38 ++++++ public/docs/cpp/1-types-control/10.md | 13 ++ public/docs/cpp/1-types-control/11.md | 28 ++++ .../docs/cpp/1-types-control/12-2fizzbuzzc.md | 27 ++++ public/docs/cpp/1-types-control/2.md | 9 ++ public/docs/cpp/1-types-control/3-const.md | 35 +++++ public/docs/cpp/1-types-control/4-auto.md | 25 ++++ .../cpp/1-types-control/5-stdcin-stdcout.md | 36 +++++ .../1-types-control/6-if-switch-while-for.md | 9 ++ public/docs/cpp/1-types-control/7.md | 9 ++ public/docs/cpp/1-types-control/8-switch.md | 9 ++ public/docs/cpp/1-types-control/9.md | 60 +++++++++ public/docs/cpp/10-stl-containers/-intro.md | 1 + public/docs/cpp/10-stl-containers/0-stl.md | 15 +++ .../docs/cpp/10-stl-containers/1-stdvector.md | 74 +++++++++++ public/docs/cpp/10-stl-containers/2-stdmap.md | 83 ++++++++++++ public/docs/cpp/10-stl-containers/3.md | 16 +++ public/docs/cpp/10-stl-containers/4.md | 13 ++ public/docs/cpp/10-stl-containers/5.md | 39 ++++++ public/docs/cpp/10-stl-containers/6.md | 43 ++++++ public/docs/cpp/11-stl-algorithms/-intro.md | 3 + public/docs/cpp/11-stl-algorithms/0.md | 52 ++++++++ public/docs/cpp/11-stl-algorithms/1.md | 9 ++ .../docs/cpp/11-stl-algorithms/2-stdsort.md | 45 +++++++ .../docs/cpp/11-stl-algorithms/3-stdfind.md | 52 ++++++++ .../cpp/11-stl-algorithms/4-stdfor-each.md | 16 +++ public/docs/cpp/11-stl-algorithms/5.md | 91 +++++++++++++ public/docs/cpp/11-stl-algorithms/6.md | 16 +++ public/docs/cpp/11-stl-algorithms/7.md | 28 ++++ public/docs/cpp/11-stl-algorithms/8.md | 32 +++++ public/docs/cpp/12-raii-smart-ptrs/-intro.md | 3 + .../cpp/12-raii-smart-ptrs/0-try-catch.md | 57 ++++++++ public/docs/cpp/12-raii-smart-ptrs/1.md | 48 +++++++ public/docs/cpp/12-raii-smart-ptrs/2-raii.md | 64 +++++++++ .../cpp/12-raii-smart-ptrs/3-newdelete.md | 11 ++ .../cpp/12-raii-smart-ptrs/4-stdunique-ptr.md | 87 ++++++++++++ .../cpp/12-raii-smart-ptrs/5-stdshared-ptr.md | 82 ++++++++++++ public/docs/cpp/12-raii-smart-ptrs/6.md | 16 +++ .../cpp/12-raii-smart-ptrs/7-1-unique-ptr.md | 33 +++++ .../cpp/12-raii-smart-ptrs/8-2-shared-ptr.md | 38 ++++++ public/docs/cpp/2-data-containers/-intro.md | 3 + .../docs/cpp/2-data-containers/0-stdstring.md | 10 ++ public/docs/cpp/2-data-containers/1.md | 54 ++++++++ .../docs/cpp/2-data-containers/2-stdvector.md | 9 ++ public/docs/cpp/2-data-containers/3.md | 55 ++++++++ .../docs/cpp/2-data-containers/4-stdarray.md | 39 ++++++ .../5-for-range-based-for.md | 11 ++ public/docs/cpp/2-data-containers/6.md | 64 +++++++++ public/docs/cpp/2-data-containers/7.md | 32 +++++ public/docs/cpp/2-data-containers/8.md | 33 +++++ public/docs/cpp/3-pointers/-intro.md | 6 + public/docs/cpp/3-pointers/0.md | 13 ++ public/docs/cpp/3-pointers/1.md | 46 +++++++ public/docs/cpp/3-pointers/10-heap.md | 10 ++ public/docs/cpp/3-pointers/11-new-delete.md | 47 +++++++ public/docs/cpp/3-pointers/12.md | 17 +++ public/docs/cpp/3-pointers/13.md | 14 ++ public/docs/cpp/3-pointers/14.md | 30 +++++ public/docs/cpp/3-pointers/15.md | 28 ++++ public/docs/cpp/3-pointers/2-nullptr.md | 42 ++++++ public/docs/cpp/3-pointers/3.md | 9 ++ public/docs/cpp/3-pointers/4-decay.md | 9 ++ public/docs/cpp/3-pointers/5.md | 41 ++++++ public/docs/cpp/3-pointers/6-legacy.md | 10 ++ public/docs/cpp/3-pointers/7-char.md | 40 ++++++ public/docs/cpp/3-pointers/8.md | 9 ++ public/docs/cpp/3-pointers/9-stack.md | 11 ++ public/docs/cpp/4-functions/-intro.md | 3 + public/docs/cpp/4-functions/0.md | 9 ++ public/docs/cpp/4-functions/1.md | 43 ++++++ public/docs/cpp/4-functions/10.md | 42 ++++++ public/docs/cpp/4-functions/11.md | 14 ++ public/docs/cpp/4-functions/12-1-swap.md | 33 +++++ public/docs/cpp/4-functions/13.md | 34 +++++ public/docs/cpp/4-functions/2-void.md | 15 +++ public/docs/cpp/4-functions/3.md | 9 ++ .../docs/cpp/4-functions/4-pass-by-value.md | 41 ++++++ .../docs/cpp/4-functions/5-pass-by-pointer.md | 39 ++++++ .../cpp/4-functions/6-pass-by-reference.md | 38 ++++++ .../7-const-pass-by-const-reference.md | 46 +++++++ public/docs/cpp/4-functions/8.md | 9 ++ .../cpp/4-functions/9-function-overloading.md | 42 ++++++ public/docs/cpp/5-project-build/-intro.md | 3 + public/docs/cpp/5-project-build/0.md | 12 ++ public/docs/cpp/5-project-build/1.md | 11 ++ public/docs/cpp/5-project-build/10.md | 11 ++ public/docs/cpp/5-project-build/11.md | 45 +++++++ public/docs/cpp/5-project-build/2.md | 49 +++++++ public/docs/cpp/5-project-build/3.md | 48 +++++++ public/docs/cpp/5-project-build/4.md | 25 ++++ .../docs/cpp/5-project-build/5-pragma-once.md | 19 +++ public/docs/cpp/5-project-build/6.md | 11 ++ public/docs/cpp/5-project-build/7.md | 28 ++++ public/docs/cpp/5-project-build/8-makefile.md | 43 ++++++ public/docs/cpp/5-project-build/9-cmake.md | 46 +++++++ public/docs/cpp/6-classes-basics/-intro.md | 1 + public/docs/cpp/6-classes-basics/0.md | 32 +++++ public/docs/cpp/6-classes-basics/1.md | 54 ++++++++ .../cpp/6-classes-basics/2-public-private.md | 95 ++++++++++++++ public/docs/cpp/6-classes-basics/3.md | 9 ++ .../cpp/6-classes-basics/4-constructor.md | 45 +++++++ .../docs/cpp/6-classes-basics/5-destructor.md | 69 ++++++++++ public/docs/cpp/6-classes-basics/6.md | 18 +++ public/docs/cpp/6-classes-basics/7.md | 29 ++++ public/docs/cpp/6-classes-basics/8.md | 30 +++++ public/docs/cpp/7-classes-advanced/-intro.md | 1 + public/docs/cpp/7-classes-advanced/0.md | 16 +++ public/docs/cpp/7-classes-advanced/1.md | 50 +++++++ public/docs/cpp/7-classes-advanced/10.md | 53 ++++++++ public/docs/cpp/7-classes-advanced/11.md | 16 +++ public/docs/cpp/7-classes-advanced/12.md | 41 ++++++ public/docs/cpp/7-classes-advanced/13.md | 54 ++++++++ public/docs/cpp/7-classes-advanced/2.md | 124 ++++++++++++++++++ public/docs/cpp/7-classes-advanced/3.md | 18 +++ public/docs/cpp/7-classes-advanced/4.md | 64 +++++++++ .../docs/cpp/7-classes-advanced/5-static.md | 9 ++ .../docs/cpp/7-classes-advanced/6-static.md | 12 ++ .../docs/cpp/7-classes-advanced/7-static.md | 12 ++ public/docs/cpp/7-classes-advanced/8.md | 76 +++++++++++ public/docs/cpp/7-classes-advanced/9-this.md | 25 ++++ public/docs/cpp/8-inheritance/-intro.md | 1 + public/docs/cpp/8-inheritance/0.md | 57 ++++++++ public/docs/cpp/8-inheritance/1-virtual.md | 71 ++++++++++ public/docs/cpp/8-inheritance/2-override.md | 24 ++++ public/docs/cpp/8-inheritance/3.md | 71 ++++++++++ public/docs/cpp/8-inheritance/4.md | 13 ++ public/docs/cpp/8-inheritance/5.md | 41 ++++++ public/docs/cpp/8-inheritance/6.md | 36 +++++ public/docs/cpp/9-templates/-intro.md | 15 +++ .../docs/cpp/9-templates/0-intdoublestring.md | 41 ++++++ public/docs/cpp/9-templates/1.md | 23 ++++ public/docs/cpp/9-templates/2.md | 49 +++++++ public/docs/cpp/9-templates/3.md | 34 +++++ public/docs/cpp/9-templates/4.md | 14 ++ public/docs/cpp/9-templates/5-1-print.md | 35 +++++ public/docs/cpp/9-templates/6.md | 46 +++++++ public/docs/cpp/index.yml | 42 ++++++ public/docs/javascript/0-intro/-intro.md | 1 + .../docs/javascript/0-intro/0-javascript.md | 18 +++ public/docs/javascript/0-intro/1-vs-nodejs.md | 23 ++++ public/docs/javascript/0-intro/2.md | 19 +++ .../docs/javascript/0-intro/3-hello-world.md | 9 ++ .../0-intro/4-repl-read-eval-print-loop.md | 21 +++ public/docs/javascript/0-intro/5.md | 26 ++++ public/docs/javascript/0-intro/6.md | 24 ++++ public/docs/javascript/1-basics/-intro.md | 3 + .../javascript/1-basics/0-let-const-var.md | 10 ++ .../docs/javascript/1-basics/1-const-let.md | 12 ++ public/docs/javascript/1-basics/10.md | 9 ++ public/docs/javascript/1-basics/11.md | 20 +++ public/docs/javascript/1-basics/12-falsy.md | 43 ++++++ public/docs/javascript/1-basics/13.md | 13 ++ public/docs/javascript/1-basics/14.md | 25 ++++ public/docs/javascript/1-basics/15.md | 25 ++++ public/docs/javascript/1-basics/2-var.md | 36 +++++ public/docs/javascript/1-basics/3.md | 19 +++ .../javascript/1-basics/4-null-undefined.md | 25 ++++ public/docs/javascript/1-basics/5.md | 9 ++ public/docs/javascript/1-basics/6-const.md | 39 ++++++ public/docs/javascript/1-basics/7.md | 9 ++ public/docs/javascript/1-basics/8.md | 9 ++ public/docs/javascript/1-basics/9.md | 22 ++++ public/docs/javascript/2-control/-intro.md | 3 + .../docs/javascript/2-control/0-if-switch.md | 7 + .../javascript/2-control/1-iftruthy-falsy.md | 41 ++++++ .../2-control/10-trycatchfinally.md | 9 ++ public/docs/javascript/2-control/11.md | 36 +++++ public/docs/javascript/2-control/12-throw.md | 18 +++ public/docs/javascript/2-control/13.md | 13 ++ public/docs/javascript/2-control/14.md | 18 +++ public/docs/javascript/2-control/15.md | 26 ++++ public/docs/javascript/2-control/2-switch.md | 28 ++++ .../docs/javascript/2-control/3-for-while.md | 9 ++ public/docs/javascript/2-control/4-for.md | 14 ++ public/docs/javascript/2-control/5-while.md | 15 +++ .../javascript/2-control/6-forof-forin.md | 9 ++ public/docs/javascript/2-control/7-forin.md | 42 ++++++ public/docs/javascript/2-control/8-forof.md | 33 +++++ public/docs/javascript/2-control/9.md | 21 +++ .../javascript/3-functions-closures/-intro.md | 1 + .../docs/javascript/3-functions-closures/0.md | 9 ++ .../1-function-declaration.md | 21 +++ .../javascript/3-functions-closures/10.md | 12 ++ .../javascript/3-functions-closures/11.md | 39 ++++++ .../javascript/3-functions-closures/12.md | 11 ++ .../javascript/3-functions-closures/13.md | 13 ++ .../javascript/3-functions-closures/14.md | 18 +++ .../javascript/3-functions-closures/15.md | 25 ++++ .../2-function-expression.md | 24 ++++ .../docs/javascript/3-functions-closures/3.md | 9 ++ .../docs/javascript/3-functions-closures/4.md | 27 ++++ .../docs/javascript/3-functions-closures/5.md | 24 ++++ .../javascript/3-functions-closures/6-rest.md | 9 ++ .../docs/javascript/3-functions-closures/7.md | 25 ++++ .../javascript/3-functions-closures/8-rest.md | 24 ++++ .../docs/javascript/3-functions-closures/9.md | 32 +++++ public/docs/javascript/4-this/-intro.md | 5 + public/docs/javascript/4-this/0-this.md | 11 ++ public/docs/javascript/4-this/1.md | 9 ++ public/docs/javascript/4-this/2.md | 10 ++ public/docs/javascript/4-this/3.md | 43 ++++++ .../4-this/4-this-bind-call-apply.md | 9 ++ public/docs/javascript/4-this/5-call-apply.md | 25 ++++ public/docs/javascript/4-this/6-bind.md | 30 +++++ public/docs/javascript/4-this/7-this.md | 13 ++ public/docs/javascript/4-this/8.md | 90 +++++++++++++ public/docs/javascript/4-this/9.md | 32 +++++ .../javascript/5-objects-prototype/-intro.md | 3 + .../docs/javascript/5-objects-prototype/0.md | 27 ++++ .../docs/javascript/5-objects-prototype/1.md | 20 +++ .../docs/javascript/5-objects-prototype/10.md | 20 +++ .../docs/javascript/5-objects-prototype/11.md | 19 +++ .../javascript/5-objects-prototype/2-this.md | 33 +++++ .../docs/javascript/5-objects-prototype/3.md | 11 ++ .../4-proto-objectgetprototypeof.md | 23 ++++ .../docs/javascript/5-objects-prototype/5.md | 61 +++++++++ .../5-objects-prototype/6-objectcreate.md | 9 ++ .../5-objects-prototype/7-objectcreate.md | 20 +++ .../javascript/5-objects-prototype/8-new.md | 49 +++++++ .../docs/javascript/5-objects-prototype/9.md | 12 ++ public/docs/javascript/6-classes/-intro.md | 5 + public/docs/javascript/6-classes/0.md | 27 ++++ public/docs/javascript/6-classes/1.md | 20 +++ public/docs/javascript/6-classes/2.md | 59 +++++++++ .../javascript/6-classes/3-extends-super.md | 49 +++++++ public/docs/javascript/6-classes/4-static.md | 7 + public/docs/javascript/6-classes/5-static.md | 9 ++ public/docs/javascript/6-classes/6.md | 53 ++++++++ public/docs/javascript/6-classes/7.md | 14 ++ public/docs/javascript/6-classes/8-1-rpg.md | 19 +++ public/docs/javascript/6-classes/9.md | 19 +++ public/docs/javascript/7-arrays/-intro.md | 3 + public/docs/javascript/7-arrays/0.md | 10 ++ public/docs/javascript/7-arrays/1-repl.md | 33 +++++ public/docs/javascript/7-arrays/10.md | 23 ++++ public/docs/javascript/7-arrays/2-splice.md | 19 +++ public/docs/javascript/7-arrays/3.md | 9 ++ public/docs/javascript/7-arrays/4.md | 27 ++++ public/docs/javascript/7-arrays/5.md | 35 +++++ public/docs/javascript/7-arrays/6.md | 71 ++++++++++ .../javascript/7-arrays/7-find-some-every.md | 37 ++++++ public/docs/javascript/7-arrays/8.md | 13 ++ public/docs/javascript/7-arrays/9.md | 22 ++++ public/docs/javascript/8-promise/-intro.md | 5 + public/docs/javascript/8-promise/0.md | 33 +++++ public/docs/javascript/8-promise/1.md | 24 ++++ public/docs/javascript/8-promise/10.md | 19 +++ public/docs/javascript/8-promise/2.md | 42 ++++++ public/docs/javascript/8-promise/3-promise.md | 17 +++ public/docs/javascript/8-promise/4-promise.md | 7 + public/docs/javascript/8-promise/5-promise.md | 24 ++++ .../8-promise/6-then-catch-finally.md | 60 +++++++++ public/docs/javascript/8-promise/7.md | 15 +++ public/docs/javascript/8-promise/8.md | 7 + public/docs/javascript/8-promise/9.md | 16 +++ .../docs/javascript/9-async-await/-intro.md | 3 + .../javascript/9-async-await/0-asyncawait.md | 9 ++ .../docs/javascript/9-async-await/1-async.md | 22 ++++ public/docs/javascript/9-async-await/10.md | 12 ++ public/docs/javascript/9-async-await/11.md | 7 + public/docs/javascript/9-async-await/12.md | 21 +++ .../javascript/9-async-await/13-2-fetch.md | 16 +++ .../docs/javascript/9-async-await/2-await.md | 28 ++++ .../javascript/9-async-await/3-trycatch.md | 49 +++++++ .../9-async-await/4-fetch-api-http.md | 52 ++++++++ .../javascript/9-async-await/5-json-post.md | 19 +++ .../9-async-await/6-promiseall-promiserace.md | 9 ++ public/docs/javascript/9-async-await/7.md | 13 ++ .../javascript/9-async-await/8-promiseall.md | 39 ++++++ .../javascript/9-async-await/9-promiserace.md | 16 +++ public/docs/javascript/index.yml | 33 +++++ public/docs/python/0-intro/-intro.md | 1 + public/docs/python/0-intro/0-python.md | 20 +++ public/docs/python/0-intro/1-python.md | 9 ++ public/docs/python/0-intro/10-main.md | 73 +++++++++++ public/docs/python/0-intro/11-pip-venv.md | 50 +++++++ public/docs/python/0-intro/2-windows.md | 12 ++ public/docs/python/0-intro/3-macos-linux.md | 12 ++ public/docs/python/0-intro/4.md | 12 ++ public/docs/python/0-intro/5-replpython.md | 9 ++ public/docs/python/0-intro/6.md | 18 +++ public/docs/python/0-intro/7.md | 18 +++ public/docs/python/0-intro/8-repl.md | 32 +++++ public/docs/python/0-intro/9.md | 22 ++++ public/docs/python/1-basics/-intro.md | 1 + public/docs/python/1-basics/0.md | 34 +++++ public/docs/python/1-basics/1.md | 9 ++ public/docs/python/1-basics/2-int-float.md | 35 +++++ public/docs/python/1-basics/3-str.md | 34 +++++ public/docs/python/1-basics/4-bool.md | 25 ++++ public/docs/python/1-basics/5-type-hints.md | 31 +++++ public/docs/python/1-basics/6.md | 12 ++ public/docs/python/1-basics/7.md | 16 +++ public/docs/python/1-basics/8.md | 15 +++ public/docs/python/2-collections/-intro.md | 1 + public/docs/python/2-collections/0-list.md | 45 +++++++ public/docs/python/2-collections/1-tuple.md | 44 +++++++ .../docs/python/2-collections/2-dictionary.md | 41 ++++++ public/docs/python/2-collections/3-set.md | 50 +++++++ public/docs/python/2-collections/4.md | 35 +++++ .../python/2-collections/5-comprehensions.md | 52 ++++++++ public/docs/python/2-collections/6.md | 18 +++ public/docs/python/2-collections/7.md | 27 ++++ public/docs/python/2-collections/8.md | 29 ++++ .../docs/python/3-control-functions/-intro.md | 1 + .../3-control-functions/0-ifelifelse.md | 34 +++++ .../1-forrangeenumerate.md | 19 +++ .../10-lambda-expressions.md | 28 ++++ public/docs/python/3-control-functions/11.md | 17 +++ public/docs/python/3-control-functions/12.md | 27 ++++ public/docs/python/3-control-functions/13.md | 39 ++++++ .../python/3-control-functions/2-range.md | 20 +++ .../python/3-control-functions/3-enumerate.md | 19 +++ .../python/3-control-functions/4-while.md | 22 ++++ .../docs/python/3-control-functions/5-def.md | 34 +++++ public/docs/python/3-control-functions/6.md | 35 +++++ .../3-control-functions/7-args-kwargs.md | 9 ++ .../docs/python/3-control-functions/8-args.md | 25 ++++ .../python/3-control-functions/9-kwargs.md | 23 ++++ public/docs/python/4-modules/-intro.md | 1 + public/docs/python/4-modules/0.md | 9 ++ public/docs/python/4-modules/1-import.md | 52 ++++++++ public/docs/python/4-modules/10-2json.md | 39 ++++++ public/docs/python/4-modules/2.md | 66 ++++++++++ public/docs/python/4-modules/3.md | 9 ++ public/docs/python/4-modules/4-init-py.md | 58 ++++++++ public/docs/python/4-modules/5-python.md | 9 ++ public/docs/python/4-modules/6.md | 30 +++++ public/docs/python/4-modules/7.md | 65 +++++++++ public/docs/python/4-modules/8.md | 13 ++ public/docs/python/4-modules/9.md | 34 +++++ public/docs/python/5-oop/-intro.md | 1 + public/docs/python/5-oop/0-class.md | 25 ++++ public/docs/python/5-oop/1-init-self.md | 35 +++++ public/docs/python/5-oop/2.md | 45 +++++++ public/docs/python/5-oop/3.md | 28 ++++ public/docs/python/5-oop/4.md | 35 +++++ public/docs/python/5-oop/5.md | 52 ++++++++ public/docs/python/5-oop/6-str-repr.md | 52 ++++++++ public/docs/python/5-oop/7.md | 14 ++ public/docs/python/5-oop/8.md | 18 +++ public/docs/python/5-oop/9-1-book.md | 55 ++++++++ public/docs/python/6-file-io/-intro.md | 1 + public/docs/python/6-file-io/0-open.md | 29 ++++ public/docs/python/6-file-io/1.md | 9 ++ public/docs/python/6-file-io/10.md | 24 ++++ public/docs/python/6-file-io/11-2-csv.md | 31 +++++ public/docs/python/6-file-io/2.md | 25 ++++ public/docs/python/6-file-io/3.md | 34 +++++ public/docs/python/6-file-io/4-with.md | 38 ++++++ public/docs/python/6-file-io/5-jsonjson.md | 55 ++++++++ public/docs/python/6-file-io/6-csvcsv.md | 9 ++ public/docs/python/6-file-io/7-csv.md | 34 +++++ public/docs/python/6-file-io/8-csv.md | 26 ++++ public/docs/python/6-file-io/9.md | 17 +++ public/docs/python/7-exceptions/-intro.md | 1 + .../docs/python/7-exceptions/0-tryexcept.md | 31 +++++ public/docs/python/7-exceptions/1.md | 57 ++++++++ public/docs/python/7-exceptions/2-raise.md | 28 ++++ .../docs/python/7-exceptions/3-elsefinally.md | 48 +++++++ public/docs/python/7-exceptions/4.md | 17 +++ public/docs/python/7-exceptions/5.md | 32 +++++ public/docs/python/7-exceptions/6.md | 38 ++++++ .../python/8-generators-decorators/-intro.md | 1 + .../docs/python/8-generators-decorators/0.md | 36 +++++ .../python/8-generators-decorators/1-yield.md | 52 ++++++++ .../docs/python/8-generators-decorators/2.md | 36 +++++ .../docs/python/8-generators-decorators/3.md | 11 ++ .../docs/python/8-generators-decorators/4.md | 56 ++++++++ .../docs/python/8-generators-decorators/5.md | 15 +++ .../docs/python/8-generators-decorators/6.md | 28 ++++ .../docs/python/8-generators-decorators/7.md | 34 +++++ public/docs/python/index.yml | 30 +++++ public/docs/ruby/0-intro/-intro.md | 1 + public/docs/ruby/0-intro/0-ruby.md | 27 ++++ public/docs/ruby/0-intro/1.md | 27 ++++ public/docs/ruby/0-intro/2.md | 37 ++++++ public/docs/ruby/0-intro/3-irb.md | 30 +++++ public/docs/ruby/0-intro/4-hello-world.md | 9 ++ public/docs/ruby/0-intro/5-irb.md | 17 +++ public/docs/ruby/0-intro/6.md | 31 +++++ public/docs/ruby/1-basics/-intro.md | 1 + public/docs/ruby/1-basics/0.md | 35 +++++ public/docs/ruby/1-basics/1-ruby.md | 39 ++++++ public/docs/ruby/1-basics/2-nil-false.md | 45 +++++++ public/docs/ruby/1-basics/3-symbol.md | 44 +++++++ public/docs/ruby/1-basics/4.md | 24 ++++ public/docs/ruby/1-basics/5.md | 33 +++++ public/docs/ruby/1-basics/6.md | 13 ++ public/docs/ruby/1-basics/7.md | 16 +++ public/docs/ruby/10-testing/-intro.md | 5 + public/docs/ruby/10-testing/0-minitest.md | 13 ++ public/docs/ruby/10-testing/1.md | 9 ++ .../10-testing/10-assert-raisesexception.md | 45 +++++++ public/docs/ruby/10-testing/11-tdd.md | 20 +++ public/docs/ruby/10-testing/12-red.md | 63 +++++++++ public/docs/ruby/10-testing/13-green.md | 35 +++++ public/docs/ruby/10-testing/14-refactor.md | 11 ++ public/docs/ruby/10-testing/15.md | 15 +++ public/docs/ruby/10-testing/16-1-string.md | 21 +++ public/docs/ruby/10-testing/17-2-tdduser.md | 25 ++++ public/docs/ruby/10-testing/2.md | 22 ++++ public/docs/ruby/10-testing/3.md | 48 +++++++ public/docs/ruby/10-testing/4.md | 29 ++++ .../ruby/10-testing/5-assert-equal-assert.md | 9 ++ .../6-assert-equalexpected-actual.md | 28 ++++ public/docs/ruby/10-testing/7-asserttest.md | 16 +++ public/docs/ruby/10-testing/8-refutetest.md | 16 +++ .../docs/ruby/10-testing/9-assert-nilobj.md | 16 +++ public/docs/ruby/11-metaprogramming/-intro.md | 1 + public/docs/ruby/11-metaprogramming/0-ruby.md | 14 ++ public/docs/ruby/11-metaprogramming/1-send.md | 26 ++++ .../11-metaprogramming/2-define-method.md | 44 +++++++ .../11-metaprogramming/3-method-missing.md | 63 +++++++++ .../docs/ruby/11-metaprogramming/4-rails.md | 16 +++ public/docs/ruby/11-metaprogramming/5.md | 13 ++ public/docs/ruby/11-metaprogramming/6.md | 36 +++++ public/docs/ruby/11-metaprogramming/7.md | 37 ++++++ public/docs/ruby/2-control-methods/-intro.md | 1 + public/docs/ruby/2-control-methods/0.md | 9 ++ .../ruby/2-control-methods/1-if-else-elsif.md | 27 ++++ public/docs/ruby/2-control-methods/10.md | 20 +++ public/docs/ruby/2-control-methods/11.md | 38 ++++++ .../docs/ruby/2-control-methods/12-splat.md | 29 ++++ public/docs/ruby/2-control-methods/13.md | 9 ++ .../14-begin-rescue-ensure.md | 56 ++++++++ .../docs/ruby/2-control-methods/15-raise.md | 28 ++++ public/docs/ruby/2-control-methods/16.md | 13 ++ public/docs/ruby/2-control-methods/17.md | 23 ++++ public/docs/ruby/2-control-methods/18.md | 26 ++++ .../docs/ruby/2-control-methods/2-unless.md | 21 +++ public/docs/ruby/2-control-methods/3-case.md | 46 +++++++ public/docs/ruby/2-control-methods/4.md | 9 ++ public/docs/ruby/2-control-methods/5-while.md | 19 +++ public/docs/ruby/2-control-methods/6-until.md | 19 +++ public/docs/ruby/2-control-methods/7-def.md | 9 ++ .../docs/ruby/2-control-methods/8-return.md | 36 +++++ public/docs/ruby/2-control-methods/9.md | 9 ++ .../docs/ruby/3-everything-object/-intro.md | 3 + .../ruby/3-everything-object/0-ruby-5times.md | 40 ++++++ public/docs/ruby/3-everything-object/1-nil.md | 31 +++++ public/docs/ruby/3-everything-object/2.md | 25 ++++ public/docs/ruby/3-everything-object/3.md | 9 ++ .../docs/ruby/3-everything-object/4-string.md | 38 ++++++ .../3-everything-object/5-integer-float.md | 31 +++++ public/docs/ruby/3-everything-object/6.md | 13 ++ public/docs/ruby/3-everything-object/7.md | 17 +++ public/docs/ruby/3-everything-object/8.md | 16 +++ public/docs/ruby/4-collections/-intro.md | 1 + public/docs/ruby/4-collections/0-array.md | 9 ++ public/docs/ruby/4-collections/1.md | 29 ++++ public/docs/ruby/4-collections/10.md | 13 ++ public/docs/ruby/4-collections/11.md | 21 +++ public/docs/ruby/4-collections/12.md | 20 +++ public/docs/ruby/4-collections/2.md | 22 ++++ public/docs/ruby/4-collections/3.md | 22 ++++ public/docs/ruby/4-collections/4-hash.md | 9 ++ public/docs/ruby/4-collections/5.md | 38 ++++++ public/docs/ruby/4-collections/6-range.md | 11 ++ public/docs/ruby/4-collections/7.md | 18 +++ public/docs/ruby/4-collections/8.md | 18 +++ public/docs/ruby/4-collections/9.md | 38 ++++++ public/docs/ruby/5-blocks-iterators/-intro.md | 3 + .../docs/ruby/5-blocks-iterators/0-doend.md | 34 +++++ public/docs/ruby/5-blocks-iterators/1.md | 11 ++ public/docs/ruby/5-blocks-iterators/10.md | 14 ++ public/docs/ruby/5-blocks-iterators/11.md | 17 +++ public/docs/ruby/5-blocks-iterators/12.md | 16 +++ public/docs/ruby/5-blocks-iterators/2-each.md | 26 ++++ .../ruby/5-blocks-iterators/3-map-collect.md | 27 ++++ .../5-blocks-iterators/4-select-filter.md | 17 +++ .../ruby/5-blocks-iterators/5-find-detect.md | 20 +++ .../ruby/5-blocks-iterators/6-enumerable.md | 64 +++++++++ public/docs/ruby/5-blocks-iterators/7-for.md | 35 +++++ public/docs/ruby/5-blocks-iterators/8.md | 32 +++++ .../docs/ruby/5-blocks-iterators/9-yield.md | 54 ++++++++ public/docs/ruby/6-classes/-intro.md | 3 + .../docs/ruby/6-classes/0-class-initialize.md | 39 ++++++ public/docs/ruby/6-classes/1-var.md | 7 + public/docs/ruby/6-classes/10-super.md | 11 ++ public/docs/ruby/6-classes/11-super.md | 61 +++++++++ public/docs/ruby/6-classes/12.md | 15 +++ public/docs/ruby/6-classes/13-1-book.md | 30 +++++ public/docs/ruby/6-classes/14-2-ebook.md | 30 +++++ public/docs/ruby/6-classes/2.md | 13 ++ public/docs/ruby/6-classes/3.md | 33 +++++ .../4-attr-reader-attr-writer-attr-a.md | 28 ++++ public/docs/ruby/6-classes/5.md | 38 ++++++ public/docs/ruby/6-classes/6-attr.md | 62 +++++++++ .../ruby/6-classes/7-var-selfmethod-name.md | 7 + public/docs/ruby/6-classes/8-var.md | 13 ++ .../docs/ruby/6-classes/9-selfmethod-name.md | 63 +++++++++ public/docs/ruby/7-modules/-intro.md | 3 + public/docs/ruby/7-modules/0-module-2.md | 14 ++ public/docs/ruby/7-modules/1.md | 44 +++++++ public/docs/ruby/7-modules/2-include.md | 81 ++++++++++++ .../ruby/7-modules/3-include-vs-extend.md | 43 ++++++ .../7-modules/4-public-private-protected.md | 84 ++++++++++++ public/docs/ruby/7-modules/5.md | 14 ++ public/docs/ruby/7-modules/6.md | 35 +++++ public/docs/ruby/7-modules/7-2-protected.md | 26 ++++ public/docs/ruby/8-proc-lambda/-intro.md | 3 + public/docs/ruby/8-proc-lambda/0-proc.md | 37 ++++++ .../ruby/8-proc-lambda/1-procnew-lambda.md | 23 ++++ public/docs/ruby/8-proc-lambda/10.md | 16 +++ public/docs/ruby/8-proc-lambda/2-return.md | 65 +++++++++ public/docs/ruby/8-proc-lambda/3.md | 44 +++++++ public/docs/ruby/8-proc-lambda/4.md | 9 ++ public/docs/ruby/8-proc-lambda/5-proc.md | 36 +++++ public/docs/ruby/8-proc-lambda/6-proc.md | 33 +++++ public/docs/ruby/8-proc-lambda/7.md | 63 +++++++++ public/docs/ruby/8-proc-lambda/8.md | 15 +++ public/docs/ruby/8-proc-lambda/9-1-lambda.md | 19 +++ public/docs/ruby/9-stdlib/-intro.md | 5 + .../docs/ruby/9-stdlib/0-file-dir-pathname.md | 9 ++ public/docs/ruby/9-stdlib/1-file.md | 63 +++++++++ public/docs/ruby/9-stdlib/10.md | 23 ++++ public/docs/ruby/9-stdlib/2-dirpathname.md | 43 ++++++ public/docs/ruby/9-stdlib/3-time-date.md | 42 ++++++ public/docs/ruby/9-stdlib/4-json-json.md | 47 +++++++ public/docs/ruby/9-stdlib/5-regexp-match.md | 9 ++ public/docs/ruby/9-stdlib/6-match.md | 34 +++++ public/docs/ruby/9-stdlib/7-scan-gsub.md | 31 +++++ public/docs/ruby/9-stdlib/8.md | 15 +++ public/docs/ruby/9-stdlib/9-1-json.md | 24 ++++ public/docs/ruby/index.yml | 39 ++++++ public/docs/rust/0-intro/-intro.md | 1 + public/docs/rust/0-intro/0-rust.md | 9 ++ public/docs/rust/0-intro/1-memory-safety.md | 12 ++ public/docs/rust/0-intro/10-cargo.md | 33 +++++ public/docs/rust/0-intro/11.md | 9 ++ public/docs/rust/0-intro/12-rustfmt.md | 15 +++ public/docs/rust/0-intro/13-clippy.md | 15 +++ .../rust/0-intro/2-zero-cost-abstractions.md | 9 ++ .../rust/0-intro/3-fearless-concurrency.md | 9 ++ public/docs/rust/0-intro/4.md | 9 ++ public/docs/rust/0-intro/5-rustup.md | 25 ++++ .../docs/rust/0-intro/6-hello-world-rustc.md | 30 +++++ public/docs/rust/0-intro/7.md | 11 ++ public/docs/rust/0-intro/8-cargorust.md | 9 ++ public/docs/rust/0-intro/9-cargo-new.md | 20 +++ public/docs/rust/1-basics/-intro.md | 5 + public/docs/rust/1-basics/0-let-vs-let-mut.md | 9 ++ public/docs/rust/1-basics/1-immutable.md | 35 +++++ public/docs/rust/1-basics/2-mutable.md | 28 ++++ public/docs/rust/1-basics/3-shadowing.md | 48 +++++++ public/docs/rust/1-basics/4.md | 9 ++ public/docs/rust/1-basics/5.md | 17 +++ public/docs/rust/1-basics/6.md | 54 ++++++++ public/docs/rust/1-basics/7.md | 13 ++ public/docs/rust/1-basics/8.md | 21 +++ public/docs/rust/1-basics/9.md | 18 +++ public/docs/rust/10-generics-traits/-intro.md | 4 + public/docs/rust/10-generics-traits/0-rust.md | 15 +++ public/docs/rust/10-generics-traits/1.md | 9 ++ public/docs/rust/10-generics-traits/10.md | 57 ++++++++ public/docs/rust/10-generics-traits/11.md | 24 ++++ public/docs/rust/10-generics-traits/12.md | 30 +++++ public/docs/rust/10-generics-traits/2.md | 30 +++++ public/docs/rust/10-generics-traits/3.md | 41 ++++++ public/docs/rust/10-generics-traits/4.md | 9 ++ public/docs/rust/10-generics-traits/5.md | 15 +++ public/docs/rust/10-generics-traits/6.md | 68 ++++++++++ .../rust/10-generics-traits/7-trait-bounds.md | 9 ++ public/docs/rust/10-generics-traits/8.md | 21 +++ .../docs/rust/10-generics-traits/9-where.md | 58 ++++++++ public/docs/rust/11-lifetimes/-intro.md | 6 + public/docs/rust/11-lifetimes/0.md | 11 ++ public/docs/rust/11-lifetimes/1.md | 28 ++++ public/docs/rust/11-lifetimes/2.md | 43 ++++++ public/docs/rust/11-lifetimes/3.md | 52 ++++++++ public/docs/rust/11-lifetimes/4.md | 21 +++ public/docs/rust/11-lifetimes/5.md | 39 ++++++ public/docs/rust/11-lifetimes/6-static.md | 19 +++ public/docs/rust/11-lifetimes/7.md | 15 +++ public/docs/rust/11-lifetimes/8.md | 32 +++++ public/docs/rust/11-lifetimes/9.md | 34 +++++ .../docs/rust/2-functions-control/-intro.md | 3 + public/docs/rust/2-functions-control/0.md | 9 ++ public/docs/rust/2-functions-control/1.md | 9 ++ .../2-statementexpression.md | 49 +++++++ public/docs/rust/2-functions-control/3.md | 9 ++ public/docs/rust/2-functions-control/4.md | 32 +++++ public/docs/rust/2-functions-control/5.md | 89 +++++++++++++ public/docs/rust/2-functions-control/6.md | 12 ++ public/docs/rust/2-functions-control/7.md | 25 ++++ public/docs/rust/2-functions-control/8.md | 25 ++++ public/docs/rust/3-ownership/-intro.md | 5 + public/docs/rust/3-ownership/0.md | 9 ++ public/docs/rust/3-ownership/1-stack.md | 11 ++ public/docs/rust/3-ownership/10.md | 33 +++++ public/docs/rust/3-ownership/11.md | 19 +++ public/docs/rust/3-ownership/12.md | 22 ++++ public/docs/rust/3-ownership/13.md | 30 +++++ public/docs/rust/3-ownership/2-heap.md | 13 ++ public/docs/rust/3-ownership/3.md | 15 +++ public/docs/rust/3-ownership/4.md | 24 ++++ .../docs/rust/3-ownership/5-move-vs-copy.md | 9 ++ public/docs/rust/3-ownership/6-copy.md | 15 +++ public/docs/rust/3-ownership/7-move.md | 45 +++++++ public/docs/rust/3-ownership/8-clone.md | 22 ++++ public/docs/rust/3-ownership/9.md | 38 ++++++ public/docs/rust/4-borrowing-slices/-intro.md | 3 + .../docs/rust/4-borrowing-slices/0-1-mut.md | 11 ++ .../1-immutable-reference.md | 30 +++++ public/docs/rust/4-borrowing-slices/10-str.md | 17 +++ public/docs/rust/4-borrowing-slices/11.md | 27 ++++ public/docs/rust/4-borrowing-slices/12.md | 17 +++ public/docs/rust/4-borrowing-slices/13.md | 35 +++++ public/docs/rust/4-borrowing-slices/14.md | 40 ++++++ .../4-borrowing-slices/2-mutable-reference.md | 27 ++++ public/docs/rust/4-borrowing-slices/3.md | 15 +++ public/docs/rust/4-borrowing-slices/4.md | 10 ++ public/docs/rust/4-borrowing-slices/5.md | 43 ++++++ public/docs/rust/4-borrowing-slices/6.md | 22 ++++ .../docs/rust/4-borrowing-slices/7-4-slice.md | 9 ++ public/docs/rust/4-borrowing-slices/8-str.md | 40 ++++++ public/docs/rust/4-borrowing-slices/9.md | 15 +++ public/docs/rust/5-structs-methods/-intro.md | 8 ++ public/docs/rust/5-structs-methods/0.md | 9 ++ public/docs/rust/5-structs-methods/1.md | 40 ++++++ .../10-associated-functions.md | 43 ++++++ public/docs/rust/5-structs-methods/11.md | 15 +++ .../docs/rust/5-structs-methods/12-1-rpg.md | 40 ++++++ public/docs/rust/5-structs-methods/13.md | 29 ++++ public/docs/rust/5-structs-methods/2.md | 20 +++ public/docs/rust/5-structs-methods/3.md | 17 +++ public/docs/rust/5-structs-methods/4.md | 9 ++ .../rust/5-structs-methods/5-tuple-structs.md | 29 ++++ .../5-structs-methods/6-unit-like-structs.md | 9 ++ public/docs/rust/5-structs-methods/7.md | 26 ++++ public/docs/rust/5-structs-methods/8-impl.md | 9 ++ public/docs/rust/5-structs-methods/9.md | 53 ++++++++ public/docs/rust/6-enums-pattern/-intro.md | 4 + public/docs/rust/6-enums-pattern/0-enum.md | 32 +++++ public/docs/rust/6-enums-pattern/1.md | 10 ++ public/docs/rust/6-enums-pattern/10.md | 12 ++ public/docs/rust/6-enums-pattern/11.md | 30 +++++ public/docs/rust/6-enums-pattern/12.md | 45 +++++++ public/docs/rust/6-enums-pattern/2.md | 42 ++++++ .../rust/6-enums-pattern/3-optiont-null.md | 19 +++ public/docs/rust/6-enums-pattern/4.md | 39 ++++++ public/docs/rust/6-enums-pattern/5-match.md | 9 ++ public/docs/rust/6-enums-pattern/6.md | 46 +++++++ .../rust/6-enums-pattern/7-optiont-match.md | 34 +++++ public/docs/rust/6-enums-pattern/8.md | 18 +++ public/docs/rust/6-enums-pattern/9-if-let.md | 49 +++++++ public/docs/rust/7-modules/-intro.md | 5 + public/docs/rust/7-modules/0.md | 15 +++ public/docs/rust/7-modules/1-mod.md | 39 ++++++ public/docs/rust/7-modules/10.md | 15 +++ public/docs/rust/7-modules/11.md | 33 +++++ public/docs/rust/7-modules/12.md | 32 +++++ public/docs/rust/7-modules/2-pub.md | 41 ++++++ public/docs/rust/7-modules/3.md | 44 +++++++ public/docs/rust/7-modules/4-use.md | 10 ++ public/docs/rust/7-modules/5.md | 40 ++++++ public/docs/rust/7-modules/6.md | 47 +++++++ public/docs/rust/7-modules/7.md | 9 ++ public/docs/rust/7-modules/8-cargotoml.md | 14 ++ public/docs/rust/7-modules/9.md | 31 +++++ .../docs/rust/8-collections-strings/-intro.md | 9 ++ .../docs/rust/8-collections-strings/0-vect.md | 9 ++ public/docs/rust/8-collections-strings/1.md | 38 ++++++ .../docs/rust/8-collections-strings/10-api.md | 45 +++++++ public/docs/rust/8-collections-strings/11.md | 11 ++ public/docs/rust/8-collections-strings/12.md | 26 ++++ .../8-collections-strings/13-2-pig-latin.md | 32 +++++ public/docs/rust/8-collections-strings/2.md | 52 ++++++++ .../8-collections-strings/3-string-utf-8.md | 10 ++ .../8-collections-strings/4-string-str.md | 10 ++ public/docs/rust/8-collections-strings/5.md | 43 ++++++ public/docs/rust/8-collections-strings/6.md | 52 ++++++++ .../8-collections-strings/7-hashmapk-v.md | 9 ++ public/docs/rust/8-collections-strings/8.md | 36 +++++ public/docs/rust/8-collections-strings/9.md | 9 ++ public/docs/rust/9-error-handling/-intro.md | 5 + public/docs/rust/9-error-handling/0.md | 18 +++ public/docs/rust/9-error-handling/1-panic.md | 34 +++++ public/docs/rust/9-error-handling/10.md | 38 ++++++ public/docs/rust/9-error-handling/11.md | 43 ++++++ .../docs/rust/9-error-handling/2-resultt-e.md | 18 +++ public/docs/rust/9-error-handling/3-result.md | 40 ++++++ .../rust/9-error-handling/4-unwrap-expect.md | 9 ++ public/docs/rust/9-error-handling/5-unwrap.md | 9 ++ public/docs/rust/9-error-handling/6-expect.md | 36 +++++ public/docs/rust/9-error-handling/7.md | 55 ++++++++ public/docs/rust/9-error-handling/8.md | 75 +++++++++++ public/docs/rust/9-error-handling/9.md | 14 ++ public/docs/rust/index.yml | 39 ++++++ public/docs/typescript/0-intro/-intro.md | 2 + .../docs/typescript/0-intro/0-typescript.md | 15 +++ .../docs/typescript/0-intro/1-typescript.md | 16 +++ public/docs/typescript/0-intro/2.md | 9 ++ .../docs/typescript/0-intro/3-typescript.md | 30 +++++ .../docs/typescript/0-intro/4-typescript.md | 9 ++ public/docs/typescript/0-intro/5.md | 18 +++ public/docs/typescript/0-intro/6.md | 35 +++++ .../docs/typescript/0-intro/7-tsconfigjson.md | 30 +++++ public/docs/typescript/0-intro/8.md | 15 +++ public/docs/typescript/1-types/-intro.md | 6 + .../1-types/0-1-type-annotations.md | 34 +++++ public/docs/typescript/1-types/1.md | 35 +++++ public/docs/typescript/1-types/10.md | 15 +++ public/docs/typescript/1-types/11.md | 19 +++ .../docs/typescript/1-types/12-2-unknown.md | 19 +++ .../typescript/1-types/2-3-type-inference.md | 31 +++++ .../1-types/3-4-any-unknown-never.md | 9 ++ public/docs/typescript/1-types/4-any.md | 9 ++ public/docs/typescript/1-types/5-unknown.md | 9 ++ public/docs/typescript/1-types/6-never.md | 47 +++++++ public/docs/typescript/1-types/7.md | 9 ++ public/docs/typescript/1-types/8-array.md | 12 ++ public/docs/typescript/1-types/9-tuple.md | 40 ++++++ .../typescript/2-objects-interfaces/-intro.md | 3 + .../docs/typescript/2-objects-interfaces/0.md | 28 ++++ .../typescript/2-objects-interfaces/1-type.md | 47 +++++++ .../2-objects-interfaces/2-interface.md | 33 +++++ .../3-type-vs-interface.md | 20 +++ .../docs/typescript/2-objects-interfaces/4.md | 39 ++++++ .../2-objects-interfaces/5-readonly.md | 38 ++++++ .../docs/typescript/2-objects-interfaces/6.md | 13 ++ .../docs/typescript/2-objects-interfaces/7.md | 22 ++++ .../docs/typescript/2-objects-interfaces/8.md | 21 +++ .../typescript/3-function-types/-intro.md | 3 + public/docs/typescript/3-function-types/0.md | 38 ++++++ public/docs/typescript/3-function-types/1.md | 9 ++ public/docs/typescript/3-function-types/10.md | 13 ++ public/docs/typescript/3-function-types/11.md | 21 +++ public/docs/typescript/3-function-types/12.md | 20 +++ public/docs/typescript/3-function-types/2.md | 11 ++ public/docs/typescript/3-function-types/3.md | 39 ++++++ .../typescript/3-function-types/4-this.md | 7 + public/docs/typescript/3-function-types/5.md | 28 ++++ .../typescript/3-function-types/6-this.md | 37 ++++++ public/docs/typescript/3-function-types/7.md | 47 +++++++ .../3-function-types/8-rest-parameters.md | 32 +++++ public/docs/typescript/3-function-types/9.md | 36 +++++ .../typescript/4-combining-types/-intro.md | 3 + .../typescript/4-combining-types/0-union.md | 36 +++++ .../typescript/4-combining-types/1-literal.md | 32 +++++ .../docs/typescript/4-combining-types/10.md | 30 +++++ .../docs/typescript/4-combining-types/11.md | 30 +++++ .../4-combining-types/2-intersection.md | 41 ++++++ .../4-combining-types/3-null-undefined.md | 38 ++++++ .../4-combining-types/4-type-guards.md | 11 ++ .../typescript/4-combining-types/5-typeof.md | 33 +++++ public/docs/typescript/4-combining-types/6.md | 33 +++++ .../4-combining-types/7-instanceof.md | 21 +++ .../4-combining-types/8-type-assertions.md | 34 +++++ public/docs/typescript/4-combining-types/9.md | 14 ++ public/docs/typescript/5-generics/-intro.md | 1 + .../docs/typescript/5-generics/0-generics.md | 32 +++++ .../docs/typescript/5-generics/1-generics.md | 37 ++++++ .../docs/typescript/5-generics/2-generics.md | 39 ++++++ .../docs/typescript/5-generics/3-generics.md | 54 ++++++++ .../5-generics/4-extends-generics.md | 62 +++++++++ public/docs/typescript/5-generics/5.md | 14 ++ public/docs/typescript/5-generics/6.md | 34 +++++ public/docs/typescript/5-generics/7.md | 37 ++++++ public/docs/typescript/6-classes/-intro.md | 3 + .../6-classes/0-js-constructor-extends.md | 50 +++++++ .../docs/typescript/6-classes/1-typescript.md | 41 ++++++ .../6-classes/2-public-private-protected.md | 13 ++ public/docs/typescript/6-classes/3.md | 49 +++++++ .../docs/typescript/6-classes/4-readonly.md | 40 ++++++ .../docs/typescript/6-classes/5-implements.md | 47 +++++++ .../docs/typescript/6-classes/6-abstract.md | 51 +++++++ public/docs/typescript/6-classes/7.md | 14 ++ public/docs/typescript/6-classes/8.md | 24 ++++ public/docs/typescript/6-classes/9.md | 22 ++++ .../typescript/7-async-utilities/-intro.md | 2 + .../7-async-utilities/0-promise-asyncawait.md | 9 ++ public/docs/typescript/7-async-utilities/1.md | 56 ++++++++ .../7-async-utilities/10-mapped-types.md | 19 +++ .../7-async-utilities/11-conditional-types.md | 17 +++ .../docs/typescript/7-async-utilities/12.md | 17 +++ .../docs/typescript/7-async-utilities/13.md | 19 +++ .../docs/typescript/7-async-utilities/14.md | 27 ++++ public/docs/typescript/7-async-utilities/2.md | 9 ++ .../7-async-utilities/3-utility-types.md | 11 ++ public/docs/typescript/7-async-utilities/4.md | 18 +++ .../7-async-utilities/5-partialt.md | 36 +++++ .../7-async-utilities/6-readonlyt.md | 34 +++++ .../typescript/7-async-utilities/7-pickt-k.md | 38 ++++++ .../typescript/7-async-utilities/8-omitt-k.md | 37 ++++++ public/docs/typescript/7-async-utilities/9.md | 9 ++ public/docs/typescript/index.yml | 27 ++++ 804 files changed, 20840 insertions(+) create mode 100644 public/docs/cpp/0-intro/-intro.md create mode 100644 public/docs/cpp/0-intro/0.md create mode 100644 public/docs/cpp/0-intro/1.md create mode 100644 public/docs/cpp/0-intro/10-int-main-main.md create mode 100644 public/docs/cpp/0-intro/11-stdcout-stdendl-namespace.md create mode 100644 public/docs/cpp/0-intro/12.md create mode 100644 public/docs/cpp/0-intro/2.md create mode 100644 public/docs/cpp/0-intro/3.md create mode 100644 public/docs/cpp/0-intro/4-ide.md create mode 100644 public/docs/cpp/0-intro/5.md create mode 100644 public/docs/cpp/0-intro/6.md create mode 100644 public/docs/cpp/0-intro/7.md create mode 100644 public/docs/cpp/0-intro/8.md create mode 100644 public/docs/cpp/0-intro/9-include-iostream.md create mode 100644 public/docs/cpp/1-types-control/-intro.md create mode 100644 public/docs/cpp/1-types-control/0.md create mode 100644 public/docs/cpp/1-types-control/1.md create mode 100644 public/docs/cpp/1-types-control/10.md create mode 100644 public/docs/cpp/1-types-control/11.md create mode 100644 public/docs/cpp/1-types-control/12-2fizzbuzzc.md create mode 100644 public/docs/cpp/1-types-control/2.md create mode 100644 public/docs/cpp/1-types-control/3-const.md create mode 100644 public/docs/cpp/1-types-control/4-auto.md create mode 100644 public/docs/cpp/1-types-control/5-stdcin-stdcout.md create mode 100644 public/docs/cpp/1-types-control/6-if-switch-while-for.md create mode 100644 public/docs/cpp/1-types-control/7.md create mode 100644 public/docs/cpp/1-types-control/8-switch.md create mode 100644 public/docs/cpp/1-types-control/9.md create mode 100644 public/docs/cpp/10-stl-containers/-intro.md create mode 100644 public/docs/cpp/10-stl-containers/0-stl.md create mode 100644 public/docs/cpp/10-stl-containers/1-stdvector.md create mode 100644 public/docs/cpp/10-stl-containers/2-stdmap.md create mode 100644 public/docs/cpp/10-stl-containers/3.md create mode 100644 public/docs/cpp/10-stl-containers/4.md create mode 100644 public/docs/cpp/10-stl-containers/5.md create mode 100644 public/docs/cpp/10-stl-containers/6.md create mode 100644 public/docs/cpp/11-stl-algorithms/-intro.md create mode 100644 public/docs/cpp/11-stl-algorithms/0.md create mode 100644 public/docs/cpp/11-stl-algorithms/1.md create mode 100644 public/docs/cpp/11-stl-algorithms/2-stdsort.md create mode 100644 public/docs/cpp/11-stl-algorithms/3-stdfind.md create mode 100644 public/docs/cpp/11-stl-algorithms/4-stdfor-each.md create mode 100644 public/docs/cpp/11-stl-algorithms/5.md create mode 100644 public/docs/cpp/11-stl-algorithms/6.md create mode 100644 public/docs/cpp/11-stl-algorithms/7.md create mode 100644 public/docs/cpp/11-stl-algorithms/8.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/-intro.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/0-try-catch.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/1.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/2-raii.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/3-newdelete.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/4-stdunique-ptr.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/5-stdshared-ptr.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/6.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/7-1-unique-ptr.md create mode 100644 public/docs/cpp/12-raii-smart-ptrs/8-2-shared-ptr.md create mode 100644 public/docs/cpp/2-data-containers/-intro.md create mode 100644 public/docs/cpp/2-data-containers/0-stdstring.md create mode 100644 public/docs/cpp/2-data-containers/1.md create mode 100644 public/docs/cpp/2-data-containers/2-stdvector.md create mode 100644 public/docs/cpp/2-data-containers/3.md create mode 100644 public/docs/cpp/2-data-containers/4-stdarray.md create mode 100644 public/docs/cpp/2-data-containers/5-for-range-based-for.md create mode 100644 public/docs/cpp/2-data-containers/6.md create mode 100644 public/docs/cpp/2-data-containers/7.md create mode 100644 public/docs/cpp/2-data-containers/8.md create mode 100644 public/docs/cpp/3-pointers/-intro.md create mode 100644 public/docs/cpp/3-pointers/0.md create mode 100644 public/docs/cpp/3-pointers/1.md create mode 100644 public/docs/cpp/3-pointers/10-heap.md create mode 100644 public/docs/cpp/3-pointers/11-new-delete.md create mode 100644 public/docs/cpp/3-pointers/12.md create mode 100644 public/docs/cpp/3-pointers/13.md create mode 100644 public/docs/cpp/3-pointers/14.md create mode 100644 public/docs/cpp/3-pointers/15.md create mode 100644 public/docs/cpp/3-pointers/2-nullptr.md create mode 100644 public/docs/cpp/3-pointers/3.md create mode 100644 public/docs/cpp/3-pointers/4-decay.md create mode 100644 public/docs/cpp/3-pointers/5.md create mode 100644 public/docs/cpp/3-pointers/6-legacy.md create mode 100644 public/docs/cpp/3-pointers/7-char.md create mode 100644 public/docs/cpp/3-pointers/8.md create mode 100644 public/docs/cpp/3-pointers/9-stack.md create mode 100644 public/docs/cpp/4-functions/-intro.md create mode 100644 public/docs/cpp/4-functions/0.md create mode 100644 public/docs/cpp/4-functions/1.md create mode 100644 public/docs/cpp/4-functions/10.md create mode 100644 public/docs/cpp/4-functions/11.md create mode 100644 public/docs/cpp/4-functions/12-1-swap.md create mode 100644 public/docs/cpp/4-functions/13.md create mode 100644 public/docs/cpp/4-functions/2-void.md create mode 100644 public/docs/cpp/4-functions/3.md create mode 100644 public/docs/cpp/4-functions/4-pass-by-value.md create mode 100644 public/docs/cpp/4-functions/5-pass-by-pointer.md create mode 100644 public/docs/cpp/4-functions/6-pass-by-reference.md create mode 100644 public/docs/cpp/4-functions/7-const-pass-by-const-reference.md create mode 100644 public/docs/cpp/4-functions/8.md create mode 100644 public/docs/cpp/4-functions/9-function-overloading.md create mode 100644 public/docs/cpp/5-project-build/-intro.md create mode 100644 public/docs/cpp/5-project-build/0.md create mode 100644 public/docs/cpp/5-project-build/1.md create mode 100644 public/docs/cpp/5-project-build/10.md create mode 100644 public/docs/cpp/5-project-build/11.md create mode 100644 public/docs/cpp/5-project-build/2.md create mode 100644 public/docs/cpp/5-project-build/3.md create mode 100644 public/docs/cpp/5-project-build/4.md create mode 100644 public/docs/cpp/5-project-build/5-pragma-once.md create mode 100644 public/docs/cpp/5-project-build/6.md create mode 100644 public/docs/cpp/5-project-build/7.md create mode 100644 public/docs/cpp/5-project-build/8-makefile.md create mode 100644 public/docs/cpp/5-project-build/9-cmake.md create mode 100644 public/docs/cpp/6-classes-basics/-intro.md create mode 100644 public/docs/cpp/6-classes-basics/0.md create mode 100644 public/docs/cpp/6-classes-basics/1.md create mode 100644 public/docs/cpp/6-classes-basics/2-public-private.md create mode 100644 public/docs/cpp/6-classes-basics/3.md create mode 100644 public/docs/cpp/6-classes-basics/4-constructor.md create mode 100644 public/docs/cpp/6-classes-basics/5-destructor.md create mode 100644 public/docs/cpp/6-classes-basics/6.md create mode 100644 public/docs/cpp/6-classes-basics/7.md create mode 100644 public/docs/cpp/6-classes-basics/8.md create mode 100644 public/docs/cpp/7-classes-advanced/-intro.md create mode 100644 public/docs/cpp/7-classes-advanced/0.md create mode 100644 public/docs/cpp/7-classes-advanced/1.md create mode 100644 public/docs/cpp/7-classes-advanced/10.md create mode 100644 public/docs/cpp/7-classes-advanced/11.md create mode 100644 public/docs/cpp/7-classes-advanced/12.md create mode 100644 public/docs/cpp/7-classes-advanced/13.md create mode 100644 public/docs/cpp/7-classes-advanced/2.md create mode 100644 public/docs/cpp/7-classes-advanced/3.md create mode 100644 public/docs/cpp/7-classes-advanced/4.md create mode 100644 public/docs/cpp/7-classes-advanced/5-static.md create mode 100644 public/docs/cpp/7-classes-advanced/6-static.md create mode 100644 public/docs/cpp/7-classes-advanced/7-static.md create mode 100644 public/docs/cpp/7-classes-advanced/8.md create mode 100644 public/docs/cpp/7-classes-advanced/9-this.md create mode 100644 public/docs/cpp/8-inheritance/-intro.md create mode 100644 public/docs/cpp/8-inheritance/0.md create mode 100644 public/docs/cpp/8-inheritance/1-virtual.md create mode 100644 public/docs/cpp/8-inheritance/2-override.md create mode 100644 public/docs/cpp/8-inheritance/3.md create mode 100644 public/docs/cpp/8-inheritance/4.md create mode 100644 public/docs/cpp/8-inheritance/5.md create mode 100644 public/docs/cpp/8-inheritance/6.md create mode 100644 public/docs/cpp/9-templates/-intro.md create mode 100644 public/docs/cpp/9-templates/0-intdoublestring.md create mode 100644 public/docs/cpp/9-templates/1.md create mode 100644 public/docs/cpp/9-templates/2.md create mode 100644 public/docs/cpp/9-templates/3.md create mode 100644 public/docs/cpp/9-templates/4.md create mode 100644 public/docs/cpp/9-templates/5-1-print.md create mode 100644 public/docs/cpp/9-templates/6.md create mode 100644 public/docs/cpp/index.yml create mode 100644 public/docs/javascript/0-intro/-intro.md create mode 100644 public/docs/javascript/0-intro/0-javascript.md create mode 100644 public/docs/javascript/0-intro/1-vs-nodejs.md create mode 100644 public/docs/javascript/0-intro/2.md create mode 100644 public/docs/javascript/0-intro/3-hello-world.md create mode 100644 public/docs/javascript/0-intro/4-repl-read-eval-print-loop.md create mode 100644 public/docs/javascript/0-intro/5.md create mode 100644 public/docs/javascript/0-intro/6.md create mode 100644 public/docs/javascript/1-basics/-intro.md create mode 100644 public/docs/javascript/1-basics/0-let-const-var.md create mode 100644 public/docs/javascript/1-basics/1-const-let.md create mode 100644 public/docs/javascript/1-basics/10.md create mode 100644 public/docs/javascript/1-basics/11.md create mode 100644 public/docs/javascript/1-basics/12-falsy.md create mode 100644 public/docs/javascript/1-basics/13.md create mode 100644 public/docs/javascript/1-basics/14.md create mode 100644 public/docs/javascript/1-basics/15.md create mode 100644 public/docs/javascript/1-basics/2-var.md create mode 100644 public/docs/javascript/1-basics/3.md create mode 100644 public/docs/javascript/1-basics/4-null-undefined.md create mode 100644 public/docs/javascript/1-basics/5.md create mode 100644 public/docs/javascript/1-basics/6-const.md create mode 100644 public/docs/javascript/1-basics/7.md create mode 100644 public/docs/javascript/1-basics/8.md create mode 100644 public/docs/javascript/1-basics/9.md create mode 100644 public/docs/javascript/2-control/-intro.md create mode 100644 public/docs/javascript/2-control/0-if-switch.md create mode 100644 public/docs/javascript/2-control/1-iftruthy-falsy.md create mode 100644 public/docs/javascript/2-control/10-trycatchfinally.md create mode 100644 public/docs/javascript/2-control/11.md create mode 100644 public/docs/javascript/2-control/12-throw.md create mode 100644 public/docs/javascript/2-control/13.md create mode 100644 public/docs/javascript/2-control/14.md create mode 100644 public/docs/javascript/2-control/15.md create mode 100644 public/docs/javascript/2-control/2-switch.md create mode 100644 public/docs/javascript/2-control/3-for-while.md create mode 100644 public/docs/javascript/2-control/4-for.md create mode 100644 public/docs/javascript/2-control/5-while.md create mode 100644 public/docs/javascript/2-control/6-forof-forin.md create mode 100644 public/docs/javascript/2-control/7-forin.md create mode 100644 public/docs/javascript/2-control/8-forof.md create mode 100644 public/docs/javascript/2-control/9.md create mode 100644 public/docs/javascript/3-functions-closures/-intro.md create mode 100644 public/docs/javascript/3-functions-closures/0.md create mode 100644 public/docs/javascript/3-functions-closures/1-function-declaration.md create mode 100644 public/docs/javascript/3-functions-closures/10.md create mode 100644 public/docs/javascript/3-functions-closures/11.md create mode 100644 public/docs/javascript/3-functions-closures/12.md create mode 100644 public/docs/javascript/3-functions-closures/13.md create mode 100644 public/docs/javascript/3-functions-closures/14.md create mode 100644 public/docs/javascript/3-functions-closures/15.md create mode 100644 public/docs/javascript/3-functions-closures/2-function-expression.md create mode 100644 public/docs/javascript/3-functions-closures/3.md create mode 100644 public/docs/javascript/3-functions-closures/4.md create mode 100644 public/docs/javascript/3-functions-closures/5.md create mode 100644 public/docs/javascript/3-functions-closures/6-rest.md create mode 100644 public/docs/javascript/3-functions-closures/7.md create mode 100644 public/docs/javascript/3-functions-closures/8-rest.md create mode 100644 public/docs/javascript/3-functions-closures/9.md create mode 100644 public/docs/javascript/4-this/-intro.md create mode 100644 public/docs/javascript/4-this/0-this.md create mode 100644 public/docs/javascript/4-this/1.md create mode 100644 public/docs/javascript/4-this/2.md create mode 100644 public/docs/javascript/4-this/3.md create mode 100644 public/docs/javascript/4-this/4-this-bind-call-apply.md create mode 100644 public/docs/javascript/4-this/5-call-apply.md create mode 100644 public/docs/javascript/4-this/6-bind.md create mode 100644 public/docs/javascript/4-this/7-this.md create mode 100644 public/docs/javascript/4-this/8.md create mode 100644 public/docs/javascript/4-this/9.md create mode 100644 public/docs/javascript/5-objects-prototype/-intro.md create mode 100644 public/docs/javascript/5-objects-prototype/0.md create mode 100644 public/docs/javascript/5-objects-prototype/1.md create mode 100644 public/docs/javascript/5-objects-prototype/10.md create mode 100644 public/docs/javascript/5-objects-prototype/11.md create mode 100644 public/docs/javascript/5-objects-prototype/2-this.md create mode 100644 public/docs/javascript/5-objects-prototype/3.md create mode 100644 public/docs/javascript/5-objects-prototype/4-proto-objectgetprototypeof.md create mode 100644 public/docs/javascript/5-objects-prototype/5.md create mode 100644 public/docs/javascript/5-objects-prototype/6-objectcreate.md create mode 100644 public/docs/javascript/5-objects-prototype/7-objectcreate.md create mode 100644 public/docs/javascript/5-objects-prototype/8-new.md create mode 100644 public/docs/javascript/5-objects-prototype/9.md create mode 100644 public/docs/javascript/6-classes/-intro.md create mode 100644 public/docs/javascript/6-classes/0.md create mode 100644 public/docs/javascript/6-classes/1.md create mode 100644 public/docs/javascript/6-classes/2.md create mode 100644 public/docs/javascript/6-classes/3-extends-super.md create mode 100644 public/docs/javascript/6-classes/4-static.md create mode 100644 public/docs/javascript/6-classes/5-static.md create mode 100644 public/docs/javascript/6-classes/6.md create mode 100644 public/docs/javascript/6-classes/7.md create mode 100644 public/docs/javascript/6-classes/8-1-rpg.md create mode 100644 public/docs/javascript/6-classes/9.md create mode 100644 public/docs/javascript/7-arrays/-intro.md create mode 100644 public/docs/javascript/7-arrays/0.md create mode 100644 public/docs/javascript/7-arrays/1-repl.md create mode 100644 public/docs/javascript/7-arrays/10.md create mode 100644 public/docs/javascript/7-arrays/2-splice.md create mode 100644 public/docs/javascript/7-arrays/3.md create mode 100644 public/docs/javascript/7-arrays/4.md create mode 100644 public/docs/javascript/7-arrays/5.md create mode 100644 public/docs/javascript/7-arrays/6.md create mode 100644 public/docs/javascript/7-arrays/7-find-some-every.md create mode 100644 public/docs/javascript/7-arrays/8.md create mode 100644 public/docs/javascript/7-arrays/9.md create mode 100644 public/docs/javascript/8-promise/-intro.md create mode 100644 public/docs/javascript/8-promise/0.md create mode 100644 public/docs/javascript/8-promise/1.md create mode 100644 public/docs/javascript/8-promise/10.md create mode 100644 public/docs/javascript/8-promise/2.md create mode 100644 public/docs/javascript/8-promise/3-promise.md create mode 100644 public/docs/javascript/8-promise/4-promise.md create mode 100644 public/docs/javascript/8-promise/5-promise.md create mode 100644 public/docs/javascript/8-promise/6-then-catch-finally.md create mode 100644 public/docs/javascript/8-promise/7.md create mode 100644 public/docs/javascript/8-promise/8.md create mode 100644 public/docs/javascript/8-promise/9.md create mode 100644 public/docs/javascript/9-async-await/-intro.md create mode 100644 public/docs/javascript/9-async-await/0-asyncawait.md create mode 100644 public/docs/javascript/9-async-await/1-async.md create mode 100644 public/docs/javascript/9-async-await/10.md create mode 100644 public/docs/javascript/9-async-await/11.md create mode 100644 public/docs/javascript/9-async-await/12.md create mode 100644 public/docs/javascript/9-async-await/13-2-fetch.md create mode 100644 public/docs/javascript/9-async-await/2-await.md create mode 100644 public/docs/javascript/9-async-await/3-trycatch.md create mode 100644 public/docs/javascript/9-async-await/4-fetch-api-http.md create mode 100644 public/docs/javascript/9-async-await/5-json-post.md create mode 100644 public/docs/javascript/9-async-await/6-promiseall-promiserace.md create mode 100644 public/docs/javascript/9-async-await/7.md create mode 100644 public/docs/javascript/9-async-await/8-promiseall.md create mode 100644 public/docs/javascript/9-async-await/9-promiserace.md create mode 100644 public/docs/javascript/index.yml create mode 100644 public/docs/python/0-intro/-intro.md create mode 100644 public/docs/python/0-intro/0-python.md create mode 100644 public/docs/python/0-intro/1-python.md create mode 100644 public/docs/python/0-intro/10-main.md create mode 100644 public/docs/python/0-intro/11-pip-venv.md create mode 100644 public/docs/python/0-intro/2-windows.md create mode 100644 public/docs/python/0-intro/3-macos-linux.md create mode 100644 public/docs/python/0-intro/4.md create mode 100644 public/docs/python/0-intro/5-replpython.md create mode 100644 public/docs/python/0-intro/6.md create mode 100644 public/docs/python/0-intro/7.md create mode 100644 public/docs/python/0-intro/8-repl.md create mode 100644 public/docs/python/0-intro/9.md create mode 100644 public/docs/python/1-basics/-intro.md create mode 100644 public/docs/python/1-basics/0.md create mode 100644 public/docs/python/1-basics/1.md create mode 100644 public/docs/python/1-basics/2-int-float.md create mode 100644 public/docs/python/1-basics/3-str.md create mode 100644 public/docs/python/1-basics/4-bool.md create mode 100644 public/docs/python/1-basics/5-type-hints.md create mode 100644 public/docs/python/1-basics/6.md create mode 100644 public/docs/python/1-basics/7.md create mode 100644 public/docs/python/1-basics/8.md create mode 100644 public/docs/python/2-collections/-intro.md create mode 100644 public/docs/python/2-collections/0-list.md create mode 100644 public/docs/python/2-collections/1-tuple.md create mode 100644 public/docs/python/2-collections/2-dictionary.md create mode 100644 public/docs/python/2-collections/3-set.md create mode 100644 public/docs/python/2-collections/4.md create mode 100644 public/docs/python/2-collections/5-comprehensions.md create mode 100644 public/docs/python/2-collections/6.md create mode 100644 public/docs/python/2-collections/7.md create mode 100644 public/docs/python/2-collections/8.md create mode 100644 public/docs/python/3-control-functions/-intro.md create mode 100644 public/docs/python/3-control-functions/0-ifelifelse.md create mode 100644 public/docs/python/3-control-functions/1-forrangeenumerate.md create mode 100644 public/docs/python/3-control-functions/10-lambda-expressions.md create mode 100644 public/docs/python/3-control-functions/11.md create mode 100644 public/docs/python/3-control-functions/12.md create mode 100644 public/docs/python/3-control-functions/13.md create mode 100644 public/docs/python/3-control-functions/2-range.md create mode 100644 public/docs/python/3-control-functions/3-enumerate.md create mode 100644 public/docs/python/3-control-functions/4-while.md create mode 100644 public/docs/python/3-control-functions/5-def.md create mode 100644 public/docs/python/3-control-functions/6.md create mode 100644 public/docs/python/3-control-functions/7-args-kwargs.md create mode 100644 public/docs/python/3-control-functions/8-args.md create mode 100644 public/docs/python/3-control-functions/9-kwargs.md create mode 100644 public/docs/python/4-modules/-intro.md create mode 100644 public/docs/python/4-modules/0.md create mode 100644 public/docs/python/4-modules/1-import.md create mode 100644 public/docs/python/4-modules/10-2json.md create mode 100644 public/docs/python/4-modules/2.md create mode 100644 public/docs/python/4-modules/3.md create mode 100644 public/docs/python/4-modules/4-init-py.md create mode 100644 public/docs/python/4-modules/5-python.md create mode 100644 public/docs/python/4-modules/6.md create mode 100644 public/docs/python/4-modules/7.md create mode 100644 public/docs/python/4-modules/8.md create mode 100644 public/docs/python/4-modules/9.md create mode 100644 public/docs/python/5-oop/-intro.md create mode 100644 public/docs/python/5-oop/0-class.md create mode 100644 public/docs/python/5-oop/1-init-self.md create mode 100644 public/docs/python/5-oop/2.md create mode 100644 public/docs/python/5-oop/3.md create mode 100644 public/docs/python/5-oop/4.md create mode 100644 public/docs/python/5-oop/5.md create mode 100644 public/docs/python/5-oop/6-str-repr.md create mode 100644 public/docs/python/5-oop/7.md create mode 100644 public/docs/python/5-oop/8.md create mode 100644 public/docs/python/5-oop/9-1-book.md create mode 100644 public/docs/python/6-file-io/-intro.md create mode 100644 public/docs/python/6-file-io/0-open.md create mode 100644 public/docs/python/6-file-io/1.md create mode 100644 public/docs/python/6-file-io/10.md create mode 100644 public/docs/python/6-file-io/11-2-csv.md create mode 100644 public/docs/python/6-file-io/2.md create mode 100644 public/docs/python/6-file-io/3.md create mode 100644 public/docs/python/6-file-io/4-with.md create mode 100644 public/docs/python/6-file-io/5-jsonjson.md create mode 100644 public/docs/python/6-file-io/6-csvcsv.md create mode 100644 public/docs/python/6-file-io/7-csv.md create mode 100644 public/docs/python/6-file-io/8-csv.md create mode 100644 public/docs/python/6-file-io/9.md create mode 100644 public/docs/python/7-exceptions/-intro.md create mode 100644 public/docs/python/7-exceptions/0-tryexcept.md create mode 100644 public/docs/python/7-exceptions/1.md create mode 100644 public/docs/python/7-exceptions/2-raise.md create mode 100644 public/docs/python/7-exceptions/3-elsefinally.md create mode 100644 public/docs/python/7-exceptions/4.md create mode 100644 public/docs/python/7-exceptions/5.md create mode 100644 public/docs/python/7-exceptions/6.md create mode 100644 public/docs/python/8-generators-decorators/-intro.md create mode 100644 public/docs/python/8-generators-decorators/0.md create mode 100644 public/docs/python/8-generators-decorators/1-yield.md create mode 100644 public/docs/python/8-generators-decorators/2.md create mode 100644 public/docs/python/8-generators-decorators/3.md create mode 100644 public/docs/python/8-generators-decorators/4.md create mode 100644 public/docs/python/8-generators-decorators/5.md create mode 100644 public/docs/python/8-generators-decorators/6.md create mode 100644 public/docs/python/8-generators-decorators/7.md create mode 100644 public/docs/python/index.yml create mode 100644 public/docs/ruby/0-intro/-intro.md create mode 100644 public/docs/ruby/0-intro/0-ruby.md create mode 100644 public/docs/ruby/0-intro/1.md create mode 100644 public/docs/ruby/0-intro/2.md create mode 100644 public/docs/ruby/0-intro/3-irb.md create mode 100644 public/docs/ruby/0-intro/4-hello-world.md create mode 100644 public/docs/ruby/0-intro/5-irb.md create mode 100644 public/docs/ruby/0-intro/6.md create mode 100644 public/docs/ruby/1-basics/-intro.md create mode 100644 public/docs/ruby/1-basics/0.md create mode 100644 public/docs/ruby/1-basics/1-ruby.md create mode 100644 public/docs/ruby/1-basics/2-nil-false.md create mode 100644 public/docs/ruby/1-basics/3-symbol.md create mode 100644 public/docs/ruby/1-basics/4.md create mode 100644 public/docs/ruby/1-basics/5.md create mode 100644 public/docs/ruby/1-basics/6.md create mode 100644 public/docs/ruby/1-basics/7.md create mode 100644 public/docs/ruby/10-testing/-intro.md create mode 100644 public/docs/ruby/10-testing/0-minitest.md create mode 100644 public/docs/ruby/10-testing/1.md create mode 100644 public/docs/ruby/10-testing/10-assert-raisesexception.md create mode 100644 public/docs/ruby/10-testing/11-tdd.md create mode 100644 public/docs/ruby/10-testing/12-red.md create mode 100644 public/docs/ruby/10-testing/13-green.md create mode 100644 public/docs/ruby/10-testing/14-refactor.md create mode 100644 public/docs/ruby/10-testing/15.md create mode 100644 public/docs/ruby/10-testing/16-1-string.md create mode 100644 public/docs/ruby/10-testing/17-2-tdduser.md create mode 100644 public/docs/ruby/10-testing/2.md create mode 100644 public/docs/ruby/10-testing/3.md create mode 100644 public/docs/ruby/10-testing/4.md create mode 100644 public/docs/ruby/10-testing/5-assert-equal-assert.md create mode 100644 public/docs/ruby/10-testing/6-assert-equalexpected-actual.md create mode 100644 public/docs/ruby/10-testing/7-asserttest.md create mode 100644 public/docs/ruby/10-testing/8-refutetest.md create mode 100644 public/docs/ruby/10-testing/9-assert-nilobj.md create mode 100644 public/docs/ruby/11-metaprogramming/-intro.md create mode 100644 public/docs/ruby/11-metaprogramming/0-ruby.md create mode 100644 public/docs/ruby/11-metaprogramming/1-send.md create mode 100644 public/docs/ruby/11-metaprogramming/2-define-method.md create mode 100644 public/docs/ruby/11-metaprogramming/3-method-missing.md create mode 100644 public/docs/ruby/11-metaprogramming/4-rails.md create mode 100644 public/docs/ruby/11-metaprogramming/5.md create mode 100644 public/docs/ruby/11-metaprogramming/6.md create mode 100644 public/docs/ruby/11-metaprogramming/7.md create mode 100644 public/docs/ruby/2-control-methods/-intro.md create mode 100644 public/docs/ruby/2-control-methods/0.md create mode 100644 public/docs/ruby/2-control-methods/1-if-else-elsif.md create mode 100644 public/docs/ruby/2-control-methods/10.md create mode 100644 public/docs/ruby/2-control-methods/11.md create mode 100644 public/docs/ruby/2-control-methods/12-splat.md create mode 100644 public/docs/ruby/2-control-methods/13.md create mode 100644 public/docs/ruby/2-control-methods/14-begin-rescue-ensure.md create mode 100644 public/docs/ruby/2-control-methods/15-raise.md create mode 100644 public/docs/ruby/2-control-methods/16.md create mode 100644 public/docs/ruby/2-control-methods/17.md create mode 100644 public/docs/ruby/2-control-methods/18.md create mode 100644 public/docs/ruby/2-control-methods/2-unless.md create mode 100644 public/docs/ruby/2-control-methods/3-case.md create mode 100644 public/docs/ruby/2-control-methods/4.md create mode 100644 public/docs/ruby/2-control-methods/5-while.md create mode 100644 public/docs/ruby/2-control-methods/6-until.md create mode 100644 public/docs/ruby/2-control-methods/7-def.md create mode 100644 public/docs/ruby/2-control-methods/8-return.md create mode 100644 public/docs/ruby/2-control-methods/9.md create mode 100644 public/docs/ruby/3-everything-object/-intro.md create mode 100644 public/docs/ruby/3-everything-object/0-ruby-5times.md create mode 100644 public/docs/ruby/3-everything-object/1-nil.md create mode 100644 public/docs/ruby/3-everything-object/2.md create mode 100644 public/docs/ruby/3-everything-object/3.md create mode 100644 public/docs/ruby/3-everything-object/4-string.md create mode 100644 public/docs/ruby/3-everything-object/5-integer-float.md create mode 100644 public/docs/ruby/3-everything-object/6.md create mode 100644 public/docs/ruby/3-everything-object/7.md create mode 100644 public/docs/ruby/3-everything-object/8.md create mode 100644 public/docs/ruby/4-collections/-intro.md create mode 100644 public/docs/ruby/4-collections/0-array.md create mode 100644 public/docs/ruby/4-collections/1.md create mode 100644 public/docs/ruby/4-collections/10.md create mode 100644 public/docs/ruby/4-collections/11.md create mode 100644 public/docs/ruby/4-collections/12.md create mode 100644 public/docs/ruby/4-collections/2.md create mode 100644 public/docs/ruby/4-collections/3.md create mode 100644 public/docs/ruby/4-collections/4-hash.md create mode 100644 public/docs/ruby/4-collections/5.md create mode 100644 public/docs/ruby/4-collections/6-range.md create mode 100644 public/docs/ruby/4-collections/7.md create mode 100644 public/docs/ruby/4-collections/8.md create mode 100644 public/docs/ruby/4-collections/9.md create mode 100644 public/docs/ruby/5-blocks-iterators/-intro.md create mode 100644 public/docs/ruby/5-blocks-iterators/0-doend.md create mode 100644 public/docs/ruby/5-blocks-iterators/1.md create mode 100644 public/docs/ruby/5-blocks-iterators/10.md create mode 100644 public/docs/ruby/5-blocks-iterators/11.md create mode 100644 public/docs/ruby/5-blocks-iterators/12.md create mode 100644 public/docs/ruby/5-blocks-iterators/2-each.md create mode 100644 public/docs/ruby/5-blocks-iterators/3-map-collect.md create mode 100644 public/docs/ruby/5-blocks-iterators/4-select-filter.md create mode 100644 public/docs/ruby/5-blocks-iterators/5-find-detect.md create mode 100644 public/docs/ruby/5-blocks-iterators/6-enumerable.md create mode 100644 public/docs/ruby/5-blocks-iterators/7-for.md create mode 100644 public/docs/ruby/5-blocks-iterators/8.md create mode 100644 public/docs/ruby/5-blocks-iterators/9-yield.md create mode 100644 public/docs/ruby/6-classes/-intro.md create mode 100644 public/docs/ruby/6-classes/0-class-initialize.md create mode 100644 public/docs/ruby/6-classes/1-var.md create mode 100644 public/docs/ruby/6-classes/10-super.md create mode 100644 public/docs/ruby/6-classes/11-super.md create mode 100644 public/docs/ruby/6-classes/12.md create mode 100644 public/docs/ruby/6-classes/13-1-book.md create mode 100644 public/docs/ruby/6-classes/14-2-ebook.md create mode 100644 public/docs/ruby/6-classes/2.md create mode 100644 public/docs/ruby/6-classes/3.md create mode 100644 public/docs/ruby/6-classes/4-attr-reader-attr-writer-attr-a.md create mode 100644 public/docs/ruby/6-classes/5.md create mode 100644 public/docs/ruby/6-classes/6-attr.md create mode 100644 public/docs/ruby/6-classes/7-var-selfmethod-name.md create mode 100644 public/docs/ruby/6-classes/8-var.md create mode 100644 public/docs/ruby/6-classes/9-selfmethod-name.md create mode 100644 public/docs/ruby/7-modules/-intro.md create mode 100644 public/docs/ruby/7-modules/0-module-2.md create mode 100644 public/docs/ruby/7-modules/1.md create mode 100644 public/docs/ruby/7-modules/2-include.md create mode 100644 public/docs/ruby/7-modules/3-include-vs-extend.md create mode 100644 public/docs/ruby/7-modules/4-public-private-protected.md create mode 100644 public/docs/ruby/7-modules/5.md create mode 100644 public/docs/ruby/7-modules/6.md create mode 100644 public/docs/ruby/7-modules/7-2-protected.md create mode 100644 public/docs/ruby/8-proc-lambda/-intro.md create mode 100644 public/docs/ruby/8-proc-lambda/0-proc.md create mode 100644 public/docs/ruby/8-proc-lambda/1-procnew-lambda.md create mode 100644 public/docs/ruby/8-proc-lambda/10.md create mode 100644 public/docs/ruby/8-proc-lambda/2-return.md create mode 100644 public/docs/ruby/8-proc-lambda/3.md create mode 100644 public/docs/ruby/8-proc-lambda/4.md create mode 100644 public/docs/ruby/8-proc-lambda/5-proc.md create mode 100644 public/docs/ruby/8-proc-lambda/6-proc.md create mode 100644 public/docs/ruby/8-proc-lambda/7.md create mode 100644 public/docs/ruby/8-proc-lambda/8.md create mode 100644 public/docs/ruby/8-proc-lambda/9-1-lambda.md create mode 100644 public/docs/ruby/9-stdlib/-intro.md create mode 100644 public/docs/ruby/9-stdlib/0-file-dir-pathname.md create mode 100644 public/docs/ruby/9-stdlib/1-file.md create mode 100644 public/docs/ruby/9-stdlib/10.md create mode 100644 public/docs/ruby/9-stdlib/2-dirpathname.md create mode 100644 public/docs/ruby/9-stdlib/3-time-date.md create mode 100644 public/docs/ruby/9-stdlib/4-json-json.md create mode 100644 public/docs/ruby/9-stdlib/5-regexp-match.md create mode 100644 public/docs/ruby/9-stdlib/6-match.md create mode 100644 public/docs/ruby/9-stdlib/7-scan-gsub.md create mode 100644 public/docs/ruby/9-stdlib/8.md create mode 100644 public/docs/ruby/9-stdlib/9-1-json.md create mode 100644 public/docs/ruby/index.yml create mode 100644 public/docs/rust/0-intro/-intro.md create mode 100644 public/docs/rust/0-intro/0-rust.md create mode 100644 public/docs/rust/0-intro/1-memory-safety.md create mode 100644 public/docs/rust/0-intro/10-cargo.md create mode 100644 public/docs/rust/0-intro/11.md create mode 100644 public/docs/rust/0-intro/12-rustfmt.md create mode 100644 public/docs/rust/0-intro/13-clippy.md create mode 100644 public/docs/rust/0-intro/2-zero-cost-abstractions.md create mode 100644 public/docs/rust/0-intro/3-fearless-concurrency.md create mode 100644 public/docs/rust/0-intro/4.md create mode 100644 public/docs/rust/0-intro/5-rustup.md create mode 100644 public/docs/rust/0-intro/6-hello-world-rustc.md create mode 100644 public/docs/rust/0-intro/7.md create mode 100644 public/docs/rust/0-intro/8-cargorust.md create mode 100644 public/docs/rust/0-intro/9-cargo-new.md create mode 100644 public/docs/rust/1-basics/-intro.md create mode 100644 public/docs/rust/1-basics/0-let-vs-let-mut.md create mode 100644 public/docs/rust/1-basics/1-immutable.md create mode 100644 public/docs/rust/1-basics/2-mutable.md create mode 100644 public/docs/rust/1-basics/3-shadowing.md create mode 100644 public/docs/rust/1-basics/4.md create mode 100644 public/docs/rust/1-basics/5.md create mode 100644 public/docs/rust/1-basics/6.md create mode 100644 public/docs/rust/1-basics/7.md create mode 100644 public/docs/rust/1-basics/8.md create mode 100644 public/docs/rust/1-basics/9.md create mode 100644 public/docs/rust/10-generics-traits/-intro.md create mode 100644 public/docs/rust/10-generics-traits/0-rust.md create mode 100644 public/docs/rust/10-generics-traits/1.md create mode 100644 public/docs/rust/10-generics-traits/10.md create mode 100644 public/docs/rust/10-generics-traits/11.md create mode 100644 public/docs/rust/10-generics-traits/12.md create mode 100644 public/docs/rust/10-generics-traits/2.md create mode 100644 public/docs/rust/10-generics-traits/3.md create mode 100644 public/docs/rust/10-generics-traits/4.md create mode 100644 public/docs/rust/10-generics-traits/5.md create mode 100644 public/docs/rust/10-generics-traits/6.md create mode 100644 public/docs/rust/10-generics-traits/7-trait-bounds.md create mode 100644 public/docs/rust/10-generics-traits/8.md create mode 100644 public/docs/rust/10-generics-traits/9-where.md create mode 100644 public/docs/rust/11-lifetimes/-intro.md create mode 100644 public/docs/rust/11-lifetimes/0.md create mode 100644 public/docs/rust/11-lifetimes/1.md create mode 100644 public/docs/rust/11-lifetimes/2.md create mode 100644 public/docs/rust/11-lifetimes/3.md create mode 100644 public/docs/rust/11-lifetimes/4.md create mode 100644 public/docs/rust/11-lifetimes/5.md create mode 100644 public/docs/rust/11-lifetimes/6-static.md create mode 100644 public/docs/rust/11-lifetimes/7.md create mode 100644 public/docs/rust/11-lifetimes/8.md create mode 100644 public/docs/rust/11-lifetimes/9.md create mode 100644 public/docs/rust/2-functions-control/-intro.md create mode 100644 public/docs/rust/2-functions-control/0.md create mode 100644 public/docs/rust/2-functions-control/1.md create mode 100644 public/docs/rust/2-functions-control/2-statementexpression.md create mode 100644 public/docs/rust/2-functions-control/3.md create mode 100644 public/docs/rust/2-functions-control/4.md create mode 100644 public/docs/rust/2-functions-control/5.md create mode 100644 public/docs/rust/2-functions-control/6.md create mode 100644 public/docs/rust/2-functions-control/7.md create mode 100644 public/docs/rust/2-functions-control/8.md create mode 100644 public/docs/rust/3-ownership/-intro.md create mode 100644 public/docs/rust/3-ownership/0.md create mode 100644 public/docs/rust/3-ownership/1-stack.md create mode 100644 public/docs/rust/3-ownership/10.md create mode 100644 public/docs/rust/3-ownership/11.md create mode 100644 public/docs/rust/3-ownership/12.md create mode 100644 public/docs/rust/3-ownership/13.md create mode 100644 public/docs/rust/3-ownership/2-heap.md create mode 100644 public/docs/rust/3-ownership/3.md create mode 100644 public/docs/rust/3-ownership/4.md create mode 100644 public/docs/rust/3-ownership/5-move-vs-copy.md create mode 100644 public/docs/rust/3-ownership/6-copy.md create mode 100644 public/docs/rust/3-ownership/7-move.md create mode 100644 public/docs/rust/3-ownership/8-clone.md create mode 100644 public/docs/rust/3-ownership/9.md create mode 100644 public/docs/rust/4-borrowing-slices/-intro.md create mode 100644 public/docs/rust/4-borrowing-slices/0-1-mut.md create mode 100644 public/docs/rust/4-borrowing-slices/1-immutable-reference.md create mode 100644 public/docs/rust/4-borrowing-slices/10-str.md create mode 100644 public/docs/rust/4-borrowing-slices/11.md create mode 100644 public/docs/rust/4-borrowing-slices/12.md create mode 100644 public/docs/rust/4-borrowing-slices/13.md create mode 100644 public/docs/rust/4-borrowing-slices/14.md create mode 100644 public/docs/rust/4-borrowing-slices/2-mutable-reference.md create mode 100644 public/docs/rust/4-borrowing-slices/3.md create mode 100644 public/docs/rust/4-borrowing-slices/4.md create mode 100644 public/docs/rust/4-borrowing-slices/5.md create mode 100644 public/docs/rust/4-borrowing-slices/6.md create mode 100644 public/docs/rust/4-borrowing-slices/7-4-slice.md create mode 100644 public/docs/rust/4-borrowing-slices/8-str.md create mode 100644 public/docs/rust/4-borrowing-slices/9.md create mode 100644 public/docs/rust/5-structs-methods/-intro.md create mode 100644 public/docs/rust/5-structs-methods/0.md create mode 100644 public/docs/rust/5-structs-methods/1.md create mode 100644 public/docs/rust/5-structs-methods/10-associated-functions.md create mode 100644 public/docs/rust/5-structs-methods/11.md create mode 100644 public/docs/rust/5-structs-methods/12-1-rpg.md create mode 100644 public/docs/rust/5-structs-methods/13.md create mode 100644 public/docs/rust/5-structs-methods/2.md create mode 100644 public/docs/rust/5-structs-methods/3.md create mode 100644 public/docs/rust/5-structs-methods/4.md create mode 100644 public/docs/rust/5-structs-methods/5-tuple-structs.md create mode 100644 public/docs/rust/5-structs-methods/6-unit-like-structs.md create mode 100644 public/docs/rust/5-structs-methods/7.md create mode 100644 public/docs/rust/5-structs-methods/8-impl.md create mode 100644 public/docs/rust/5-structs-methods/9.md create mode 100644 public/docs/rust/6-enums-pattern/-intro.md create mode 100644 public/docs/rust/6-enums-pattern/0-enum.md create mode 100644 public/docs/rust/6-enums-pattern/1.md create mode 100644 public/docs/rust/6-enums-pattern/10.md create mode 100644 public/docs/rust/6-enums-pattern/11.md create mode 100644 public/docs/rust/6-enums-pattern/12.md create mode 100644 public/docs/rust/6-enums-pattern/2.md create mode 100644 public/docs/rust/6-enums-pattern/3-optiont-null.md create mode 100644 public/docs/rust/6-enums-pattern/4.md create mode 100644 public/docs/rust/6-enums-pattern/5-match.md create mode 100644 public/docs/rust/6-enums-pattern/6.md create mode 100644 public/docs/rust/6-enums-pattern/7-optiont-match.md create mode 100644 public/docs/rust/6-enums-pattern/8.md create mode 100644 public/docs/rust/6-enums-pattern/9-if-let.md create mode 100644 public/docs/rust/7-modules/-intro.md create mode 100644 public/docs/rust/7-modules/0.md create mode 100644 public/docs/rust/7-modules/1-mod.md create mode 100644 public/docs/rust/7-modules/10.md create mode 100644 public/docs/rust/7-modules/11.md create mode 100644 public/docs/rust/7-modules/12.md create mode 100644 public/docs/rust/7-modules/2-pub.md create mode 100644 public/docs/rust/7-modules/3.md create mode 100644 public/docs/rust/7-modules/4-use.md create mode 100644 public/docs/rust/7-modules/5.md create mode 100644 public/docs/rust/7-modules/6.md create mode 100644 public/docs/rust/7-modules/7.md create mode 100644 public/docs/rust/7-modules/8-cargotoml.md create mode 100644 public/docs/rust/7-modules/9.md create mode 100644 public/docs/rust/8-collections-strings/-intro.md create mode 100644 public/docs/rust/8-collections-strings/0-vect.md create mode 100644 public/docs/rust/8-collections-strings/1.md create mode 100644 public/docs/rust/8-collections-strings/10-api.md create mode 100644 public/docs/rust/8-collections-strings/11.md create mode 100644 public/docs/rust/8-collections-strings/12.md create mode 100644 public/docs/rust/8-collections-strings/13-2-pig-latin.md create mode 100644 public/docs/rust/8-collections-strings/2.md create mode 100644 public/docs/rust/8-collections-strings/3-string-utf-8.md create mode 100644 public/docs/rust/8-collections-strings/4-string-str.md create mode 100644 public/docs/rust/8-collections-strings/5.md create mode 100644 public/docs/rust/8-collections-strings/6.md create mode 100644 public/docs/rust/8-collections-strings/7-hashmapk-v.md create mode 100644 public/docs/rust/8-collections-strings/8.md create mode 100644 public/docs/rust/8-collections-strings/9.md create mode 100644 public/docs/rust/9-error-handling/-intro.md create mode 100644 public/docs/rust/9-error-handling/0.md create mode 100644 public/docs/rust/9-error-handling/1-panic.md create mode 100644 public/docs/rust/9-error-handling/10.md create mode 100644 public/docs/rust/9-error-handling/11.md create mode 100644 public/docs/rust/9-error-handling/2-resultt-e.md create mode 100644 public/docs/rust/9-error-handling/3-result.md create mode 100644 public/docs/rust/9-error-handling/4-unwrap-expect.md create mode 100644 public/docs/rust/9-error-handling/5-unwrap.md create mode 100644 public/docs/rust/9-error-handling/6-expect.md create mode 100644 public/docs/rust/9-error-handling/7.md create mode 100644 public/docs/rust/9-error-handling/8.md create mode 100644 public/docs/rust/9-error-handling/9.md create mode 100644 public/docs/rust/index.yml create mode 100644 public/docs/typescript/0-intro/-intro.md create mode 100644 public/docs/typescript/0-intro/0-typescript.md create mode 100644 public/docs/typescript/0-intro/1-typescript.md create mode 100644 public/docs/typescript/0-intro/2.md create mode 100644 public/docs/typescript/0-intro/3-typescript.md create mode 100644 public/docs/typescript/0-intro/4-typescript.md create mode 100644 public/docs/typescript/0-intro/5.md create mode 100644 public/docs/typescript/0-intro/6.md create mode 100644 public/docs/typescript/0-intro/7-tsconfigjson.md create mode 100644 public/docs/typescript/0-intro/8.md create mode 100644 public/docs/typescript/1-types/-intro.md create mode 100644 public/docs/typescript/1-types/0-1-type-annotations.md create mode 100644 public/docs/typescript/1-types/1.md create mode 100644 public/docs/typescript/1-types/10.md create mode 100644 public/docs/typescript/1-types/11.md create mode 100644 public/docs/typescript/1-types/12-2-unknown.md create mode 100644 public/docs/typescript/1-types/2-3-type-inference.md create mode 100644 public/docs/typescript/1-types/3-4-any-unknown-never.md create mode 100644 public/docs/typescript/1-types/4-any.md create mode 100644 public/docs/typescript/1-types/5-unknown.md create mode 100644 public/docs/typescript/1-types/6-never.md create mode 100644 public/docs/typescript/1-types/7.md create mode 100644 public/docs/typescript/1-types/8-array.md create mode 100644 public/docs/typescript/1-types/9-tuple.md create mode 100644 public/docs/typescript/2-objects-interfaces/-intro.md create mode 100644 public/docs/typescript/2-objects-interfaces/0.md create mode 100644 public/docs/typescript/2-objects-interfaces/1-type.md create mode 100644 public/docs/typescript/2-objects-interfaces/2-interface.md create mode 100644 public/docs/typescript/2-objects-interfaces/3-type-vs-interface.md create mode 100644 public/docs/typescript/2-objects-interfaces/4.md create mode 100644 public/docs/typescript/2-objects-interfaces/5-readonly.md create mode 100644 public/docs/typescript/2-objects-interfaces/6.md create mode 100644 public/docs/typescript/2-objects-interfaces/7.md create mode 100644 public/docs/typescript/2-objects-interfaces/8.md create mode 100644 public/docs/typescript/3-function-types/-intro.md create mode 100644 public/docs/typescript/3-function-types/0.md create mode 100644 public/docs/typescript/3-function-types/1.md create mode 100644 public/docs/typescript/3-function-types/10.md create mode 100644 public/docs/typescript/3-function-types/11.md create mode 100644 public/docs/typescript/3-function-types/12.md create mode 100644 public/docs/typescript/3-function-types/2.md create mode 100644 public/docs/typescript/3-function-types/3.md create mode 100644 public/docs/typescript/3-function-types/4-this.md create mode 100644 public/docs/typescript/3-function-types/5.md create mode 100644 public/docs/typescript/3-function-types/6-this.md create mode 100644 public/docs/typescript/3-function-types/7.md create mode 100644 public/docs/typescript/3-function-types/8-rest-parameters.md create mode 100644 public/docs/typescript/3-function-types/9.md create mode 100644 public/docs/typescript/4-combining-types/-intro.md create mode 100644 public/docs/typescript/4-combining-types/0-union.md create mode 100644 public/docs/typescript/4-combining-types/1-literal.md create mode 100644 public/docs/typescript/4-combining-types/10.md create mode 100644 public/docs/typescript/4-combining-types/11.md create mode 100644 public/docs/typescript/4-combining-types/2-intersection.md create mode 100644 public/docs/typescript/4-combining-types/3-null-undefined.md create mode 100644 public/docs/typescript/4-combining-types/4-type-guards.md create mode 100644 public/docs/typescript/4-combining-types/5-typeof.md create mode 100644 public/docs/typescript/4-combining-types/6.md create mode 100644 public/docs/typescript/4-combining-types/7-instanceof.md create mode 100644 public/docs/typescript/4-combining-types/8-type-assertions.md create mode 100644 public/docs/typescript/4-combining-types/9.md create mode 100644 public/docs/typescript/5-generics/-intro.md create mode 100644 public/docs/typescript/5-generics/0-generics.md create mode 100644 public/docs/typescript/5-generics/1-generics.md create mode 100644 public/docs/typescript/5-generics/2-generics.md create mode 100644 public/docs/typescript/5-generics/3-generics.md create mode 100644 public/docs/typescript/5-generics/4-extends-generics.md create mode 100644 public/docs/typescript/5-generics/5.md create mode 100644 public/docs/typescript/5-generics/6.md create mode 100644 public/docs/typescript/5-generics/7.md create mode 100644 public/docs/typescript/6-classes/-intro.md create mode 100644 public/docs/typescript/6-classes/0-js-constructor-extends.md create mode 100644 public/docs/typescript/6-classes/1-typescript.md create mode 100644 public/docs/typescript/6-classes/2-public-private-protected.md create mode 100644 public/docs/typescript/6-classes/3.md create mode 100644 public/docs/typescript/6-classes/4-readonly.md create mode 100644 public/docs/typescript/6-classes/5-implements.md create mode 100644 public/docs/typescript/6-classes/6-abstract.md create mode 100644 public/docs/typescript/6-classes/7.md create mode 100644 public/docs/typescript/6-classes/8.md create mode 100644 public/docs/typescript/6-classes/9.md create mode 100644 public/docs/typescript/7-async-utilities/-intro.md create mode 100644 public/docs/typescript/7-async-utilities/0-promise-asyncawait.md create mode 100644 public/docs/typescript/7-async-utilities/1.md create mode 100644 public/docs/typescript/7-async-utilities/10-mapped-types.md create mode 100644 public/docs/typescript/7-async-utilities/11-conditional-types.md create mode 100644 public/docs/typescript/7-async-utilities/12.md create mode 100644 public/docs/typescript/7-async-utilities/13.md create mode 100644 public/docs/typescript/7-async-utilities/14.md create mode 100644 public/docs/typescript/7-async-utilities/2.md create mode 100644 public/docs/typescript/7-async-utilities/3-utility-types.md create mode 100644 public/docs/typescript/7-async-utilities/4.md create mode 100644 public/docs/typescript/7-async-utilities/5-partialt.md create mode 100644 public/docs/typescript/7-async-utilities/6-readonlyt.md create mode 100644 public/docs/typescript/7-async-utilities/7-pickt-k.md create mode 100644 public/docs/typescript/7-async-utilities/8-omitt-k.md create mode 100644 public/docs/typescript/7-async-utilities/9.md create mode 100644 public/docs/typescript/index.yml diff --git a/public/docs/cpp/0-intro/-intro.md b/public/docs/cpp/0-intro/-intro.md new file mode 100644 index 0000000..e2f1a1a --- /dev/null +++ b/public/docs/cpp/0-intro/-intro.md @@ -0,0 +1 @@ +C++プログラミングの党䜓像を掎む章ぞようこそ 🎉 この章では、あなたがこれたでに培っおきたプログラミングの知識を土台に、C++ならではの特城や文化に觊れおいきたす。他の蚀語ずの違いを意識しながら、たずは「**゜ヌスコヌドを曞き、コンパむルしお実行する**」ずいうC++の基本的な開発フロヌを䜓隓したしょう。 diff --git a/public/docs/cpp/0-intro/0.md b/public/docs/cpp/0-intro/0.md new file mode 100644 index 0000000..cfd2251 --- /dev/null +++ b/public/docs/cpp/0-intro/0.md @@ -0,0 +1,9 @@ +--- +id: cpp-intro-0 +title: C++ずは +level: 2 +--- + +## C++ずは + +C++は、C蚀語を拡匵しお䜜られた、非垞にパワフルで汎甚性の高いプログラミング蚀語です。その歎史は叀く、1983幎にBjarne Stroustrupによっお開発が始たりたした。 diff --git a/public/docs/cpp/0-intro/1.md b/public/docs/cpp/0-intro/1.md new file mode 100644 index 0000000..8e05231 --- /dev/null +++ b/public/docs/cpp/0-intro/1.md @@ -0,0 +1,14 @@ +--- +id: cpp-intro-1 +title: 特城 +level: 3 +--- + +### 特城 + +他の蚀語ず比范したC++の特城は以䞋の通りです。 + + * **パフォヌマンス 🚀:** C++は、OSやハヌドりェアに近い䜎レベルな操䜜が可胜で、実行速床が非垞に高速です。このため、パフォヌマンスが最重芁芖される堎面で絶倧な信頌を埗おいたす。 + * **静的型付け:** 倉数の型はコンパむル時に決定されたす。これにより、実行前に倚くの゚ラヌを発芋でき、倧芏暡な開発でもコヌドの安党性を保ちやすくなりたす。 + * **マルチパラダむム:** 手続き型プログラミング、オブゞェクト指向プログラミング、ゞェネリックプログラミングなど、様々なプログラミングスタむルをサポヌトしおいたす。これにより、問題の性質に合わせお最適なアプロヌチを遞択できたす。 + * **C蚀語ずの互換性:** C蚀語のコヌドの倚くは、ほずんどそのたたC++のコヌドずしおコンパむルできたす。C蚀語で曞かれた膚倧な゜フトりェア資産を掻甚できるのは倧きな利点です。 diff --git a/public/docs/cpp/0-intro/10-int-main-main.md b/public/docs/cpp/0-intro/10-int-main-main.md new file mode 100644 index 0000000..add6e99 --- /dev/null +++ b/public/docs/cpp/0-intro/10-int-main-main.md @@ -0,0 +1,12 @@ +--- +id: cpp-intro-10-int-main-main +title: int main() - main関数 +level: 3 +--- + +### `int main()` - main関数 + +`main`関数は、C++プログラムの゚ントリヌポむント**実行開始点**です。OSはプログラムを実行するずき、たずこの`main`関数を呌び出したす。 + + * `int`: `main`関数が敎数 (integer) の倀を返すこずを瀺したす。この戻り倀はプログラムの終了ステヌタスずしおOSに枡され、`0` は**正垞終了**を意味するのが慣䟋です。 + * `()`: 関数が匕数を取らないこずを瀺しおいたす。匕数を取るこずも可胜です diff --git a/public/docs/cpp/0-intro/11-stdcout-stdendl-namespace.md b/public/docs/cpp/0-intro/11-stdcout-stdendl-namespace.md new file mode 100644 index 0000000..d46d6c0 --- /dev/null +++ b/public/docs/cpp/0-intro/11-stdcout-stdendl-namespace.md @@ -0,0 +1,12 @@ +--- +id: cpp-intro-11-stdcout-stdendl-name +title: 'std::cout ず std::endl - 名前空間 (namespace)' +level: 3 +--- + +### `std::cout` ず `std::endl` - 名前空間 (namespace) + + * `std::cout`: "character output stream" の略で、コン゜ヌルぞの暙準出力を担圓したす。 + * `<<`: **ストリヌム挿入挔算子**ず呌ばれ、右偎のデヌタを巊偎のストリヌムここでは `std::cout`に流し蟌むむメヌゞです。 + * `std::endl`: "end line" の略で、改行を出力し、出力バッファをフラッシュ匷制的に出力したす。 + * `std::`: `cout` や `endl` が `std` ずいう**名前空間 (namespace)** に属しおいるこずを瀺したす。名前空間は、倧芏暡なプログラムで関数や倉数の名前が衝突するのを防ぐための仕組みです。`std` はC++の暙準ラむブラリが定矩されおいる名前空間です。 diff --git a/public/docs/cpp/0-intro/12.md b/public/docs/cpp/0-intro/12.md new file mode 100644 index 0000000..5ec490e --- /dev/null +++ b/public/docs/cpp/0-intro/12.md @@ -0,0 +1,14 @@ +--- +id: cpp-intro-12 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * C++は、**パフォヌマンス**ず**倚機胜性**を䞡立した匷力なプログラミング蚀語です。 + * C++の開発フロヌは、「**゜ヌスコヌド䜜成 → コンパむル → 実行**」が基本です。 + * すべおのC++プログラムは `main` 関数から実行が始たりたす。 + * `#include` で倖郚ラむブラリの機胜を読み蟌み、`namespace` で名前の衝突を避けたす。 + +これであなたもC++プログラマの仲間入りです次の章では、C++の根幹をなす型システムずメモリの仕組みに぀いお孊んでいきたしょう。 diff --git a/public/docs/cpp/0-intro/2.md b/public/docs/cpp/0-intro/2.md new file mode 100644 index 0000000..454d177 --- /dev/null +++ b/public/docs/cpp/0-intro/2.md @@ -0,0 +1,14 @@ +--- +id: cpp-intro-2 +title: C++が䜿われる分野 +level: 3 +--- + +### C++が䜿われる分野 + +その高いパフォヌマンスず柔軟性から、C++は以䞋のような幅広い分野の第䞀線で掻躍しおいたす。 + + * **ゲヌム開発:** Unreal EngineやUnity䞀郚など、倚くの有名ゲヌム゚ンゞンがC++で開発されおいたす。キャラクタヌの物理挔算やリアルタむムグラフィックス描画など、速床が求められる凊理に䞍可欠です。 + * **OS開発:** Windows, macOS, Linuxずいった䞻芁なオペレヌティングシステムのカヌネルやシステムコンポヌネントの倚くがC++で蚘述されおいたす。 + * **金融システム:** 1ミリ秒を争う高頻床取匕HFTシステムなど、超䜎遅延が求められる金融アプリケヌションで䜿甚されおいたす。 + * **組み蟌みシステム・IoT:** 自動車の゚ンゞン制埡ナニットECUや家電、産業甚ロボットなど、リ゜ヌスが限られた環境でも高速に動䜜する必芁がありたす。 diff --git a/public/docs/cpp/0-intro/3.md b/public/docs/cpp/0-intro/3.md new file mode 100644 index 0000000..391970b --- /dev/null +++ b/public/docs/cpp/0-intro/3.md @@ -0,0 +1,11 @@ +--- +id: cpp-intro-3 +title: 開発環境のセットアップ +level: 2 +--- + +## 開発環境のセットアップ + +C++プログラムを実行するには、**コンパむラ**が必芁です。コンパむラは、人間が曞いたC++の゜ヌスコヌドを、コンピュヌタが理解できる機械語に翻蚳するツヌルです。 + +このりェブサむト䞊ではブラりザ䞊でコヌドを線集し実行できる環境を提䟛しおおり、特別なセットアップは䞍芁です。しかし、ロヌカル環境でC++を孊びたい堎合は、以䞋のようなコンパむラずIDE統合開発環境をむンストヌルするこずをお勧めしたす。 diff --git a/public/docs/cpp/0-intro/4-ide.md b/public/docs/cpp/0-intro/4-ide.md new file mode 100644 index 0000000..c73bb74 --- /dev/null +++ b/public/docs/cpp/0-intro/4-ide.md @@ -0,0 +1,15 @@ +--- +id: cpp-intro-4-ide +title: コンパむラずIDE +level: 3 +--- + +### コンパむラずIDE + +* **コンパむラ:** + * **GCC (GNU Compiler Collection):** Linuxで暙準的に䜿われるコンパむラ。Windows (MinGW/MSYS2) やmacOSでも利甚可胜です。 + * **Clang:** AppleのXcodeで暙準的に䜿われおいるコンパむラ。゚ラヌメッセヌゞが分かりやすいず評刀です。 + * **MSVC (Microsoft Visual C++):** MicrosoftのVisual Studioに付属するコンパむラ。Windows開発の暙準です。 +* **IDE (統合開発環境) / ゚ディタ:** + * **Visual Studio (Windows):** コンパむラ、゚ディタ、デバッガなど、C++開発に必芁な党おが詰たった匷力なIDEです。初心者には特におすすめです。 + * **Visual Studio Code (Windows/macOS/Linux):** 軜量な゚ディタですが、拡匵機胜を入れるこずで匷力なC++開発環境を構築できたす。 diff --git a/public/docs/cpp/0-intro/5.md b/public/docs/cpp/0-intro/5.md new file mode 100644 index 0000000..a863f82 --- /dev/null +++ b/public/docs/cpp/0-intro/5.md @@ -0,0 +1,11 @@ +--- +id: cpp-intro-5 +title: おすすめのセットアップ +level: 3 +--- + +### おすすめのセットアップ + + * **Windows:** **Visual Studio Community** をむンストヌルするのが最も簡単です。むンストヌラヌで「C++によるデスクトップ開発」ワヌクロヌドを遞択すれば、必芁なものがすべお揃いたす。 + * **macOS:** タヌミナルで `xcode-select --install` を実行し、**Xcode Command Line Tools** をむンストヌルしたす。これにはClangコンパむラが含たれたす。゚ディタは **Visual Studio Code** がおすすめです。 + * **Linux (Ubuntu/Debianç³»):** タヌミナルで `sudo apt update && sudo apt install build-essential g++` を実行しおGCCコンパむラをむンストヌルしたす。゚ディタは **Visual Studio Code** がおすすめです。 diff --git a/public/docs/cpp/0-intro/6.md b/public/docs/cpp/0-intro/6.md new file mode 100644 index 0000000..fab3967 --- /dev/null +++ b/public/docs/cpp/0-intro/6.md @@ -0,0 +1,22 @@ +--- +id: cpp-intro-6 +title: 最初のプログラム +level: 2 +--- + +## 最初のプログラム + +環境が敎ったら、さっそく定番の "Hello, World\!" プログラムを䜜成し、C++開発の流れを掎みたしょう。 + +`main.cpp` ずいう名前でファむルを䜜成し、以䞋のコヌドを蚘述しおください。 + +```cpp:main.cpp +// 画面に "Hello, World!" ず衚瀺するプログラム + +#include + +int main() { + std::cout << "Hello, World!" << std::endl; + return 0; +} +``` diff --git a/public/docs/cpp/0-intro/7.md b/public/docs/cpp/0-intro/7.md new file mode 100644 index 0000000..099c126 --- /dev/null +++ b/public/docs/cpp/0-intro/7.md @@ -0,0 +1,35 @@ +--- +id: cpp-intro-7 +title: コンパむルず実行 +level: 3 +--- + +### コンパむルず実行 + +このコヌドを実行するには、たず**コンパむル**しお実行可胜ファむルを生成する必芁がありたす。タヌミナルWindowsの堎合はコマンドプロンプトやPowerShellで以䞋のコマンドを実行したす。 + +```bash +# g++ (GCC) たたは clang++ (Clang) を䜿っおコンパむル +# -o main は出力ファむル名を main にするずいう意味 +g++ main.cpp -o main + +# 生成された実行可胜ファむルを実行 +./main +``` + +```powershell +# Visual C++ (MSVC) を䜿う堎合 +cl main.cpp /Fe:main.exe + +# 生成された実行可胜ファむルを実行 +main.exe +``` + +このりェブサむト䞊の実行環境で動かす堎合は、以䞋の実行ボタンをクリックしおください。 +実行するず、タヌミナルに以䞋のように衚瀺されるはずです。 + +```cpp-exec:main.cpp +Hello, World! +``` + +PythonやJavaScriptのようなむンタプリタ蚀語ずは異なり、C++では「コンパむル」ずいう䞀手間が必芁です。このステップにより、実行前にコヌド党䜓がチェックされ、高速なネむティブコヌドが生成されたす。 diff --git a/public/docs/cpp/0-intro/8.md b/public/docs/cpp/0-intro/8.md new file mode 100644 index 0000000..239bc95 --- /dev/null +++ b/public/docs/cpp/0-intro/8.md @@ -0,0 +1,9 @@ +--- +id: cpp-intro-8 +title: C++の基本構造 +level: 2 +--- + +## C++の基本構造 + +先ほどの "Hello, World\!" プログラムには、C++の基本的な芁玠が詰たっおいたす。䞀぀ず぀芋おいきたしょう。 diff --git a/public/docs/cpp/0-intro/9-include-iostream.md b/public/docs/cpp/0-intro/9-include-iostream.md new file mode 100644 index 0000000..db0971b --- /dev/null +++ b/public/docs/cpp/0-intro/9-include-iostream.md @@ -0,0 +1,12 @@ +--- +id: cpp-intro-9-include-iostream +title: '#include - ヘッダファむルのむンクルヌド' +level: 3 +--- + +### `#include ` - ヘッダファむルのむンクルヌド + +`#include` は、他のファむルに曞かれた機胜を利甚するための**プリプロセッサ呜什**です。ここでは、コン゜ヌルぞの入出力機胜を提䟛する `iostream` ずいう暙準ラむブラリのヘッダファむルを読み蟌んでいたす。これにより、`std::cout` などが䜿えるようになりたす。 + + * `< >` で囲む: 暙準ラむブラリのヘッダファむルをむンクルヌドする堎合 + * `" "` で囲む: 自分で䜜成したヘッダファむルをむンクルヌドする堎合 (埌の章で孊びたす) diff --git a/public/docs/cpp/1-types-control/-intro.md b/public/docs/cpp/1-types-control/-intro.md new file mode 100644 index 0000000..b6d0979 --- /dev/null +++ b/public/docs/cpp/1-types-control/-intro.md @@ -0,0 +1 @@ +C++は**静的型付け蚀語**です。PythonやJavaScriptのような動的型付け蚀語ずは異なり、コンパむル時に倉数の型が確定しおいる必芁がありたす。これにより、実行時の゚ラヌを未然に防ぎ、高いパフォヌマンスを実珟したす。 diff --git a/public/docs/cpp/1-types-control/0.md b/public/docs/cpp/1-types-control/0.md new file mode 100644 index 0000000..f266316 --- /dev/null +++ b/public/docs/cpp/1-types-control/0.md @@ -0,0 +1,16 @@ +--- +id: cpp-types-control-0 +title: 基本的なデヌタ型 +level: 2 +--- + +## 基本的なデヌタ型 + +C++には倚くの型がありたすが、たずは以䞋の基本型を抌さえたしょう。 + + * **敎数型**: `int` (通垞4バむト), `long long` (8バむト, 倧きな敎数) + * **浮動小数点型**: `double` (倍粟床, 基本的にこれを䜿う), `float` (単粟床) + * **文字型**: `char` (1バむト文字), `std::string` (文字列クラス。厳密には基本型ではありたせんが、実甚䞊必須) + * **ブヌル型**: `bool` (`true` たたは `false`) + +C++では倉数のサむズビット幅が環境によっお異なる堎合がありたすが、珟代的な環境では `int` は32bit以䞊であるこずが保蚌されおいたす。 diff --git a/public/docs/cpp/1-types-control/1.md b/public/docs/cpp/1-types-control/1.md new file mode 100644 index 0000000..926ad7c --- /dev/null +++ b/public/docs/cpp/1-types-control/1.md @@ -0,0 +1,38 @@ +--- +id: cpp-types-control-1 +title: '倉数の初期化ナニフォヌム初期化 {}' +level: 2 +--- + +## 倉数の初期化ナニフォヌム初期化 `{}` + +C++には倉数を初期化する方法がいく぀もありたすが、C++11以降では **波括匧 `{}` を䜿った初期化ナニフォヌム初期化** が掚奚されおいたす。 + +なぜ `{}` が良いのでしょうか それは、**瞮小倉換Narrowing Conversion** を防げるからです。䟋えば、少数のデヌタを敎数型倉数に無理やり入れようずした時、`=` なら黙っお切り捚おられたすが、`{}` ならコンパむル゚ラヌにしおくれたす。 + +```cpp:initialization.cpp +#include + +int main() { + // 掚奚波括匧による初期化 + int age{25}; // int age = 25; ず同じだがより安党 + double weight{65.5}; + bool is_student{false}; + + // 瞮小倉換の防止コメントアりトを倖すずコンパむル゚ラヌになりたす + // int height{170.5}; // ゚ラヌ doubleからintぞの情報の欠萜を防ぐ + + // 埓来の方法を䜿うも間違いではありたせんが、譊告が出ないこずがありたす + int rough_height = 170.9; // 170に切り捚おられる゚ラヌにならない + + std::cout << "Alice is " << age << " years old." << std::endl; + std::cout << "Height (rough): " << rough_height << std::endl; + + return 0; +} +``` + +```cpp-exec:initialization.cpp +Alice is 25 years old. +Height (rough): 170 +``` diff --git a/public/docs/cpp/1-types-control/10.md b/public/docs/cpp/1-types-control/10.md new file mode 100644 index 0000000..3523a5c --- /dev/null +++ b/public/docs/cpp/1-types-control/10.md @@ -0,0 +1,13 @@ +--- +id: cpp-types-control-10 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **型システム**: `int`, `double`, `bool` などの基本型があり、静的に管理される。 + * **初期化**: `int x{10};` のような波括匧 `{}` を䜿う初期化が掚奚される瞮小倉換の防止。 + * **型掚論ず定数**: `auto` で型掚論を行い、倉曎しない倉数には `const` を付ける。 + * **入出力**: `std::cout`, `std::cin` を䜿い、`<<`, `>>` 挔算子でデヌタを流す。 + * **制埡構文**: 基本は他蚀語ず同じだが、`switch` のフォヌルスルヌ挙動などに泚意する。 diff --git a/public/docs/cpp/1-types-control/11.md b/public/docs/cpp/1-types-control/11.md new file mode 100644 index 0000000..1d83838 --- /dev/null +++ b/public/docs/cpp/1-types-control/11.md @@ -0,0 +1,28 @@ +--- +id: cpp-types-control-11 +title: 緎習問題1うるう幎刀定機 +level: 2 +--- + +## 緎習問題1うるう幎刀定機 + +西暊敎数を倉数 `year` に代入し、その幎がうるう幎かどうかを刀定しお結果を出力するプログラムを曞いおください。 + +> **うるう幎の条件** +> +> 1. 4で割り切れる幎はうるう幎である。 +> 2. ただし、100で割り切れる幎はうるう幎ではない。 +> 3. ただし、400で割り切れる幎はうるう幎である。 + +```cpp:practice2_1.cpp +#include + +int main() { + const int year = 2025; + + // ここにコヌドを曞く +} +``` + +```cpp-exec:practice2_1.cpp +``` diff --git a/public/docs/cpp/1-types-control/12-2fizzbuzzc.md b/public/docs/cpp/1-types-control/12-2fizzbuzzc.md new file mode 100644 index 0000000..51fba38 --- /dev/null +++ b/public/docs/cpp/1-types-control/12-2fizzbuzzc.md @@ -0,0 +1,27 @@ +--- +id: cpp-types-control-12-2fizzbuzzc +title: 緎習問題2FizzBuzzC++スタむル +level: 3 +--- + +### 緎習問題2FizzBuzzC++スタむル + +1から20たでの敎数を順に出力するルヌプを䜜成しおください。ただし、以䞋のルヌルに埓っおください。 + + * 数倀が3で割り切れるずきは数倀の代わりに "Fizz" ず出力。 + * 数倀が5で割り切れるずきは数倀の代わりに "Buzz" ず出力。 + * 䞡方で割り切れるずきは "FizzBuzz" ず出力。 + * それ以倖は数倀をそのたた出力。 + +出力はスペヌス区切りたたは改行区切りどちらでも構いたせん。倉数の初期化には `{}` を、ルヌプカりンタの型には `auto` を䜿甚しおみおください。 + +```cpp:practice2_2.cpp +#include + +int main() { + +} +``` + +```cpp-exec:practice2_2.cpp +``` diff --git a/public/docs/cpp/1-types-control/2.md b/public/docs/cpp/1-types-control/2.md new file mode 100644 index 0000000..9ea7531 --- /dev/null +++ b/public/docs/cpp/1-types-control/2.md @@ -0,0 +1,9 @@ +--- +id: cpp-types-control-2 +title: 型を厳密に扱う +level: 2 +--- + +## 型を厳密に扱う + +静的型付けの恩恵を最倧限に受けるために、C++には型をより安党か぀䟿利に扱うための仕組みがありたす。 diff --git a/public/docs/cpp/1-types-control/3-const.md b/public/docs/cpp/1-types-control/3-const.md new file mode 100644 index 0000000..d2468f5 --- /dev/null +++ b/public/docs/cpp/1-types-control/3-const.md @@ -0,0 +1,35 @@ +--- +id: cpp-types-control-3-const +title: constによる䞍倉性の保蚌 +level: 3 +--- + +### `const`による䞍倉性の保蚌 + +`const` (constantの略) は、倉数を**読み取り専甚**にするためのキヌワヌドです。䞀床`const`で初期化された倉数の倀は、埌から倉曎しようずするずコンパむル゚ラヌになりたす。 + +なぜ`const`が重芁なのでしょうか + + * **安党性の向䞊**: 倉曎されるべきでない倀を誀っお倉曎しおしたうバグを防ぎたす。 + * **意図の明確化**: プログラムを読む人に察しお、「この倀は倉わらない」ずいう意図を明確に䌝えられたす。 + +円呚率のように、プログラム䞭で決しお倉わるこずのない倀に`const`を䜿うのが兞型的な䟋です。 + +```cpp:const_example.cpp +#include + +int main() { + const double PI = 3.14159; + int radius = 5; + + double area = PI * radius * radius; + std::cout << "Area: " << area << std::endl; + + // PI = 3.14; // この行はコンパむル゚ラヌになる + + return 0; +} +``` +```cpp-exec:const_example.cpp +Area: 78.5397 +``` diff --git a/public/docs/cpp/1-types-control/4-auto.md b/public/docs/cpp/1-types-control/4-auto.md new file mode 100644 index 0000000..16f28e6 --- /dev/null +++ b/public/docs/cpp/1-types-control/4-auto.md @@ -0,0 +1,25 @@ +--- +id: cpp-types-control-4-auto +title: autoによる型掚論 +level: 3 +--- + +### `auto`による型掚論 + +C++11から導入された`auto`キヌワヌドを䜿うず、コンパむラが初期化匏から倉数の型を自動で掚論しおくれたす。これにより、特に型名が長い堎合にコヌドを簡朔に曞くこずができたす。 + +```cpp +// autoを䜿わない堎合 +std::vector::iterator it = my_vector.begin(); + +// autoを䜿う堎合 +auto it = my_vector.begin(); // コンパむラが it の型を std::vector::iterator ず掚論しおくれる +``` + +ただし、`auto`はあくたで「型を曞く手間を省く」ものであり、倉数が型を持たないわけではありたせん動的型付け蚀語ずは異なりたす。初期化ず同時に䜿う必芁があり、型が明確な堎面で適切に䜿うこずが掚奚されたす。 + +```cpp +auto x = 10; // x は int型になる +auto y = 3.14; // y は double型になる +auto z = "hello"; // z は const char* (C蚀語スタむルの文字列) になるので泚意 +``` diff --git a/public/docs/cpp/1-types-control/5-stdcin-stdcout.md b/public/docs/cpp/1-types-control/5-stdcin-stdcout.md new file mode 100644 index 0000000..31231ae --- /dev/null +++ b/public/docs/cpp/1-types-control/5-stdcin-stdcout.md @@ -0,0 +1,36 @@ +--- +id: cpp-types-control-5-stdcin-stdcout +title: 'コン゜ヌル入出力 (std::cin, std::cout)' +level: 2 +--- + +## コン゜ヌル入出力 (`std::cin`, `std::cout`) + +C蚀語の `printf`/`scanf` ず異なり、C++ではストリヌムデヌタの流れずしお入出力を扱いたす。型指定子`%d`などを芚える必芁がなく、型安党です。 + + * `std::cout << 倀`: 出力Console OUT + * `std::cin >> 倉数`: 入力Console IN + * `std::endl`: 改行を行い、バッファをフラッシュする。 + +> my.code(); の実行環境には入力機胜がないので、コヌド䟋だけ瀺したす: + +```cpp +#include +#include + +int main() { + int id; + std::string name; + + // 耇数の倀を出力する堎合、<< で連結したす + std::cout << "Enter ID and Name: "; + + // キヌボヌドから "101 Bob" のように入力されるのを埅぀ + std::cin >> id >> name; + + std::cout << "User: " << name << " (ID: " << id << ")" << std::endl; + // User: Bob (ID: 101) + + return 0; +} +``` diff --git a/public/docs/cpp/1-types-control/6-if-switch-while-for.md b/public/docs/cpp/1-types-control/6-if-switch-while-for.md new file mode 100644 index 0000000..c8d7fa7 --- /dev/null +++ b/public/docs/cpp/1-types-control/6-if-switch-while-for.md @@ -0,0 +1,9 @@ +--- +id: cpp-types-control-6-if-switch-while-for +title: 制埡構文if, switch, while, for +level: 2 +--- + +## 制埡構文if, switch, while, for + +他のC系蚀語Java, C\#, JSなどずほが同じですが、いく぀か泚意点がありたす。 diff --git a/public/docs/cpp/1-types-control/7.md b/public/docs/cpp/1-types-control/7.md new file mode 100644 index 0000000..84a33df --- /dev/null +++ b/public/docs/cpp/1-types-control/7.md @@ -0,0 +1,9 @@ +--- +id: cpp-types-control-7 +title: if文 +level: 3 +--- + +### if文 + +`if (条件匏)` の条件匏は `bool` に倉換可胜なものである必芁がありたす。C++では `0` は `false`、それ以倖は `true` ずみなされたす。 diff --git a/public/docs/cpp/1-types-control/8-switch.md b/public/docs/cpp/1-types-control/8-switch.md new file mode 100644 index 0000000..e746f45 --- /dev/null +++ b/public/docs/cpp/1-types-control/8-switch.md @@ -0,0 +1,9 @@ +--- +id: cpp-types-control-8-switch +title: switch文ずフォヌルスルヌ +level: 3 +--- + +### switch文ずフォヌルスルヌ + +`switch` 文は `break` を曞かない限り、次の `case` ぞ凊理が流れたすフォヌルスルヌ。意図的なフォヌルスルヌでない限り、`break` を忘れないように泚意が必芁です。C++17以降では `[[fallthrough]];` 属性を぀けるこずで、「意図的なものである」ずコンパむラに䌝え、譊告を抑制できたす。 diff --git a/public/docs/cpp/1-types-control/9.md b/public/docs/cpp/1-types-control/9.md new file mode 100644 index 0000000..a81cd6a --- /dev/null +++ b/public/docs/cpp/1-types-control/9.md @@ -0,0 +1,60 @@ +--- +id: cpp-types-control-9 +title: ルヌプ構文 +level: 3 +--- + +### ルヌプ構文 + +`while`, `for` も暙準的です。 + +```cpp:control.cpp +#include + +int main() { + // --- if文 --- + const int score = 85; + if (score >= 90) { + std::cout << "Grade: A" << std::endl; + } else if (score >= 80) { + std::cout << "Grade: B" << std::endl; + } else { + std::cout << "Grade: C or below" << std::endl; + } + + // --- switch文 --- + const int rank = 2; + std::cout << "Rank " << rank << ": "; + + switch (rank) { + case 1: + std::cout << "Gold" << std::endl; + break; + case 2: + std::cout << "Silver" << std::endl; + // breakを忘れるずcase 3も実行される + [[fallthrough]]; // C++17: 意図的に䞋に流すこずを明瀺 + case 3: + std::cout << "(Medalist)" << std::endl; + break; + default: + std::cout << "Participant" << std::endl; + } + + // --- 基本的なforルヌプ --- + std::cout << "Countdown: "; + for (int i = 3; i > 0; --i) { + std::cout << i << " "; + } + std::cout << "Start!" << std::endl; + + return 0; +} +``` + +```cpp-exec:control.cpp +Grade: B +Rank 2: Silver +(Medalist) +Countdown: 3 2 1 Start! +``` diff --git a/public/docs/cpp/10-stl-containers/-intro.md b/public/docs/cpp/10-stl-containers/-intro.md new file mode 100644 index 0000000..e12e2c9 --- /dev/null +++ b/public/docs/cpp/10-stl-containers/-intro.md @@ -0,0 +1 @@ +C++の倧きな魅力の䞀぀に、**暙準テンプレヌトラむブラリ (Standard Template Library, STL)** の存圚がありたす。STLは、よく䜿われるデヌタ構造やアルゎリズムを、汎甚的か぀効率的に実装したラむブラリ矀です。この章では、STLの心臓郚である**コンテナ**に焊点を圓お、デヌタの栌玍ず管理を劇的に楜にする方法を孊びたす。 diff --git a/public/docs/cpp/10-stl-containers/0-stl.md b/public/docs/cpp/10-stl-containers/0-stl.md new file mode 100644 index 0000000..4abcb4a --- /dev/null +++ b/public/docs/cpp/10-stl-containers/0-stl.md @@ -0,0 +1,15 @@ +--- +id: cpp-stl-containers-0-stl +title: 'STLの党䜓像: コンテナ、アルゎリズム、むテレヌタ' +level: 2 +--- + +## STLの党䜓像: コンテナ、アルゎリズム、むテレヌタ + +STLは、䞻に3぀の芁玠から構成されおいたす。 + +1. **コンテナ (Containers)**: デヌタを栌玍するためのデヌタ構造です。`vector`可倉長配列や`map`連想配列など、様々な皮類がありたす。 +2. **アルゎリズム (Algorithms)**: ゜ヌト、怜玢、倉換など、コンテナ䞊のデヌタに察しお操䜜を行う関数矀です。 +3. **むテレヌタ (Iterators)**: コンテナの芁玠を指し瀺し、アルゎリズムがコンテナの皮類に䟝存せずに各芁玠にアクセスするための統䞀的なむンタヌフェヌスを提䟛したす。ポむンタを䞀般化したようなものです。 + +これら3぀が連携するこずで、C++プログラマは効率的で再利甚性の高いコヌドを玠早く曞くこずができたす。この章では「コンテナ」を、次の章では「アルゎリズム」ず、それらを぀なぐ「むテレヌタ」の応甚を詳しく芋おいきたす。 diff --git a/public/docs/cpp/10-stl-containers/1-stdvector.md b/public/docs/cpp/10-stl-containers/1-stdvector.md new file mode 100644 index 0000000..0a06bee --- /dev/null +++ b/public/docs/cpp/10-stl-containers/1-stdvector.md @@ -0,0 +1,74 @@ +--- +id: cpp-stl-containers-1-stdvector +title: 'std::vector: 最もよく䜿う可倉長配列' +level: 2 +--- + +## std::vector: 最もよく䜿う可倉長配列 + +`std::vector`は、最も基本的で最もよく䜿われるコンテナです。他の蚀語でいうずころの「リスト」や「動的配列」に盞圓し、芁玠を連続したメモリ領域に栌玍したす。 + +**䞻な特城**: + + * **動的なサむズ**: 必芁に応じお自動的にサむズが拡匵されたす。 + * **高速なランダムアクセス**: むンデックス添字を䜿っお `[i]` の圢匏で芁玠に高速にアクセスできたす (`O(1)`)。 + * **末尟ぞの高速な远加・削陀**: `push_back()` や `pop_back()` を䜿った末尟ぞの操䜜は非垞に高速です。 + +`std::vector`を䜿うには、``ヘッダをむンクルヌドする必芁がありたす。 + +```cpp:vector_example.cpp +#include +#include +#include + +int main() { + // string型の芁玠を栌玍するvectorを䜜成 + std::vector names; + + // push_backで末尟に芁玠を远加 + names.push_back("Alice"); + names.push_back("Bob"); + names.push_back("Charlie"); + + // むンデックスを䜿った芁玠ぞのアクセス + std::cout << "Index 1: " << names[1] << std::endl; + + // 範囲for文 (range-based for loop) を䜿った党芁玠の走査 + std::cout << "\nAll names:" << std::endl; + for (const std::string& name : names) { + std::cout << "- " << name << std::endl; + } + + // size()で珟圚の芁玠数を取埗 + std::cout << "\nCurrent size: " << names.size() << std::endl; + + // pop_backで末尟の芁玠を削陀 + names.pop_back(); // "Charlie"を削陀 + + std::cout << "\nAfter pop_back:" << std::endl; + for (const std::string& name : names) { + std::cout << "- " << name << std::endl; + } + std::cout << "Current size: " << names.size() << std::endl; + + return 0; +} +``` + +```cpp-exec:vector_example.cpp +Index 1: Bob + +All names: +- Alice +- Bob +- Charlie + +Current size: 3 + +After pop_back: +- Alice +- Bob +Current size: 2 +``` + +`std::vector`は、どのコンテナを䜿うか迷ったら、たず最初に怜蚎すべきデフォルトの遞択肢ず蚀えるほど䞇胜です。 diff --git a/public/docs/cpp/10-stl-containers/2-stdmap.md b/public/docs/cpp/10-stl-containers/2-stdmap.md new file mode 100644 index 0000000..5b6d9fb --- /dev/null +++ b/public/docs/cpp/10-stl-containers/2-stdmap.md @@ -0,0 +1,83 @@ +--- +id: cpp-stl-containers-2-stdmap +title: 'std::map: キヌず倀のペアを管理する連想配列' +level: 2 +--- + +## std::map: キヌず倀のペアを管理する連想配列 + +`std::map`は、キヌ (key) ず倀 (value) のペアを管理するためのコンテナです。他の蚀語の「蟞曞 (dictionary)」や「ハッシュマップ (hash map)」に䌌おいたす。キヌを䜿っお倀を高速に怜玢、远加、削陀できたす。 + +**䞻な特城**: + + * **キヌによる高速な怜玢**: キヌに基づいお芁玠が自動的に゜ヌトされお栌玍されるため、怜玢、挿入、削陀が高速です (`O(log n)`)。 + * **䞀意なキヌ**: `std::map`内のキヌは重耇したせん。同じキヌで倀を挿入しようずするず、既存の倀が䞊曞きされたす。 + +`std::map`を䜿うには、``ヘッダをむンクルヌドする必芁がありたす。 + +```cpp:map_example.cpp +#include +#include +#include + +int main() { + // キヌがstring型、倀がint型のmapを䜜成 + std::map scores; + + // []挔算子で芁玠を远加・曎新 + scores["Alice"] = 95; + scores["Bob"] = 88; + scores["Charlie"] = 76; + + // []挔算子で倀にアクセス + std::cout << "Bob's score: " << scores["Bob"] << std::endl; + + // 新しいキヌで远加 + scores["David"] = 100; + + // 既存のキヌの倀を曎新 + scores["Alice"] = 98; + + // 範囲for文を䜿った党芁玠の走査 + // autoキヌワヌドを䜿うず型掚論が効いお䟿利 + std::cout << "\nAll scores:" << std::endl; + for (const auto& pair : scores) { + std::cout << "- " << pair.first << ": " << pair.second << std::endl; + } + + // count()でキヌの存圚を確認 + std::string search_key = "Charlie"; + if (scores.count(search_key)) { + std::cout << "\n" << search_key << " is in the map." << std::endl; + } + + // erase()で芁玠を削陀 + scores.erase("Bob"); + + std::cout << "\nAfter erasing Bob:" << std::endl; + for (const auto& pair : scores) { + std::cout << "- " << pair.first << ": " << pair.second << std::endl; + } + + return 0; +} +``` + +```cpp-exec:map_example.cpp +Bob's score: 88 + +All scores: +- Alice: 98 +- Bob: 88 +- Charlie: 76 +- David: 100 + +Charlie is in the map. + +After erasing Bob: +- Alice: 98 +- Charlie: 76 +- David: 100 +``` + +`std::map`は、キヌず倀のペアを効率的に管理したい堎合に非垞に匷力なツヌルです。 diff --git a/public/docs/cpp/10-stl-containers/3.md b/public/docs/cpp/10-stl-containers/3.md new file mode 100644 index 0000000..a5b61c6 --- /dev/null +++ b/public/docs/cpp/10-stl-containers/3.md @@ -0,0 +1,16 @@ +--- +id: cpp-stl-containers-3 +title: 'その他: 目的に応じたコンテナ' +level: 2 +--- + +## その他: 目的に応じたコンテナ + +STLには、他にも特定の目的に特化したコンテナが倚数甚意されおいたす。ここでは代衚的なものをいく぀か玹介したす。 + + * `std::list`: 双方向リスト。芁玠の途䞭ぞの挿入・削陀が非垞に高速 (`O(1)`) ですが、ランダムアクセスはできたせん先頭から順番にたどる必芁がありたす。``ヘッダが必芁です。 + * `std::set`: 重耇しない芁玠の集合を管理したす。芁玠は自動的に゜ヌトされたす。特定の芁玠が集合内に存圚するかどうかを高速に刀定したい堎合 (`O(log n)`) に䟿利です。``ヘッダが必芁です。 + * `std::unordered_map`: `std::map`ず同様にキヌず倀のペアを管理したすが、内郚的にハッシュテヌブルを䜿うため、平均的な怜玢・挿入・削陀がさらに高速 (`O(1)`) です。ただし、芁玠は゜ヌトされたせん。``ヘッダが必芁です。 + * `std::queue`, `std::stack`: それぞれ先入れ先出し (FIFO)、埌入れ先出し (LIFO) のデヌタ構造を実装するためのコンテナアダプタです。 + +どのコンテナを遞択するかは、プログラムの芁件デヌタのアクセスパタヌン、挿入・削陀の頻床などによっお決たりたす。たずは`std::vector`を基本ずし、必芁に応じお他のコンテナを怜蚎するのが良いアプロヌチです。 diff --git a/public/docs/cpp/10-stl-containers/4.md b/public/docs/cpp/10-stl-containers/4.md new file mode 100644 index 0000000..353f954 --- /dev/null +++ b/public/docs/cpp/10-stl-containers/4.md @@ -0,0 +1,13 @@ +--- +id: cpp-stl-containers-4 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **STL**は、**コンテナ**、**アルゎリズム**、**むテレヌタ**の3぀の䞻芁コンポヌネントから構成される、C++の匷力な暙準ラむブラリです。 + * **コンテナ**は、デヌタを栌玍するためのクラスです。 + * `std::vector`は、最も䞀般的に䜿われる動的配列で、高速なランダムアクセスず末尟ぞの簡単な芁玠远加が特城です。 + * `std::map`は、キヌず倀のペアを管理する連想配列で、キヌによる高速な怜玢が可胜です。 + * 他にも`std::list`, `std::set`など、特定の甚途に合わせた様々なコンテナが甚意されおいたす。 diff --git a/public/docs/cpp/10-stl-containers/5.md b/public/docs/cpp/10-stl-containers/5.md new file mode 100644 index 0000000..e2aa2ae --- /dev/null +++ b/public/docs/cpp/10-stl-containers/5.md @@ -0,0 +1,39 @@ +--- +id: cpp-stl-containers-5 +title: '緎習問題1: 数倀ベクタの操䜜' +level: 3 +--- + +### 緎習問題1: 数倀ベクタの操䜜 + +`std::vector`型の敎数のリストに察しお、以䞋の凊理を行うプログラムを䜜成しおください。 + +1. ベクタに栌玍されおいる党おの数倀の合蚈倀を蚈算しお衚瀺する。 +2. ベクタの䞭の最倧倀を怜玢しお衚瀺する。 +3. ベクタの芁玠を逆順にしお、その内容を衚瀺する。ヒント新しいベクタを䜜っおも良いですし、`std::swap`を䜿っおも構いたせん + +```cpp:practice11_1.cpp +#include +#include + +int main() { + std::vector numbers = {3, 5, 2, 8, 6}; + + // 1. 合蚈倀の蚈算 + + + // 2. 最倧倀の怜玢 + + + // 3. 芁玠の逆順衚瀺 + + + return 0; +} +``` + +```cpp-exec:practice11_1.cpp +Sum: 24 +Max: 8 +Reversed: 6 8 2 5 3 +``` diff --git a/public/docs/cpp/10-stl-containers/6.md b/public/docs/cpp/10-stl-containers/6.md new file mode 100644 index 0000000..d23922a --- /dev/null +++ b/public/docs/cpp/10-stl-containers/6.md @@ -0,0 +1,43 @@ +--- +id: cpp-stl-containers-6 +title: '緎習問題2: 簡単な単語カりンタヌ' +level: 3 +--- + +### 緎習問題2: 簡単な単語カりンタヌ + +英文スペヌスで区切られた単語の列を読み蟌み、各単語が䜕回出珟したかをカりントするプログラムを`std::map`を䜿っお䜜成しおください。最埌に、出珟した党単語ずその出珟回数をアルファベット順に衚瀺しおください。 + +> 文字列を単語ごずに分割するには、以䞋のように`std::istringstream`を䜿うず䟿利です。 +```cpp +#include + +std::string text = "this is a sample text"; +std::istringstream iss(text); +std::string word; +while (iss >> word) { + // wordには1単語ず぀栌玍される +} +``` + + + +```cpp:practice11_2.cpp +#include +#include +#include +#include + +int main() { + std::string text = "cpp is fun and cpp is powerful"; + + +} +``` +```cpp-exec:practice11_2.cpp +and: 1 +cpp: 2 +fun: 1 +is: 2 +powerful: 1 +``` diff --git a/public/docs/cpp/11-stl-algorithms/-intro.md b/public/docs/cpp/11-stl-algorithms/-intro.md new file mode 100644 index 0000000..6e0f403 --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/-intro.md @@ -0,0 +1,3 @@ +前の章ではSTLのコンテナに぀いお孊び、様々なデヌタを効率的に栌玍する方法を芋おきたした。しかし、デヌタを栌玍するだけではプログラムは完成したせん。そのデヌタを䞊べ替えたり、怜玢したり、特定の凊理を斜したりずいった「操䜜」が必芁です。 + +この章では、STLのもう䞀぀の匷力な柱である**アルゎリズム**ラむブラリを孊びたす。これらのアルゎリズムは、コンテナ内のデヌタを操䜜するための汎甚的な関数矀です。そしお、アルゎリズムをさらに柔軟か぀匷力にするための珟代的なC++の機胜、**ラムダ匏**に぀いおも解説したす。これらをマスタヌすれば、驚くほど少ないコヌドで耇雑なデヌタ操䜜が実珟できるようになりたす。 diff --git a/public/docs/cpp/11-stl-algorithms/0.md b/public/docs/cpp/11-stl-algorithms/0.md new file mode 100644 index 0000000..4cfde34 --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/0.md @@ -0,0 +1,52 @@ +--- +id: cpp-stl-algorithms-0 +title: むテレヌタコンテナずアルゎリズムを繋ぐ架け橋 +level: 2 +--- + +## むテレヌタコンテナずアルゎリズムを繋ぐ架け橋 + +アルゎリズムは、特定のコンテナ`std::vector` や `std::list` などに盎接䟝存しないように蚭蚈されおいたす。では、どうやっおコンテナ内の芁玠にアクセスするのでしょうかそこで登堎するのが**むテレヌタ (Iterator)** です。 + +むテレヌタは、コンテナ内の芁玠を指し瀺す「ポむンタのような」オブゞェクトです。ポむンタのように `*` で芁玠の倀を参照したり、`++` で次の芁玠に進んだりできたす。 + +ほずんどのコンテナは、以䞋の2぀の重芁なむテレヌタを取埗するメンバ関数を持っおいたす。 + + * `begin()`: コンテナの先頭芁玠を指すむテレヌタを返す。 + * `end()`: コンテナの**最埌の芁玠の次**を指すむテレヌタを返す。これは有効な芁玠を指しおいない「番兵」のような圹割を果たしたす。 + +アルゎリズムは、この `begin()` ず `end()` から埗られるむテレヌタのペアを䜿い、操䜜察象の「範囲」を指定したす。範囲は半開区間 `[begin, end)` で衚され、`begin` が指す芁玠は範囲に含たれ、`end` が指す芁玠は含たれたせん。 + +簡単な䟋を芋おみたしょう。むテレヌタを䜿っお `vector` の党芁玠を衚瀺するコヌドです。 + +```cpp:iterator_example.cpp +#include +#include + +int main() { + std::vector numbers = {0, 1, 2, 3, 4}; + + // むテレヌタを䜿っおコンテナを走査 + std::cout << "Numbers: "; + for (auto it = numbers.begin(); it != numbers.end(); ++it) { + std::cout << *it << " "; // *it で芁玠の倀にアクセス + } + std::cout << std::endl; + + // C++11以降の範囲ベヌスforルヌプ (内郚ではむテレヌタが䜿われおいる) + std::cout << "Numbers (range-based for): "; + for (int num : numbers) { + std::cout << num << " "; + } + std::cout << std::endl; + + return 0; +} +``` + +```cpp-exec:iterator_example.cpp +Numbers: 0 1 2 3 4 +Numbers (range-based for): 0 1 2 3 4 +``` + +このように、むテレヌタはコンテナの皮類を問わず、統䞀的な方法で芁玠にアクセスする仕組みを提䟛したす。これが、アルゎリズムが様々なコンテナに察しお汎甚的に機胜する理由です。 diff --git a/public/docs/cpp/11-stl-algorithms/1.md b/public/docs/cpp/11-stl-algorithms/1.md new file mode 100644 index 0000000..d810ae4 --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/1.md @@ -0,0 +1,9 @@ +--- +id: cpp-stl-algorithms-1 +title: 䟿利なアルゎリズム +level: 2 +--- + +## 䟿利なアルゎリズム + +C++の暙準ラむブラリには、`` ヘッダず `` ヘッダに数倚くの䟿利なアルゎリズムが甚意されおいたす。ここでは、特によく䜿われるものをいく぀か玹介したす。 diff --git a/public/docs/cpp/11-stl-algorithms/2-stdsort.md b/public/docs/cpp/11-stl-algorithms/2-stdsort.md new file mode 100644 index 0000000..449f859 --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/2-stdsort.md @@ -0,0 +1,45 @@ +--- +id: cpp-stl-algorithms-2-stdsort +title: 'std::sort: 芁玠を䞊べ替える' +level: 3 +--- + +### `std::sort`: 芁玠を䞊べ替える + +名前の通り、指定された範囲の芁玠を゜ヌトしたす。デフォルトでは昇順に䞊べ替えたす。 + +```cpp:sort_example.cpp +#include +#include +#include // std::sort のために必芁 +#include + +int main() { + std::vector numbers = {5, 2, 8, 1, 9}; + + // numbers.begin() から numbers.end() の範囲を゜ヌト + std::sort(numbers.begin(), numbers.end()); + + std::cout << "Sorted numbers: "; + for (int num : numbers) { + std::cout << num << " "; + } + std::cout << std::endl; + + std::vector words = {"banana", "apple", "cherry"}; + std::sort(words.begin(), words.end()); + + std::cout << "Sorted words: "; + for (const auto& word : words) { + std::cout << word << " "; + } + std::cout << std::endl; + + return 0; +} +``` + +```cpp-exec:sort_example.cpp +Sorted numbers: 1 2 5 8 9 +Sorted words: apple banana cherry +``` diff --git a/public/docs/cpp/11-stl-algorithms/3-stdfind.md b/public/docs/cpp/11-stl-algorithms/3-stdfind.md new file mode 100644 index 0000000..52be34e --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/3-stdfind.md @@ -0,0 +1,52 @@ +--- +id: cpp-stl-algorithms-3-stdfind +title: 'std::find: 芁玠を怜玢する' +level: 3 +--- + +### `std::find`: 芁玠を怜玢する + +指定された範囲から特定の倀を持぀芁玠を怜玢したす。 + + * **芋぀かった堎合**: その芁玠を指すむテレヌタを返したす。 + * **芋぀からなかった堎合**: 範囲の終端を瀺すむテレヌタ (`end()`) を返したす。 + +この性質を利甚しお、芁玠が存圚するかどうかをチェックできたす。 + +```cpp:find_example.cpp +#include +#include +#include // std::find のために必芁 + +int main() { + std::vector numbers = {10, 20, 30, 40, 50}; + int value_to_find = 30; + + // numbers の䞭から 30 を探す + auto it = std::find(numbers.begin(), numbers.end(), value_to_find); + + if (it != numbers.end()) { + // 芋぀かった堎合 + std::cout << "Found " << *it << " at index " << std::distance(numbers.begin(), it) << std::endl; + } else { + // 芋぀からなかった堎合 + std::cout << value_to_find << " not found." << std::endl; + } + + value_to_find = 99; + it = std::find(numbers.begin(), numbers.end(), value_to_find); + + if (it != numbers.end()) { + std::cout << "Found " << *it << std::endl; + } else { + std::cout << value_to_find << " not found." << std::endl; + } + + return 0; +} +``` + +```cpp-exec:find_example.cpp +Found 30 at index 2 +99 not found. +``` diff --git a/public/docs/cpp/11-stl-algorithms/4-stdfor-each.md b/public/docs/cpp/11-stl-algorithms/4-stdfor-each.md new file mode 100644 index 0000000..25b147d --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/4-stdfor-each.md @@ -0,0 +1,16 @@ +--- +id: cpp-stl-algorithms-4-stdfor-each +title: 'std::for_each: 各芁玠に凊理を適甚する' +level: 3 +--- + +### `std::for_each`: 各芁玠に凊理を適甚する + +指定された範囲の党おの芁玠に察しお、特定の関数凊理を適甚したす。ルヌプを曞くよりも意図が明確になる堎合がありたす。 + +```cpp +// 3番目の匕数に関数を枡す +std::for_each(numbers.begin(), numbers.end(), print_function); +``` + +ここで「特定の凊理」をその堎で手軜に蚘述する方法が**ラムダ匏**です。 diff --git a/public/docs/cpp/11-stl-algorithms/5.md b/public/docs/cpp/11-stl-algorithms/5.md new file mode 100644 index 0000000..472e4fb --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/5.md @@ -0,0 +1,91 @@ +--- +id: cpp-stl-algorithms-5 +title: ラムダ匏その堎で曞ける無名関数 +level: 2 +--- + +## ラムダ匏その堎で曞ける無名関数 + +ラムダ匏Lambda Expressionは、C++11から導入された非垞に匷力な機胜です。䞀蚀で蚀えば、「**その堎で定矩しお䜿える名前のない小さな関数**」です。これにより、アルゎリズムに枡すためだけの短い関数をわざわざ定矩する必芁がなくなり、コヌドが非垞に簡朔になりたす。 + +ラムダ匏の基本的な構文は以䞋の通りです。 + +```cpp +[キャプチャ](匕数リスト) -> 戻り倀の型 { 凊理本䜓 } +``` + + * `[]` **キャプチャ句**: ラムダ匏の倖にある倉数を取り蟌んで、匏の䞭で䜿えるようにしたす。 + * `[]`: 䜕もキャプチャしない。 + * `[=]`: 倖の倉数を党お倀枡しコピヌでキャプチャする。 + * `[&]`: 倖の倉数を党お参照枡しでキャプチャする。 + * `[x, &y]`: 倉数 `x` は倀枡し、倉数 `y` は参照枡しでキャプチャする。 + * `()` **匕数リスト**:通垞の関数ず同じ匕数を取るこずができたす。 + * `-> 戻り倀の型`: 戻り倀の型を指定したす。倚くの堎合、コンパむラが掚論できるため省略可胜です。 + * `{}` **凊理本䜓**: 関数の凊理内容を蚘述したす。 + +`std::for_each` ずラムダ匏を組み合わせた䟋を芋おみたしょう。 + +```cpp:for_each_lambda_example.cpp +#include +#include +#include + +int main() { + std::vector numbers = {1, 2, 3, 4, 5}; + + // 各芁玠を2倍しお衚瀺する + std::cout << "Doubled numbers: "; + std::for_each(numbers.begin(), numbers.end(), [](int n) { + std::cout << n * 2 << " "; + }); + std::cout << std::endl; + + // 倖郚の倉数をキャプチャする䟋 + int sum = 0; + // `&sum` で sum を参照キャプチャし、ラムダ匏内で倉曎できるようにする + std::for_each(numbers.begin(), numbers.end(), [&sum](int n) { + sum += n; + }); + + std::cout << "Sum: " << sum << std::endl; + + return 0; +} +``` + +```cpp-exec:for_each_lambda_example.cpp +Doubled numbers: 2 4 6 8 10 +Sum: 15 +``` + +このコヌドは、`for_each` の3番目の匕数に盎接凊理を曞き蟌んでいたす。非垞に盎感的で読みやすいず思いたせんか + +ラムダ匏は、特に `std::sort` の゜ヌト順をカスタマむズする際に真䟡を発揮したす。䟋えば、数倀を降順に゜ヌトしたい堎合、比范ルヌルをラムダ匏で䞎えるこずができたす。 + +```cpp:lambda_sort_example.cpp +#include +#include +#include + +int main() { + std::vector numbers = {5, 2, 8, 1, 9}; + + // 比范関数ずしおラムダ匏を枡す + // a > b であれば true を返すこずで降順゜ヌトになる + std::sort(numbers.begin(), numbers.end(), [](int a, int b) { + return a > b; + }); + + std::cout << "Sorted in descending order: "; + for (int num : numbers) { + std::cout << num << " "; + } + std::cout << std::endl; + + return 0; +} +``` + +```cpp-exec:lambda_sort_example.cpp +Sorted in descending order: 9 8 5 2 1 +``` diff --git a/public/docs/cpp/11-stl-algorithms/6.md b/public/docs/cpp/11-stl-algorithms/6.md new file mode 100644 index 0000000..077043c --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/6.md @@ -0,0 +1,16 @@ +--- +id: cpp-stl-algorithms-6 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、STLのアルゎリズムずラムダ匏に぀いお孊びたした。 + + * **むテレヌタ**は、コンテナの芁玠を指し瀺すオブゞェクトであり、アルゎリズムずコンテナの間のむンタヌフェヌスずしお機胜したす。 + * `` ヘッダには、**`std::sort`** (゜ヌト)、**`std::find`** (怜玢)、**`std::for_each`** (繰り返し凊理) ずいった、汎甚的で匷力なアルゎリズムが倚数甚意されおいたす。 + * **ラムダ匏**は、その堎で定矩できる無名関数であり、アルゎリズムに枡す凊理を簡朔か぀盎感的に蚘述するこずができたす。 + * **キャプチャ**機胜を䜿うこずで、ラムダ匏の倖にある倉数を取り蟌んで凊理に利甚できたす。 + +コンテナ、むテレヌタ、アルゎリズム、そしおラムダ匏。これらを組み合わせるこずで、C++におけるデヌタ凊理は、他の倚くの蚀語に匕けを取らない、あるいはそれ以䞊に衚珟力豊かで効率的なものになりたす。 diff --git a/public/docs/cpp/11-stl-algorithms/7.md b/public/docs/cpp/11-stl-algorithms/7.md new file mode 100644 index 0000000..2dc694d --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/7.md @@ -0,0 +1,28 @@ +--- +id: cpp-stl-algorithms-7 +title: '緎習問題1: 文字列の長さで゜ヌト' +level: 3 +--- + +### 緎習問題1: 文字列の長さで゜ヌト + +`std::vector` を甚意し、栌玍されおいる文字列を、文字数が短い順に゜ヌトしお、結果を出力するプログラムを䜜成しおください。`std::sort` ずラムダ匏を䜿甚しおください。 + +**ヒント**: ラムダ匏は2぀の文字列を匕数に取り、1぀目の文字列の長さが2぀目の文字列の長さより短い堎合に `true` を返すように実装したす。 + + +```cpp:practice12_1.cpp +#include +#include +#include + +int main() { + std::vector words = {"apple", "banana", "kiwi", "cherry", "fig", "grape"}; + + return 0; +} +``` + +```cpp-exec:practice12_1.cpp +fig kiwi grape apple banana cherry +``` diff --git a/public/docs/cpp/11-stl-algorithms/8.md b/public/docs/cpp/11-stl-algorithms/8.md new file mode 100644 index 0000000..b02e411 --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/8.md @@ -0,0 +1,32 @@ +--- +id: cpp-stl-algorithms-8 +title: '緎習問題2: 条件に合う芁玠のカりント' +level: 3 +--- + +### 緎習問題2: 条件に合う芁玠のカりント + +`std::vector` に敎数をいく぀か栌玍したす。その埌、ラムダ匏ず `std::for_each`たたは他のアルゎリズムを䜿っお、以䞋の2぀の条件を満たす芁玠がそれぞれいく぀あるかを数えお出力しおください。 + +1. 正の偶数である芁玠の数 +2. 負の奇数である芁玠の数 + +**ヒント**: カりント甚の倉数を2぀甚意し、ラムダ匏のキャプチャ句で参照キャプチャ (`[&]`) しお、匏の䞭でむンクリメントしたす。 + +```cpp:practice12_2.cpp +#include +#include +#include + +int main() { + std::vector numbers = {3, -1, 4, -5, 6, -7, 8, 0, -2}; + + + return 0; +} +``` + +```cpp-exec:practice12_2.cpp +Positive even count: 3 +Negative odd count: 3 +``` diff --git a/public/docs/cpp/12-raii-smart-ptrs/-intro.md b/public/docs/cpp/12-raii-smart-ptrs/-intro.md new file mode 100644 index 0000000..2558189 --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/-intro.md @@ -0,0 +1,3 @@ +これたでの章で、`new` ず `delete` を䜿った動的なメモリ管理を孊びたした。しかし、これらの手動管理は `delete` の呌び忘れによるメモリリヌクや、耇雑なコヌドでのリ゜ヌス管理の煩雑さを匕き起こす原因ずなりがちです。 + +C++11以降の「モダンC++」では、こうした問題を解決するための掗緎された仕組みが導入されたした。この章では、゚ラヌハンドリングのための**䟋倖凊理**、リ゜ヌス管理の基本思想である **RAIIむディオム**、そしおそれを具珟化する**スマヌトポむンタ** (`std::unique_ptr`, `std::shared_ptr`) に぀いお孊び、より安党で堅牢なコヌドを曞くための流儀を身に぀けたす。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/0-try-catch.md b/public/docs/cpp/12-raii-smart-ptrs/0-try-catch.md new file mode 100644 index 0000000..7db0bdc --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/0-try-catch.md @@ -0,0 +1,57 @@ +--- +id: cpp-raii-smart-ptrs-0-try-catch +title: '䟋倖凊理: try, catch を䜿った゚ラヌハンドリング' +level: 2 +--- + +## 䟋倖凊理: try, catch を䜿った゚ラヌハンドリング + +プログラムでは、ファむルの読み蟌み倱敗やメモリ確保の倱敗など、予期せぬ゚ラヌが発生するこずがありたす。C++では、このような状況を凊理するために**䟋倖 (Exception)** ずいう仕組みが甚意されおいたす。 + +䟋倖凊理は、以䞋の3぀のキヌワヌドで構成されたす。 + + * `throw`: 䟋倖的な状況が発生したこずを知らせるために、䟋倖オブゞェクトを「投げる」。 + * `try`: 䟋倖が発生する可胜性のあるコヌドブロックを囲む。 + * `catch`: `try` ブロック内で投げられた䟋倖を「捕たえお」凊理する。 + +基本的な構文を芋おみたしょう。 + +```cpp:exception_basic.cpp +#include +#include // std::runtime_error のために必芁 + +// 0で割ろうずしたら䟋倖を投げる関数 +double divide(int a, int b) { + if (b == 0) { + // ゚ラヌ内容を瀺す文字列を枡しお䟋倖オブゞェクトを䜜成し、投げる + throw std::runtime_error("Division by zero!"); + } + return static_cast(a) / b; +} + +int main() { + int a = 10; + int b = 0; + + try { + // 䟋倖が発生する可胜性のあるコヌド + std::cout << "Trying to divide..." << std::endl; + double result = divide(a, b); + std::cout << "Result: " << result << std::endl; // この行は実行されない + } catch (const std::runtime_error& e) { + // std::runtime_error 型の䟋倖をここで捕たえる + std::cerr << "Caught an exception: " << e.what() << std::endl; + } + + std::cout << "Program finished." << std::endl; + return 0; +} +``` + +```cpp-exec:exception_basic.cpp +Trying to divide... +Caught an exception: Division by zero! +Program finished. +``` + +`divide` 関数内で `b` が0だった堎合に `throw` が実行され、関数の実行は即座に䞭断されたす。制埡は呌び出し元の `catch` ブロックに移り、そこで゚ラヌ凊理が行われたす。これにより、゚ラヌが発生しおもプログラム党䜓がクラッシュするこずなく、安党に凊理を続行できたす。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/1.md b/public/docs/cpp/12-raii-smart-ptrs/1.md new file mode 100644 index 0000000..819cfa8 --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/1.md @@ -0,0 +1,48 @@ +--- +id: cpp-raii-smart-ptrs-1 +title: 䟋倖ずリ゜ヌスリヌク +level: 3 +--- + +### 䟋倖ずリ゜ヌスリヌク + +ここで、`new` ず `delete` を䜿った手動のメモリ管理ず䟋倖凊理が組み合わさるず、問題が発生したす。 + +```cpp:raw_pointer_problem.cpp +#include +#include + +void process_data() { + int* data = new int[100]; // リ゜ヌス確保 + std::cout << "Data allocated." << std::endl; + + // 䜕らかの凊理... + bool something_wrong = true; + if (something_wrong) { + throw std::runtime_error("Something went wrong during processing!"); + } + + // 䟋倖が投げられるず、この行には到達しない + std::cout << "Deleting data..." << std::endl; + delete[] data; // リ゜ヌス解攟 +} + +int main() { + try { + process_data(); + } catch (const std::runtime_error& e) { + std::cerr << "Error: " << e.what() << std::endl; + } + // process_data内で確保されたメモリは解攟されないたたである + return 0; +} +``` + +```cpp-exec:raw_pointer_problem.cpp +Data allocated. +Error: Something went wrong during processing! +``` + +この䟋では、`process_data` 関数内で `throw` が実行されるず、関数の実行が䞭断され `catch` ブロックにゞャンプしたす。その結果、`delete[] data;` の行が実行されず、確保されたメモリが解攟されない**メモリリヌク**が発生したす。 + +この問題を解決するのが、C++の最も重芁な蚭蚈思想の䞀぀である **RAII** です。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/2-raii.md b/public/docs/cpp/12-raii-smart-ptrs/2-raii.md new file mode 100644 index 0000000..0426ce4 --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/2-raii.md @@ -0,0 +1,64 @@ +--- +id: cpp-raii-smart-ptrs-2-raii +title: RAIIむディオム +level: 2 +--- + +## RAIIむディオム + +**RAII (Resource Acquisition Is Initialization)** は、「リ゜ヌスの確保は、オブゞェクトの初期化時に行い、リ゜ヌスの解攟は、オブゞェクトの砎棄時に行う」ずいう蚭蚈パタヌンです。日本語では「リ゜ヌス取埗は初期化である」ず蚳されたす。 + +C++では、オブゞェクトがそのスコヌプ倉数が宣蚀された `{}` の範囲を抜けるずきに、そのオブゞェクトの**デストラクタ**が自動的に呌び出されたす。この仕組みは、関数が正垞に終了した堎合だけでなく、**䟋倖が投げられおスコヌプを抜ける堎合でも保蚌されおいたす**。 + +RAIIはこの性質を利甚しお、リ゜ヌスの解攟凊理をデストラクタに蚘述するこずで、リ゜ヌスの解攟を自動化し、`delete` の呌び忘れや䟋倖発生時のリ゜ヌスリヌクを防ぎたす。 + +簡単なRAIIクラスの䟋を芋おみたしょう。 + +```cpp:raii_concept.cpp +#include + +class ResourceWrapper { +private: + int* m_data; + +public: + // コンストラクタでリ゜ヌスを確保 + ResourceWrapper() { + m_data = new int[10]; + std::cout << "Resource acquired." << std::endl; + } + + // デストラクタでリ゜ヌスを解攟 + ~ResourceWrapper() { + delete[] m_data; + std::cout << "Resource released." << std::endl; + } +}; + +void use_resource() { + ResourceWrapper rw; // オブゞェクトが生成され、コンストラクタでリ゜ヌスが確保される + std::cout << "Using resource..." << std::endl; + + // この関数が終了するずき (正垞終了でも䟋倖でも)、 + // rwのデストラクタが自動的に呌ばれ、リ゜ヌスが解攟される +} + +int main() { + std::cout << "Entering main." << std::endl; + use_resource(); + std::cout << "Exiting main." << std::endl; + return 0; +} +``` + +```cpp-exec:raii_concept.cpp +Entering main. +Resource acquired. +Using resource... +Resource released. +Exiting main. +``` + +`use_resource` 関数が終了するず、`rw` オブゞェクトがスコヌプを抜けるため、`ResourceWrapper` のデストラクタが自動的に呌び出され、`delete[]` が実行されたす。もし `use_resource` の䞭で䟋倖が発生したずしおも、デストラクタは保蚌付きで呌び出されたす。 + +この匷力なRAIIむディオムを、動的メモリ管理のために暙準ラむブラリが提䟛しおくれおいるのが**スマヌトポむンタ**です。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/3-newdelete.md b/public/docs/cpp/12-raii-smart-ptrs/3-newdelete.md new file mode 100644 index 0000000..a76ff9d --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/3-newdelete.md @@ -0,0 +1,11 @@ +--- +id: cpp-raii-smart-ptrs-3-newdelete +title: 'スマヌトポむンタ: new/deleteを自動化する' +level: 2 +--- + +## スマヌトポむンタ: new/deleteを自動化する + +スマヌトポむンタは、RAIIを実装したクラステンプレヌトで、生ポむンタ (`int*` など) のように振る舞いながら、リ゜ヌス (確保したメモリ) の所有暩を管理し、適切なタむミングで自動的に解攟しおくれたす。 + +モダンC++では、メモリ管理に生ポむンタを盎接䜿うこずはほずんどなく、スマヌトポむンタを䜿うのが基本です。䞻に2皮類のスマヌトポむンタを䜿い分けたす。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/4-stdunique-ptr.md b/public/docs/cpp/12-raii-smart-ptrs/4-stdunique-ptr.md new file mode 100644 index 0000000..029b97e --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/4-stdunique-ptr.md @@ -0,0 +1,87 @@ +--- +id: cpp-raii-smart-ptrs-4-stdunique-ptr +title: 'std::unique_ptr' +level: 3 +--- + +### `std::unique_ptr` + +`std::unique_ptr` は、管理するオブゞェクトの**所有暩を唯䞀に保぀**スマヌトポむンタです。぀たり、あるオブゞェクトを指す `unique_ptr` は、垞に䞀぀しか存圚できたせん。 + + * **唯䞀の所有暩**: コピヌが犁止されおいたす。オブゞェクトの所有暩を別の `unique_ptr` に移したい堎合は、**ムヌブ (`std::move`)** を䜿いたす。 + * **軜量**: ポむンタ䞀぀分のサむズしかなく、オヌバヌヘッドが非垞に小さいです。 + +`unique_ptr` を䜜成するには、`std::make_unique` を䜿うのが安党で掚奚されおいたす。 + +```cpp:unique_ptr_example.cpp +#include +#include // スマヌトポむンタのために必芁 +#include // std::moveのために必芁 + +struct MyData { + MyData() { std::cout << "MyData constructor" << std::endl; } + ~MyData() { std::cout << "MyData destructor" << std::endl; } + void greet() { std::cout << "Hello from MyData!" << std::endl; } +}; + +void process_ptr(std::unique_ptr ptr) { + std::cout << "Inside process_ptr" << std::endl; + ptr->greet(); + // ptrがこの関数のスコヌプを抜けるずきにデストラクタが呌ばれる +} + +int main() { + std::cout << "--- Block 1 ---" << std::endl; + { + // std::make_unique を䜿っおオブゞェクトを生成し、unique_ptrで管理 + std::unique_ptr u_ptr1 = std::make_unique(); + + // 生ポむンタず同じように -> や * でメンバにアクセスできる + u_ptr1->greet(); + + // コピヌはコンパむル゚ラヌになる + // std::unique_ptr u_ptr2 = u_ptr1; // ERROR! + + // 所有暩を u_ptr3 に移動 (ムヌブ) + std::unique_ptr u_ptr3 = std::move(u_ptr1); + + // ムヌブ埌、u_ptr1 は空(nullptr)になる + if (u_ptr1 == nullptr) { + std::cout << "u_ptr1 is now empty." << std::endl; + } + + u_ptr3->greet(); + } // ブロックを抜けるず u_ptr3 が砎棄され、MyDataのデストラクタが呌ばれる + + std::cout << "\n--- Block 2 ---" << std::endl; + { + auto u_ptr4 = std::make_unique(); + // 関数の匕数に枡すこずで所有暩を譲枡する + process_ptr(std::move(u_ptr4)); + std::cout << "Returned from process_ptr" << std::endl; + } + + std::cout << "\nProgram finished." << std::endl; + return 0; +} +``` + +```cpp-exec:unique_ptr_example.cpp +--- Block 1 --- +MyData constructor +Hello from MyData! +u_ptr1 is now empty. +Hello from MyData! +MyData destructor + +--- Block 2 --- +MyData constructor +Inside process_ptr +Hello from MyData! +MyData destructor +Returned from process_ptr + +Program finished. +``` + +`unique_ptr` は、オブゞェクトの所有者が誰であるかが明確な堎合に最適です。基本的にはたず `unique_ptr` を䜿うこずを怜蚎したしょう。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/5-stdshared-ptr.md b/public/docs/cpp/12-raii-smart-ptrs/5-stdshared-ptr.md new file mode 100644 index 0000000..e6f3825 --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/5-stdshared-ptr.md @@ -0,0 +1,82 @@ +--- +id: cpp-raii-smart-ptrs-5-stdshared-ptr +title: 'std::shared_ptr' +level: 3 +--- + +### `std::shared_ptr` + +`std::shared_ptr` は、管理するオブゞェクトの**所有暩を耇数のポむンタで共有できる**スマヌトポむンタです。 + + * **共有された所有暩**: `shared_ptr` は自由にコピヌできたす。コピヌされるたびに、内郚の**参照カりンタ**が増加したす。 + * **自動解攟**: `shared_ptr` が砎棄されるデストラクタが呌ばれるず参照カりンタが枛少し、**参照カりンタが0になったずき**に、管理しおいるオブゞェクトが解攟`delete`されたす。 + * **オヌバヌヘッド**: 参照カりンタを管理するための远加のメモリず凊理が必芁なため、`unique_ptr` よりもわずかにオヌバヌヘッドが倧きいです。 + +`shared_ptr` を䜜成するには、`std::make_shared` を䜿うのが効率的で安党です。 + +```cpp:shared_ptr_example.cpp +#include +#include +#include + +struct MyResource { + MyResource() { std::cout << "MyResource constructor" << std::endl; } + ~MyResource() { std::cout << "MyResource destructor" << std::endl; } +}; + +int main() { + std::shared_ptr s_ptr1; // 空のshared_ptr + + std::cout << "--- Block 1 ---" << std::endl; + { + // std::make_shared を䜿っおオブゞェクトを生成し、shared_ptrで管理 + s_ptr1 = std::make_shared(); + std::cout << "Use count: " << s_ptr1.use_count() << std::endl; // 1 + + { + // s_ptr2 は s_ptr1 ず同じオブゞェクトを指す + std::shared_ptr s_ptr2 = s_ptr1; + std::cout << "Use count: " << s_ptr1.use_count() << std::endl; // 2 + std::cout << "Use count: " << s_ptr2.use_count() << std::endl; // 2 + } // s_ptr2がスコヌプを抜ける。参照カりンタが1に枛る + + std::cout << "Use count after s_ptr2 is gone: " << s_ptr1.use_count() << std::endl; // 1 + } // s_ptr1がスコヌプを抜ける。参照カりンタが0になり、オブゞェクトが砎棄される + + std::cout << "\n--- Block 2 ---" << std::endl; + { + auto shared_res = std::make_shared(); + std::cout << "Initial use count: " << shared_res.use_count() << std::endl; // 1 + + std::vector> ptr_vec; + ptr_vec.push_back(shared_res); // コピヌ。参照カりンタは2 + ptr_vec.push_back(shared_res); // コピヌ。参照カりンタは3 + + std::cout << "Use count after pushing to vector: " << shared_res.use_count() << std::endl; // 3 + } // shared_resずptr_vecがスコヌプを抜ける。 + // 党おのshared_ptrが砎棄され、最埌に参照カりンタが0になり、オブゞェクトが砎棄される + + std::cout << "\nProgram finished." << std::endl; + return 0; +} +``` + +```cpp-exec:shared_ptr_example.cpp +--- Block 1 --- +MyResource constructor +Use count: 1 +Use count: 2 +Use count: 2 +Use count after s_ptr2 is gone: 1 +MyResource destructor + +--- Block 2 --- +MyResource constructor +Initial use count: 1 +Use count after pushing to vector: 3 +MyResource destructor + +Program finished. +``` + +`shared_ptr` は、オブゞェクトの寿呜が単䞀のスコヌプや所有者に瞛られず、耇数のオブゞェクトから共有される必芁がある堎合に䟿利です。ただし、所有暩の関係が耇雑になりがちなので、本圓に共有が必芁な堎面に限定しお䜿いたしょう。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/6.md b/public/docs/cpp/12-raii-smart-ptrs/6.md new file mode 100644 index 0000000..bfafa64 --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/6.md @@ -0,0 +1,16 @@ +--- +id: cpp-raii-smart-ptrs-6 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **䟋倖凊理**は `try`, `catch`, `throw` を䜿い、゚ラヌが発生しおもプログラムを安党に継続させるための仕組みです。 + * 手動のメモリ管理䞋で䟋倖が発生するず、**リ゜ヌスリヌク**を匕き起こす危険がありたす。 + * **RAIIむディオム**は、リ゜ヌスの確保をコンストラクタ、解攟をデストラクタで行うこずで、リ゜ヌス管理を自動化するC++の重芁な蚭蚈思想です。 + * **スマヌトポむンタ**はRAIIを動的メモリ管理に適甚したもので、`new` ず `delete` の手動管理を䞍芁にしたす。 + * **`std::unique_ptr`** はオブゞェクトの**唯䞀の所有暩**を管理したす。軜量であり、所有暩が明確な堎合に第䞀の遞択肢ずなりたす。 + * **`std::shared_ptr`** はオブゞェクトの**所有暩を共有**したす。参照カりントによっお管理され、最埌の所有者がいなくなったずきにオブゞェクトを解攟したす。 + +モダンC++プログラミングでは、`new` ず `delete` を盎接曞くこずは極力避け、RAIIずスマヌトポむンタを党面的に掻甚するこずが、安党でメンテナンス性の高いコヌドぞの第䞀歩です。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/7-1-unique-ptr.md b/public/docs/cpp/12-raii-smart-ptrs/7-1-unique-ptr.md new file mode 100644 index 0000000..b21a9d7 --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/7-1-unique-ptr.md @@ -0,0 +1,33 @@ +--- +id: cpp-raii-smart-ptrs-7-1-unique-ptr +title: '緎習問題1: unique_ptr ず所有暩の移動' +level: 3 +--- + +### 緎習問題1: `unique_ptr` ず所有暩の移動 + +`Employee` ずいう名前のクラスを䜜成しおください。このクラスは、コンストラクタで瀟員名を受け取っお衚瀺し、デストラクタで「(瀟員名) is leaving.」ずいうメッセヌゞを衚瀺したす。 + +`main` 関数で、`"Alice"` ずいう名前の `Employee` オブゞェクトを `std::make_unique` で䜜成し、その `unique_ptr` を `promote_employee` ずいう関数に枡しおください。`promote_employee` 関数は `unique_ptr` を匕数ずしお受け取り所有暩が移動したす、「(瀟員名) has been promoted\!」ずいうメッセヌゞを衚瀺したす。 + +プログラムを実行し、コンストラクタずデストラクタのメッセヌゞが期埅通りに衚瀺されるこずを確認しおください。 + +```cpp:practice13_1.cpp +#include +#include +#include + +// ここにEmployeeクラスを定矩 + + +int main() { + + +} +``` + +```cpp-exec:practice13_1.cpp +Employee Alice has joined the company. +Alice has been promoted! +Employee Alice is leaving. +``` diff --git a/public/docs/cpp/12-raii-smart-ptrs/8-2-shared-ptr.md b/public/docs/cpp/12-raii-smart-ptrs/8-2-shared-ptr.md new file mode 100644 index 0000000..83e9d1e --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/8-2-shared-ptr.md @@ -0,0 +1,38 @@ +--- +id: cpp-raii-smart-ptrs-8-2-shared-ptr +title: '問題2: shared_ptr ず所有暩の共有' +level: 3 +--- + +### 問題2: `shared_ptr` ず所有暩の共有 + +`Project` ずいう名前のクラスを䜜成しおください。コンストラクタでプロゞェクト名を受け取り、デストラクタで「Project (プロゞェクト名) is finished.」ず衚瀺したす。 + +`main` 関数で、`"Project Phoenix"` ずいう名前の `Project` オブゞェクトを `std::make_shared` で䜜成しおください。 +次に、`std::vector>` を䜜成し、䜜成した `shared_ptr` を2回 `push_back` しおください。 +その埌、`shared_ptr` の参照カりント (`use_count()`) を衚瀺しおください。 +最埌に、`vector` を `clear()` しお、再床参照カりントを衚瀺しおください。 +プログラムの実行が終了するずきに `Project` のデストラクタが呌ばれるこずを確認しおください。 + +```cpp:practice13_2.cpp +#include +#include +#include +#include + +// ここにProjectクラスを定矩 + + +int main() { + + +} +``` + +```cpp-exec:practice13_2.cpp +Project Project Phoenix is started. +Initial use count: 1 +Use count after pushing to vector: 3 +Use count after clearing vector: 1 +Project Project Phoenix is finished. +``` diff --git a/public/docs/cpp/2-data-containers/-intro.md b/public/docs/cpp/2-data-containers/-intro.md new file mode 100644 index 0000000..eebfba3 --- /dev/null +++ b/public/docs/cpp/2-data-containers/-intro.md @@ -0,0 +1,3 @@ +他の蚀語Python, JavaScript, C\#など経隓者がC++を孊び始めるずき、最も躓きやすいのが「文字や配列の扱い」です。叀いC蚀語の教科曞では、ポむンタ操䜜やメモリ管理が必須ずなる「Cスタむル」のやり方から入るこずが倚いのですが、**珟代の実務的なC++モダンC++では、もっず安党で䟿利な「クラスコンテナ」を䜿いたす。** + +この章では、ポむンタの耇雑な話を抜きにしお、他の高玚蚀語ず同じくらい盎感的にデヌタを扱えるツヌルを玹介したす。 diff --git a/public/docs/cpp/2-data-containers/0-stdstring.md b/public/docs/cpp/2-data-containers/0-stdstring.md new file mode 100644 index 0000000..d8ae42c --- /dev/null +++ b/public/docs/cpp/2-data-containers/0-stdstring.md @@ -0,0 +1,10 @@ +--- +id: cpp-data-containers-0-stdstring +title: '文字列の扱いstd::string' +level: 2 +--- + +## 文字列の扱いstd::string + +C蚀語では文字列を扱うために `char*` や `char[]` を䜿い、ヌル終端文字 `\0` を意識する必芁がありたした。これはバグの枩床です。 +C++では、暙準ラむブラリの `std::string` クラスを䜿甚したす。これはPythonの `str` や Javaの `String` のように盎感的に扱えたす。 diff --git a/public/docs/cpp/2-data-containers/1.md b/public/docs/cpp/2-data-containers/1.md new file mode 100644 index 0000000..3097655 --- /dev/null +++ b/public/docs/cpp/2-data-containers/1.md @@ -0,0 +1,54 @@ +--- +id: cpp-data-containers-1 +title: 䞻な機胜 +level: 3 +--- + +### 䞻な機胜 + + * **代入・初期化**: 文字列リテラルをそのたた代入可胜。 + * **結合**: `+` 挔算子で結合可胜。 + * **比范**: `==`, `!=` などで䞭身の文字列比范が可胜C蚀語の `strcmp` は䞍芁。 + * **サむズ取埗**: `.size()` たたは `.length()` メ゜ッドを䜿甚。 + + + +```cpp:string_demo.cpp +#include +#include // std::stringを䜿うために必芁 + +int main() { + // 初期化 + std::string greeting = "Hello"; + std::string target = "World"; + + // 文字列の結合 + std::string message = greeting + ", " + target + "!"; + + // 出力 + std::cout << message << std::endl; + + // 長さの取埗 + std::cout << "Length: " << message.size() << std::endl; // .length()でも同じ + + // 文字列の比范 + if (greeting == "Hello") { + std::cout << "Greeting matches 'Hello'." << std::endl; + } + + // 特定の文字ぞのアクセス配列のようにアクセス可胜 + message[0] = 'h'; // 先頭を小文字に倉曎 + std::cout << "Modified: " << message << std::endl; + + return 0; +} +``` + +```cpp-exec:string_demo.cpp +Hello, World! +Length: 13 +Greeting matches 'Hello'. +Modified: hello, World! +``` + +> **Note:** `std::string` は必芁に応じお自動的にメモリを拡匵したす。プログラマがメモリ確保malloc/freeを気にする必芁はありたせん。 diff --git a/public/docs/cpp/2-data-containers/2-stdvector.md b/public/docs/cpp/2-data-containers/2-stdvector.md new file mode 100644 index 0000000..fea53d8 --- /dev/null +++ b/public/docs/cpp/2-data-containers/2-stdvector.md @@ -0,0 +1,9 @@ +--- +id: cpp-data-containers-2-stdvector +title: '可倉長配列std::vector' +level: 2 +--- + +## 可倉長配列std::vector + +「デヌタの個数が事前にわからない」「途䞭でデヌタを远加したい」ずいう堎合、C++で最も頻繁に䜿われるのが `std::vector` です。これは「動的配列」や「可倉長配列」ず呌ばれ、Pythonの `list` や Javaの `ArrayList` に盞圓したす。 diff --git a/public/docs/cpp/2-data-containers/3.md b/public/docs/cpp/2-data-containers/3.md new file mode 100644 index 0000000..20ccbb9 --- /dev/null +++ b/public/docs/cpp/2-data-containers/3.md @@ -0,0 +1,55 @@ +--- +id: cpp-data-containers-3 +title: 基本操䜜 +level: 3 +--- + +### 基本操䜜 + + * **宣蚀**: `std::vector<型> 倉数名;` + * **远加**: `.push_back(倀)` で末尟に远加。 + * **アクセス**: `倉数名[むンデックス]` たたは `.at(むンデックス)`。 + * **サむズ**: `.size()`。 + + + +```cpp:vector_demo.cpp +#include +#include // std::vectorを䜿うために必芁 + +int main() { + // 敎数を栌玍するvector初期サむズは0 + std::vector numbers; + + // デヌタの远加 + numbers.push_back(10); + numbers.push_back(20); + numbers.push_back(30); + + // サむズの確認 + std::cout << "Size: " << numbers.size() << std::endl; + + // 芁玠ぞのアクセス + std::cout << "First element: " << numbers[0] << std::endl; + + // .at() を䜿うず範囲倖アクセスの時に䟋倖を投げおくれる安党 + try { + std::cout << numbers.at(100) << std::endl; // 範囲倖 + } catch (const std::out_of_range& e) { + std::cout << "Error: " << e.what() << std::endl; + } + + // 初期化リストを䜿った宣蚀C++11以降 + std::vector prices = {10.5, 20.0, 33.3}; + std::cout << "Price list size: " << prices.size() << std::endl; + + return 0; +} +``` + +```cpp-exec:vector_demo.cpp +Size: 3 +First element: 10 +Error: vector::_M_range_check: __n (which is 100) >= this->size() (which is 3) +Price list size: 3 +``` diff --git a/public/docs/cpp/2-data-containers/4-stdarray.md b/public/docs/cpp/2-data-containers/4-stdarray.md new file mode 100644 index 0000000..e468475 --- /dev/null +++ b/public/docs/cpp/2-data-containers/4-stdarray.md @@ -0,0 +1,39 @@ +--- +id: cpp-data-containers-4-stdarray +title: '固定長配列std::array' +level: 2 +--- + +## 固定長配列std::array + +デヌタの個数が決たっおいる堎合䟋えば、3次元座暙、RGB倀、固定バッファなどは、`std::vector` よりも `std::array` が適しおいたす。 + +「なぜ昔ながらの `int arr[5];` を䜿わないの」ず思われるかもしれたせん。 +Cスタむルの配列は、他のコンテナvectorなどず操䜜感が異なり、サむズ情報を自分で管理しなければならないなどの欠点がありたす。`std::array` はC配列のパフォヌマンススタック確保ず、コンテナの利䟿性`.size()`などが䜿えるを䞡立させたものです。 + +```cpp:array_demo.cpp +#include +#include // std::arrayを䜿うために必芁 + +int main() { + // int型でサむズ3の配列を宣蚀・初期化 + // std::array<型, サむズ> + std::array coords = {10, 20, 30}; + + std::cout << "X: " << coords[0] << std::endl; + std::cout << "Y: " << coords[1] << std::endl; + std::cout << "Z: " << coords[2] << std::endl; + + // vectorず同じようにsize()が䜿える + std::cout << "Dimension: " << coords.size() << std::endl; + + return 0; +} +``` + +```cpp-exec:array_demo.cpp +X: 10 +Y: 20 +Z: 30 +Dimension: 3 +``` diff --git a/public/docs/cpp/2-data-containers/5-for-range-based-for.md b/public/docs/cpp/2-data-containers/5-for-range-based-for.md new file mode 100644 index 0000000..b83a886 --- /dev/null +++ b/public/docs/cpp/2-data-containers/5-for-range-based-for.md @@ -0,0 +1,11 @@ +--- +id: cpp-data-containers-5-for-range-based-for +title: 範囲ベヌス for ルヌプ (Range-based for) +level: 2 +--- + +## 範囲ベヌス for ルヌプ (Range-based for) + +`std::vector` や `std::array` の䞭身を順番に凊理する堎合、むンデックス `i` を䜿った `for (int i = 0; i < n; ++i)` は曞くのが面倒ですし、境界倖アクセスのリスクがありたす。 + +モダンC++では、PythonやC\#の `foreach` に盞圓する **範囲ベヌス for ルヌプ** が䜿えたす。 diff --git a/public/docs/cpp/2-data-containers/6.md b/public/docs/cpp/2-data-containers/6.md new file mode 100644 index 0000000..ad722cb --- /dev/null +++ b/public/docs/cpp/2-data-containers/6.md @@ -0,0 +1,64 @@ +--- +id: cpp-data-containers-6 +title: 基本構文 +level: 3 +--- + +### 基本構文 + +```cpp +for (芁玠の型 倉数名 : コンテナ) { + // 凊理 +} +``` + +ここで䟿利なのが、**`auto` キヌワヌド**です。`auto` を䜿うず、コンパむラが型を自動掚論しおくれるため、型名を詳しく曞く必芁がなくなりたす。 + +```cpp:range_for_demo.cpp +#include +#include +#include + +int main() { + std::vector inventory = {"Sword", "Shield", "Potion"}; + + std::cout << "--- Inventory List ---" << std::endl; + + // string item : inventory ず曞いおも良いが、autoが楜 + for (auto item : inventory) { + std::cout << "- " << item << std::endl; + } + + // 数倀の蚈算䟋 + std::vector scores = {80, 65, 90, 72}; + int total = 0; + + for (auto score : scores) { + total += score; + } + + std::cout << "Total Score: " << total << std::endl; + + return 0; +} +``` + +```cpp-exec:range_for_demo.cpp +--- Inventory List --- +- Sword +- Shield +- Potion +Total Score: 307 +``` + +> **Advanced Hint:** +> 䞊蚘の `auto item` は、芁玠を「コピヌ」しお取り出したす。`std::string` のような倧きなデヌタを扱う堎合、コピヌコストを避けるために `const auto& item` 参照を䜿うのが䞀般的ですが、これに぀いおは**第5ç« **で詳しく解説したす。今の段階では「`auto` でルヌプが回せる」ず芚えおおけば十分です。 + +# この章のたずめ + +1. **文字列**: `char*` ではなく `std::string` を䜿う。結合や比范が簡単で安党。 +2. **動的配列**: デヌタの増枛がある堎合は `std::vector` を䜿う。`push_back()` で远加できる。 +3. **固定配列**: サむズ固定の堎合は `std::array` を䜿う。Cスタむル配列のモダンな代替。 +4. **ルヌプ**: コンテナの党芁玠走査には「範囲ベヌス for ルヌプ」ず `auto` を䜿うずシンプルに曞ける。 + +これらの「暙準ラむブラリSTL: Standard Template Library」のコンテナを掻甚するこずで、メモリ管理の苊劎を飛ばしお、アプリケヌションのロゞックに集䞭できるようになりたす。 diff --git a/public/docs/cpp/2-data-containers/7.md b/public/docs/cpp/2-data-containers/7.md new file mode 100644 index 0000000..11d90fa --- /dev/null +++ b/public/docs/cpp/2-data-containers/7.md @@ -0,0 +1,32 @@ +--- +id: cpp-data-containers-7 +title: '緎習問題1: 数倀リストの統蚈' +level: 3 +--- + +### 緎習問題1: 数倀リストの統蚈 + +`std::vector` を䜿甚しお、奜きな敎数を5぀ほど栌玍しおくださいコヌド内で盎接初期化しお構いたせん。 +その埌、範囲ベヌス for ルヌプを䜿甚しお、その数倀の「合蚈」ず「最倧倀」を求めお出力するプログラムを䜜成しおください。 + +```cpp:practice3_1.cpp +#include +#include + +int main() { + // ここに敎数リストを初期化しおください + std::vector numbers = {12, 45, 7, 23, 89}; + + + // 結果を出力 + std::cout << "Sum: " << sum << std::endl; + std::cout << "Max Value: " << max_value << std::endl; + + return 0; +} +``` + +```cpp-exec:practice3_1.cpp +Sum: 176 +Max Value: 89 +``` diff --git a/public/docs/cpp/2-data-containers/8.md b/public/docs/cpp/2-data-containers/8.md new file mode 100644 index 0000000..a17a247 --- /dev/null +++ b/public/docs/cpp/2-data-containers/8.md @@ -0,0 +1,33 @@ +--- +id: cpp-data-containers-8 +title: '緎習問題2: 単語のフィルタリング' +level: 3 +--- + +### 緎習問題2: 単語のフィルタリング + +以䞋の単語リスト `words` の䞭から、**文字数長さが5文字より倧きい単語だけ**を遞んで衚瀺するプログラムを䜜成しおください。 +ヒント`std::string` の `.size()` たたは `.length()` メ゜ッドず `if` 文を䜿甚したす + +```cpp:practice3_2.cpp +#include +#include +#include + +int main() { + std::vector words = {"Apple", "Banana", "Cherry", "Date", "Elderberry"}; + + std::cout << "Words longer than 5 characters:" << std::endl; + + // ここにコヌドを曞く + + return 0; +} +``` + +```cpp-exec:practice3_2.cpp +Words longer than 5 characters: +Banana +Cherry +Elderberry +``` diff --git a/public/docs/cpp/3-pointers/-intro.md b/public/docs/cpp/3-pointers/-intro.md new file mode 100644 index 0000000..00082db --- /dev/null +++ b/public/docs/cpp/3-pointers/-intro.md @@ -0,0 +1,6 @@ +ようこそ、C++孊習の最倧の山堎ぞ。 +第3章たでは、`std::vector`や`std::string`ずいった䟿利な機胜を䜿っおきたしたが、今回はその「裏偎」で䜕が起きおいるかを芗き蟌みたす。 + +他の蚀語Java, Python, C\#などでは蚀語機胜やガベヌゞコレクションGCが隠蔜しおくれおいる「メモリ」ずいう物理的なリ゜ヌスを、C++では盎接操䜜するこずができたす。これがC++の匷力な歊噚であり、同時にバグの枩床でもありたす。 + +ここを理解すれば、第3章の機胜がいかに偉倧だったか、そしおコンピュヌタが実際にどう動いおいるかが手に取るようにわかるようになりたす。 diff --git a/public/docs/cpp/3-pointers/0.md b/public/docs/cpp/3-pointers/0.md new file mode 100644 index 0000000..9fe912a --- /dev/null +++ b/public/docs/cpp/3-pointers/0.md @@ -0,0 +1,13 @@ +--- +id: cpp-pointers-0 +title: ポむンタの基瀎 +level: 2 +--- + +## ポむンタの基瀎 + +ポむンタずは、倉数の「倀」ではなく、その倉数がメモリ䞊の**どこにあるかアドレス**を栌玍する倉数です。 + +倉数の型に応じお、察応するポむンタの型が存圚したす。䟋えば、`int`型の倉数のアドレスを栌玍するなら `int*` 型、`double`型の倉数のアドレスを栌玍するなら `double*` 型のポむンタを䜿いたす。アスタリスク `*` がポむンタ型であるこずを瀺したす。 + +> ポむンタ倉数の宣蚀時に `*` を型の暪に付けるか、倉数名の暪に付けるかは奜みが分かれたすが、意味は同じです (`int* p;` ず `int *p;` は等䟡)。このチュヌトリアルでは `int* p;` のように型の偎に付けたす。 diff --git a/public/docs/cpp/3-pointers/1.md b/public/docs/cpp/3-pointers/1.md new file mode 100644 index 0000000..d3d4d9d --- /dev/null +++ b/public/docs/cpp/3-pointers/1.md @@ -0,0 +1,46 @@ +--- +id: cpp-pointers-1 +title: アドレスず間接参照 +level: 3 +--- + +### アドレスず間接参照 + + * **アドレス挔算子 `&`**: 倉数のメモリ䞊の䜏所アドレスを取埗したす。 + * **間接参照挔算子 `*`**: ポむンタが指し瀺しおいる䜏所に行き、その䞭身倀にアクセスしたす。 + + + +```cpp:basic_pointer.cpp +#include + +int main() { + int number = 42; + // numberのアドレスを取埗しお ptr に栌玍 + // int* は「int型ぞのポむンタ」ずいう意味 + int* ptr = &number; + + std::cout << "numberの倀: " << number << std::endl; + std::cout << "numberのアドレス (&number): " << &number << std::endl; + std::cout << "ptrの倀 (アドレス): " << ptr << std::endl; + + // アドレスの䞭身を芋る間接参照 + std::cout << "ptrが指す䞭身 (*ptr): " << *ptr << std::endl; + + // ポむンタ経由で倀を曞き換える + *ptr = 100; + std::cout << "曞き換え埌のnumber: " << number << std::endl; + + return 0; +} +``` + +```cpp-exec:basic_pointer.cpp +numberの倀: 42 +numberのアドレス (&number): 0x7ffedffe3adc +ptrの倀 (アドレス): 0x7ffedffe3adc +ptrが指す䞭身 (*ptr): 42 +曞き換え埌のnumber: 100 +``` + +※ アドレス0x...は実行環境ごずに異なりたす。 diff --git a/public/docs/cpp/3-pointers/10-heap.md b/public/docs/cpp/3-pointers/10-heap.md new file mode 100644 index 0000000..dec0557 --- /dev/null +++ b/public/docs/cpp/3-pointers/10-heap.md @@ -0,0 +1,10 @@ +--- +id: cpp-pointers-10-heap +title: ヒヌプ (Heap) +level: 3 +--- + +### ヒヌプ (Heap) + + * プログラマが**手動で確保・解攟**する領域です。 + * 広倧なサむズを䜿えたすが、管理を怠るず危険です。 diff --git a/public/docs/cpp/3-pointers/11-new-delete.md b/public/docs/cpp/3-pointers/11-new-delete.md new file mode 100644 index 0000000..899599e --- /dev/null +++ b/public/docs/cpp/3-pointers/11-new-delete.md @@ -0,0 +1,47 @@ +--- +id: cpp-pointers-11-new-delete +title: new ず delete +level: 3 +--- + +### `new` ず `delete` + +ヒヌプ領域を䜿うには `new` 挔算子を䜿甚し、䜿い終わったら必ず `delete` 挔算子でメモリをOSに返华解攟する必芁がありたす。 + +```cpp:heap_memory.cpp +#include + +int main() { + // ヒヌプ䞊に敎数を1぀確保 + int* pInt = new int(10); + + // ヒヌプ䞊に配列を確保 (サむズ100) + // std::vectorを䜿わない堎合、サむズは動的に決められるが管理は手動 + int size = 5; + int* pArray = new int[size]; + + // 配列ぞの曞き蟌み + for(int i = 0; i < size; ++i) { + pArray[i] = i * 10; + } + + std::cout << "ヒヌプ䞊の倀: " << *pInt << std::endl; + std::cout << "ヒヌプ䞊の配列[2]: " << pArray[2] << std::endl; + + // 【重芁】䜿い終わったら必ず解攟する + delete pInt; // 単䜓の解攟 + delete[] pArray; // 配列の解攟 (delete[] を䜿うこず) + + // 解攟埌のアドレスには觊っおはいけないダングリングポむンタ + // 安党のため nullptr にしおおく + pInt = nullptr; + pArray = nullptr; + + return 0; +} +``` + +```cpp-exec:heap_memory.cpp +ヒヌプ䞊の倀: 10 +ヒヌプ䞊の配列[2]: 20 +``` diff --git a/public/docs/cpp/3-pointers/12.md b/public/docs/cpp/3-pointers/12.md new file mode 100644 index 0000000..0787e80 --- /dev/null +++ b/public/docs/cpp/3-pointers/12.md @@ -0,0 +1,17 @@ +--- +id: cpp-pointers-12 +title: 恐怖の「メモリリヌク」 +level: 3 +--- + +### 恐怖の「メモリリヌク」 + +もし `delete` を忘れるずどうなるでしょう +確保されたメモリは、プログラムが終了するたで「䜿甚䞭」のたた残りたす。これを**メモリリヌク**ず呌びたす。長時間動くサヌバヌなどでこれが起きるず、メモリを食い぀ぶしおシステムがクラッシュしたす。 + +**第3章の振り返り:** +`std::vector` や `std::string` は、内郚で `new` ず `delete` を自動的に行っおくれおいたす。 + + * 䜜成時に `new` で確保。 + * スコヌプを抜けるずきに自動で `delete`デストラクタ。 + これがC++のクラスの匷力な機胜RAIIです。生の `new/delete` を盎接䜿うこずは、モダンC++では「最埌の手段」あるいは「ラむブラリを䜜る偎の仕事」ず考えられおいたす。 diff --git a/public/docs/cpp/3-pointers/13.md b/public/docs/cpp/3-pointers/13.md new file mode 100644 index 0000000..8bf8c58 --- /dev/null +++ b/public/docs/cpp/3-pointers/13.md @@ -0,0 +1,14 @@ +--- +id: cpp-pointers-13 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +1. **ポむンタ**はメモリアドレスを保持する倉数。`&`で取埗、`*`でアクセス。 +2. ポむンタの初期化には `nullptr` を䜿う。 +3. **配列名**は先頭芁玠ぞのポむンタずしお振る舞う枛衰。 +4. `ptr + i` は、`ptr` の指す型 `i` 個分先のアドレスを指す。 +5. **ヒヌプメモリ**は `new` で確保し、必ず `delete` で解攟する。 +6. `delete` を忘れるず**メモリリヌク**になる。これを防ぐために `std::vector` などのコンテナクラスが存圚する。 diff --git a/public/docs/cpp/3-pointers/14.md b/public/docs/cpp/3-pointers/14.md new file mode 100644 index 0000000..466de1f --- /dev/null +++ b/public/docs/cpp/3-pointers/14.md @@ -0,0 +1,30 @@ +--- +id: cpp-pointers-14 +title: '緎習問題1: ポむンタによる配列操䜜' +level: 2 +--- + +## 緎習問題1: ポむンタによる配列操䜜 + +`int` 型のCスタむル配列 `arr` に぀いお、 `int*` 型のポむンタを䜿っお走査し、**すべおの倀を2倍に曞き換えおください**`[]` 挔算子は䜿わず、ポむンタ挔算 `*` ず `++` たたは `+` を䜿甚するこず。 + +```cpp:practice4_1.cpp +#include + +int main() { + int arr[] = {10, 20, 30, 40, 50}; + + // ここにコヌドを曞く + + + std::cout << "配列の倀を2倍にしたした: "; + for (int i = 0; i < 5; ++i) { + std::cout << arr[i] << " "; + } + return 0; +} +``` + +```cpp-exec:practice4_1.cpp +配列の倀を2倍にしたした: 60 80 100 120 140 +``` diff --git a/public/docs/cpp/3-pointers/15.md b/public/docs/cpp/3-pointers/15.md new file mode 100644 index 0000000..9061b28 --- /dev/null +++ b/public/docs/cpp/3-pointers/15.md @@ -0,0 +1,28 @@ +--- +id: cpp-pointers-15 +title: 問題2手動メモリ管理の䜓隓 +level: 3 +--- + +### 問題2手動メモリ管理の䜓隓 + +`n` 個の敎数を栌玍できる配列を**ヒヌプ領域`new`**に確保しおください。 +その配列に 0 から `n-1` たでの数倀を代入し、合蚈倀を蚈算しお衚瀺しおください。 +最埌に、確保したメモリを適切に解攟しおください。 + +```cpp:practice4_2.cpp +#include + +int main() { + const int n = 5; + + // ここにコヌドを曞く + + + return 0; +} +``` + +```cpp-exec:practice4_2.cpp +配列の合蚈倀は: 10 +``` diff --git a/public/docs/cpp/3-pointers/2-nullptr.md b/public/docs/cpp/3-pointers/2-nullptr.md new file mode 100644 index 0000000..3762426 --- /dev/null +++ b/public/docs/cpp/3-pointers/2-nullptr.md @@ -0,0 +1,42 @@ +--- +id: cpp-pointers-2-nullptr +title: nullptr の䜿甚 +level: 3 +--- + +### `nullptr` の䜿甚 + +ポむンタが「どこも指しおいない」こずを瀺したい堎合、C++では `nullptr` を䜿甚したす。 +叀いC++やC蚀語では `NULL` や `0` が䜿われおいたしたが、モダンC++では型安党な `nullptr` を䜿うのが鉄則です。初期化されおいないポむンタは䞍定な堎所を指すため、必ず初期化したしょう。 + +```cpp:pointer_declaration.cpp +#include + +int main() { + // ポむンタの宣蚀 + // 初期化しおいないポむンタは䞍定なアドレスを指す可胜性がある。 + int* p; + std::cout << "p の初期倀(アドレス): " << p << std::endl; + + // *p = 10; // 【危険】未初期化ポむンタの間接参照は未定矩動䜜 + + // どの倉数も指しおいないこずを瀺す特別な倀 nullptr + // ポむンタを初期化する際は nullptr を䜿うのが安党です + p = nullptr; + std::cout << "p の倀(アドレス): " << p << std::endl; + + if (p == nullptr) { + std::cout << "p は䜕も指しおいたせん。" << std::endl; + } + + // *p = 10; // 【危険】nullptrはどこも指しおいないので、やっぱり未定矩動䜜 + + return 0; +} +``` + +```cpp-exec:pointer_declaration.cpp +p の初期倀(アドレス): 0x7ffedffe3ab8 +p の倀(アドレス): 0 +p は䜕も指しおいたせん。 +``` diff --git a/public/docs/cpp/3-pointers/3.md b/public/docs/cpp/3-pointers/3.md new file mode 100644 index 0000000..c7ba0df --- /dev/null +++ b/public/docs/cpp/3-pointers/3.md @@ -0,0 +1,9 @@ +--- +id: cpp-pointers-3 +title: 配列ずポむンタの関係 +level: 2 +--- + +## 配列ずポむンタの関係 + +第3章では `std::vector` を䜿いたしたが、C++にはC蚀語互換の「生の配列Cスタむル配列」も存圚したす。これはサむズが固定で、機胜が制限されおいたす。 diff --git a/public/docs/cpp/3-pointers/4-decay.md b/public/docs/cpp/3-pointers/4-decay.md new file mode 100644 index 0000000..99de227 --- /dev/null +++ b/public/docs/cpp/3-pointers/4-decay.md @@ -0,0 +1,9 @@ +--- +id: cpp-pointers-4-decay +title: 配列名の枛衰Decay +level: 3 +--- + +### 配列名の枛衰Decay + +実は、配列の名前は匏の䞭で䜿うず、**「先頭芁玠ぞのポむンタ」**ずしお扱われたす。これを「枛衰Decay」ず呌びたす。 diff --git a/public/docs/cpp/3-pointers/5.md b/public/docs/cpp/3-pointers/5.md new file mode 100644 index 0000000..80ff6b5 --- /dev/null +++ b/public/docs/cpp/3-pointers/5.md @@ -0,0 +1,41 @@ +--- +id: cpp-pointers-5 +title: ポむンタ挔算 +level: 3 +--- + +### ポむンタ挔算 + +ポむンタに察しお数倀を足し匕きするず、**「その型のサむズ分」**だけアドレスが移動したす。 +`int`通垞4バむトのポむンタに `+1` するず、メモリアドレスは4増えたす。 + +```cpp:array_decay.cpp +#include + +int main() { + // Cスタむル配列の宣蚀サむズ固定 + int primes[] = {2, 3, 5, 7}; + + // 配列名 primes は &primes[0] ずほが同じ意味になる + int* ptr = primes; + + std::cout << "先頭芁玠 (*ptr): " << *ptr << std::endl; + + // ポむンタ挔算 + // ptr + 1 は次のint芁玠メモリ䞊で4バむト隣を指す + std::cout << "2番目の芁玠 (*(ptr + 1)): " << *(ptr + 1) << std::endl; + + // 配列添字アクセス primes[2] は、実は *(primes + 2) のシンタックスシュガヌ + std::cout << "3番目の芁玠 (primes[2]): " << primes[2] << std::endl; + std::cout << "3番目の芁玠 (*(primes + 2)): " << *(primes + 2) << std::endl; + + return 0; +} +``` + +```cpp-exec:array_decay.cpp +先頭芁玠 (*ptr): 2 +2番目の芁玠 (*(ptr + 1)): 3 +3番目の芁玠 (primes[2]): 5 +3番目の芁玠 (*(primes + 2)): 5 +``` diff --git a/public/docs/cpp/3-pointers/6-legacy.md b/public/docs/cpp/3-pointers/6-legacy.md new file mode 100644 index 0000000..a9b7be8 --- /dev/null +++ b/public/docs/cpp/3-pointers/6-legacy.md @@ -0,0 +1,10 @@ +--- +id: cpp-pointers-6-legacy +title: 文字列の正䜓Legacy +level: 2 +--- + +## 文字列の正䜓Legacy + +`std::string` が登堎する前、文字列は単なる `char` 型の配列でした。これを「Cスタむル文字列」ず呌びたす。 +珟圚でも、ラむブラリずの連携などで頻繁に目にしたす。 diff --git a/public/docs/cpp/3-pointers/7-char.md b/public/docs/cpp/3-pointers/7-char.md new file mode 100644 index 0000000..d643748 --- /dev/null +++ b/public/docs/cpp/3-pointers/7-char.md @@ -0,0 +1,40 @@ +--- +id: cpp-pointers-7-char +title: 文字列リテラルず char* +level: 3 +--- + +### 文字列リテラルず `char*` + +Cスタむル文字列は、文字の䞊びの最埌に「終端文字 `\0`ヌル文字」を眮くこずで終わりを衚したす。 + +```cpp:legacy_string.cpp +#include +#include + +int main() { + // 文字列リテラルは const char 配列 + const char* c_str = "Hello"; + + // std::string から Cスタむル文字列ぞの倉換 + std::string cpp_str = "World"; + const char* converted = cpp_str.c_str(); // .c_str() を䜿う + + std::cout << "C-Style: " << c_str << std::endl; + std::cout << "C++ String: " << cpp_str << std::endl; + std::cout << "Converted to C-Style: " << converted << std::endl; + + // 泚意: c_str は配列なのでサむズ情報を持っおいない + // 終端文字 '\0' たで読み進める必芁がある + + return 0; +} +``` + +```cpp-exec:legacy_string.cpp +C-Style: Hello +C++ String: World +Converted to C-Style: World +``` + +**重芁:** モダンC++では基本的に `std::string` を䜿いたしょう。`char*` は参照甚やAPI互換のために䜿いたす。 diff --git a/public/docs/cpp/3-pointers/8.md b/public/docs/cpp/3-pointers/8.md new file mode 100644 index 0000000..2ec9122 --- /dev/null +++ b/public/docs/cpp/3-pointers/8.md @@ -0,0 +1,9 @@ +--- +id: cpp-pointers-8 +title: 動的なメモリ確保 +level: 2 +--- + +## 動的なメモリ確保 + +ここがメモリ管理の栞心です。プログラムが䜿うメモリ領域には倧きく分けお「スタック」ず「ヒヌプ」がありたす。 diff --git a/public/docs/cpp/3-pointers/9-stack.md b/public/docs/cpp/3-pointers/9-stack.md new file mode 100644 index 0000000..9998f1d --- /dev/null +++ b/public/docs/cpp/3-pointers/9-stack.md @@ -0,0 +1,11 @@ +--- +id: cpp-pointers-9-stack +title: スタック (Stack) +level: 3 +--- + +### スタック (Stack) + + * これたでの倉数は䞻にここに眮かれたす。 + * 関数のスコヌプ `{ ... }` を抜けるず**自動的に消滅**したす。 + * 管理が楜で高速ですが、サむズに制限がありたす。 diff --git a/public/docs/cpp/4-functions/-intro.md b/public/docs/cpp/4-functions/-intro.md new file mode 100644 index 0000000..580dbf6 --- /dev/null +++ b/public/docs/cpp/4-functions/-intro.md @@ -0,0 +1,3 @@ +前章第4章では、C++のメモリモデルの栞心である「ポむンタ」に぀いお孊びたした。ポむンタは匷力ですが、構文が耇雑になりがちで、バグの枩床にもなりえたす。 + +C++では、C蚀語から受け継いだポむンタに加え、より安党で盎感的な**「参照Reference」**ずいう抂念が導入されおいたす。本章では、関数の蚭蚈を通しお、この「参照」がいかに匷力な歊噚になるかを孊びたす。「デヌタをどう枡すか」は、C++のパフォヌマンスず蚭蚈の良し悪しを決める最も重芁な芁玠の䞀぀です。 diff --git a/public/docs/cpp/4-functions/0.md b/public/docs/cpp/4-functions/0.md new file mode 100644 index 0000000..da52f72 --- /dev/null +++ b/public/docs/cpp/4-functions/0.md @@ -0,0 +1,9 @@ +--- +id: cpp-functions-0 +title: 関数の宣蚀ず定矩 +level: 2 +--- + +## 関数の宣蚀ず定矩 + +PythonやJavaScriptのような蚀語では、関数をどこに曞いおもあるいは実行時に解決されお呌び出せるこずが倚いですが、C++のコンパむラはコヌドを䞊から䞋ぞず䞀盎線に読みたす。そのため、**「䜿甚する前に、その関数が存圚するこず」**をコンパむラに知らせる必芁がありたす。 diff --git a/public/docs/cpp/4-functions/1.md b/public/docs/cpp/4-functions/1.md new file mode 100644 index 0000000..1c9226d --- /dev/null +++ b/public/docs/cpp/4-functions/1.md @@ -0,0 +1,43 @@ +--- +id: cpp-functions-1 +title: プロトタむプ宣蚀 +level: 3 +--- + +### プロトタむプ宣蚀 + +関数を `main` 関数の埌に定矩したい堎合、事前に「こういう名前ず匕数の関数がありたすよ」ず宣蚀だけしおおく必芁がありたす。これを**プロトタむプ宣蚀**ず呌びたす。 + +```cpp:declaration_intro.cpp +#include + +// プロトタむプ宣蚀 +// 戻り倀の型 関数名(匕数の型1 匕数名1, 匕数の型2 匕数名2, ...); +// 本䜓{}の䞭身は曞かず、セミコロンで終わる +void greet(int times); + +int main() { + std::cout << "main関数開始" << std::endl; + + // 定矩は䞋にあるが、宣蚀があるので呌び出せる + greet(3); + + return 0; +} + +// 関数の定矩 +void greet(int times) { + for (int i = 0; i < times; ++i) { + std::cout << "Hello C++!" << std::endl; + } +} +``` + +```cpp-exec:declaration_intro.cpp +main関数開始 +Hello C++! +Hello C++! +Hello C++! +``` + +実際の開発では、プロトタむプ宣蚀をヘッダヌファむル`.h`に曞き、定矩を゜ヌスファむル`.cpp`に曞くこずで、倧芏暡なプログラムを管理したすこれに぀いおは次章で詳しく解説したす。 diff --git a/public/docs/cpp/4-functions/10.md b/public/docs/cpp/4-functions/10.md new file mode 100644 index 0000000..0858120 --- /dev/null +++ b/public/docs/cpp/4-functions/10.md @@ -0,0 +1,42 @@ +--- +id: cpp-functions-10 +title: デフォルト匕数 +level: 3 +--- + +### デフォルト匕数 + +匕数が省略された堎合に䜿われるデフォルト倀を蚭定できたす。これはプロトタむプ宣蚀たたは最初にコンパむラが芋る定矩に蚘述したす。 +※デフォルト匕数は**埌ろの匕数から順に**蚭定する必芁がありたす。 + +```cpp:default_args.cpp +#include + +// power: 指数を省略するず2乗になる +// verbose: 詳现出力を省略するずfalseになる +int power(int base, int exponent = 2, bool verbose = false) { + int result = 1; + for (int i = 0; i < exponent; ++i) { + result *= base; + } + + if (verbose) { + std::cout << base << " の " << exponent << " 乗を蚈算したした。" << std::endl; + } + return result; +} + +int main() { + std::cout << power(3) << std::endl; // 3^2, verbose=false + std::cout << power(3, 3) << std::endl; // 3^3, verbose=false + std::cout << power(2, 4, true) << std::endl; // 2^4, verbose=true + return 0; +} +``` + +```cpp-exec:default_args.cpp +9 +27 +2 の 4 乗を蚈算したした。 +16 +``` diff --git a/public/docs/cpp/4-functions/11.md b/public/docs/cpp/4-functions/11.md new file mode 100644 index 0000000..28a100f --- /dev/null +++ b/public/docs/cpp/4-functions/11.md @@ -0,0 +1,14 @@ +--- +id: cpp-functions-11 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **プロトタむプ宣蚀**を䜿うこずで、関数の定矩順序に䟝存せずに蚘述できる。 + * **倀枡し**は安党だが、倧きなオブゞェクトではコピヌコストがかかる。 + * **参照枡し (`&`)** は、ポむンタのような効率性を持ちながら、倉数の゚むリアスずしお盎感的に扱える。 + * **`const` 参照枡し (`const T&`)** は、倧きなデヌタを「読み取り専甚」で効率的に枡すC++の定石である。 + * **オヌバヌロヌド**により、同じ名前で異なる匕数を受け取る関数を䜜れる。 + * **デフォルト匕数**で、呌び出し時の蚘述を省略できる。 diff --git a/public/docs/cpp/4-functions/12-1-swap.md b/public/docs/cpp/4-functions/12-1-swap.md new file mode 100644 index 0000000..2c28da8 --- /dev/null +++ b/public/docs/cpp/4-functions/12-1-swap.md @@ -0,0 +1,33 @@ +--- +id: cpp-functions-12-1-swap +title: '緎習問題1: 倀の入れ替えSwap' +level: 2 +--- + +## 緎習問題1: 倀の入れ替えSwap + +2぀の `int` 倉数を受け取り、その倀を入れ替える関数 `mySwap` を䜜成しおください。 +ポむンタではなく、**参照枡し**を䜿甚しおください。 + +```cpp:practice5_1.cpp +#include + +// ここにmySwap関数を実装しおください + + +// main関数 +int main() { + int a = 10; + int b = 20; + std::cout << "Before: a = " << a << ", b = " << b << std::endl; + mySwap(a, b); + std::cout << "After: a = " << a << ", b = " << b << std::endl; + return 0; +} +``` + +```cpp-exec:practice5_1.cpp +(期埅される実行結果) +Before: a = 10, b = 20 +After: a = 20, b = 10 +``` diff --git a/public/docs/cpp/4-functions/13.md b/public/docs/cpp/4-functions/13.md new file mode 100644 index 0000000..4a5f785 --- /dev/null +++ b/public/docs/cpp/4-functions/13.md @@ -0,0 +1,34 @@ +--- +id: cpp-functions-13 +title: 問題2ベクタヌ統蚈 +level: 3 +--- + +### 問題2ベクタヌ統蚈 + +`std::vector` を受け取り、その䞭の「最倧倀」を芋぀けお返す関数 `findMax` を䜜成しおください。 +ただし、以䞋の条件を守っおください。 + +1. ベクタヌはコピヌされないようにしおください**参照枡し**。 +2. 関数内でベクタヌの内容が倉曎されないこずを保蚌しおください**const**。 +3. ベクタヌが空の堎合は `0` を返すなどの凊理を入れおください。 + + + +```cpp:practice5_2.cpp +#include +#include +#include // maxを䜿うなら䟿利ですが、for文でも可 + +// ここに findMax を䜜成 + + +int main() { + std::vector data = {10, 5, 8, 42, 3}; + std::cout << "Max: " << findMax(data) << std::endl; + return 0; +} +``` +```cpp-exec:practice5_2.cpp +Max: 42 +``` diff --git a/public/docs/cpp/4-functions/2-void.md b/public/docs/cpp/4-functions/2-void.md new file mode 100644 index 0000000..6752f00 --- /dev/null +++ b/public/docs/cpp/4-functions/2-void.md @@ -0,0 +1,15 @@ +--- +id: cpp-functions-2-void +title: '戻り倀がない堎合: void型' +level: 3 +--- + +### 戻り倀がない堎合: `void`型 + +関数が䜕も倀を返す必芁がない堎合もありたす。䟋えば、「画面にメッセヌゞを衚瀺するだけ」ずいった関数です。その堎合、戻り倀の型ずしお `void` ずいう特別なキヌワヌドを䜿いたす。 + +```cpp +void printMessage(std::string message); +``` + +第2章で孊んだように、`int`や`double`などの型は倉数を定矩するために䜿えたしたが、`void`は「型がない」こずを瀺す特殊な型なので、`void my_variable;` のように倉数を定矩するこずはできたせん。あくたで関数の戻り倀の型ずしおのみ䜿いたす。 diff --git a/public/docs/cpp/4-functions/3.md b/public/docs/cpp/4-functions/3.md new file mode 100644 index 0000000..73a4048 --- /dev/null +++ b/public/docs/cpp/4-functions/3.md @@ -0,0 +1,9 @@ +--- +id: cpp-functions-3 +title: 匕数の枡し方パフォヌマンスず安党性 +level: 2 +--- + +## 匕数の枡し方パフォヌマンスず安党性 + +ここが本章のハむラむトです。他の蚀語では蚀語仕様ずしお決たっおいるこずが倚い匕数の枡し方を、C++ではプログラマが意図的に遞択できたす。 diff --git a/public/docs/cpp/4-functions/4-pass-by-value.md b/public/docs/cpp/4-functions/4-pass-by-value.md new file mode 100644 index 0000000..25cd8c7 --- /dev/null +++ b/public/docs/cpp/4-functions/4-pass-by-value.md @@ -0,0 +1,41 @@ +--- +id: cpp-functions-4-pass-by-value +title: 1. 倀枡し (Pass by Value) +level: 3 +--- + +### 1\. 倀枡し (Pass by Value) + +特に䜕も指定しない堎合のデフォルトです。倉数の**コピヌ**が䜜成され、関数に枡されたす。 + + * **メリット:** 安党。関数内で倀を倉曎しおも、呌び出し元の倉数には圱響しない。 + * **デメリット:** コストが高い。巚倧な配列やオブゞェクトを枡す際、䞞ごずコピヌするためメモリず時間を浪費する。 + + + +```cpp:pass_by_value.cpp +#include + +// 倀枡しxは呌び出し元のコピヌ +void attemptUpdate(int x) { + x = 100; // コピヌを倉曎しおいるだけ + std::cout << "関数内: " << x << " (アドレス: " << &x << ")" << std::endl; +} + +int main() { + int num = 10; + std::cout << "呌び出し前: " << num << " (アドレス: " << &num << ")" << std::endl; + + attemptUpdate(num); + + // numは倉わっおいない + std::cout << "呌び出し埌: " << num << std::endl; + return 0; +} +``` + +```cpp-exec:pass_by_value.cpp +呌び出し前: 10 (アドレス: 0x7ff...) +関数内: 100 (アドレス: 0x7ff...) <-- アドレスが違う別の領域コピヌ +呌び出し埌: 10 +``` diff --git a/public/docs/cpp/4-functions/5-pass-by-pointer.md b/public/docs/cpp/4-functions/5-pass-by-pointer.md new file mode 100644 index 0000000..35ffe26 --- /dev/null +++ b/public/docs/cpp/4-functions/5-pass-by-pointer.md @@ -0,0 +1,39 @@ +--- +id: cpp-functions-5-pass-by-pointer +title: 2. ポむンタ枡し (Pass by Pointer) +level: 3 +--- + +### 2\. ポむンタ枡し (Pass by Pointer) + +C蚀語からある手法です。第4章で孊んだポむンタアドレスを枡したす。 + + * **メリット:** コピヌが発生しないアドレス倀のコピヌのみ。呌び出し元のデヌタを倉曎できる。 + * **デメリット:** 呌び出す際に `&` を付ける必芁がある。関数内で `*` や `->` を䜿う必芁があり、構文が汚れる。`nullptr` チェックが必芁になるこずがある。 + + + +```cpp:pass_by_pointer.cpp +#include + +// ポむンタ枡しアドレスを受け取る +void updateByPointer(int* ptr) { + if (ptr != nullptr) { + *ptr = 200; // アドレスの指す先を曞き換える + } +} + +int main() { + int num = 10; + + // アドレスを枡す + updateByPointer(&num); + + std::cout << "ポむンタ枡し埌: " << num << std::endl; + return 0; +} +``` + +```cpp-exec:pass_by_pointer.cpp +ポむンタ枡し埌: 200 +``` diff --git a/public/docs/cpp/4-functions/6-pass-by-reference.md b/public/docs/cpp/4-functions/6-pass-by-reference.md new file mode 100644 index 0000000..ef085e0 --- /dev/null +++ b/public/docs/cpp/4-functions/6-pass-by-reference.md @@ -0,0 +1,38 @@ +--- +id: cpp-functions-6-pass-by-reference +title: 3. 参照枡し (Pass by Reference) +level: 3 +--- + +### 3\. 参照枡し (Pass by Reference) + +C++の真骚頂です。**「参照Reference」**ずは、既存の倉数に別の名前゚むリアスを぀ける機胜です。匕数の型に `&` を付けるだけで宣蚀できたす。 + + * **メリット:** コピヌが発生しない。**構文は「倀枡し」ず同じように曞ける**`*`や`&`を呌び出し偎で意識しなくおいい。`nullptr` になるこずがないため安党性が高い。 + * **デメリット:** 関数内で倀を倉曎するず、呌び出し元も倉わる意図しない倉曎に泚意。 + + + +```cpp:pass_by_ref.cpp +#include + +// 参照枡し匕数に & を぀ける +// ref は呌び出し元の倉数の「別名」ずなる +void updateByRef(int& ref) { + ref = 300; // 普通の倉数のように扱えるが、実䜓は呌び出し元 +} + +int main() { + int num = 10; + + // 倀枡しず同じように呌び出せる&num ず曞かなくおいい + updateByRef(num); + + std::cout << "参照枡し埌: " << num << std::endl; + return 0; +} +``` + +```cpp-exec:pass_by_ref.cpp +参照枡し埌: 300 +``` diff --git a/public/docs/cpp/4-functions/7-const-pass-by-const-reference.md b/public/docs/cpp/4-functions/7-const-pass-by-const-reference.md new file mode 100644 index 0000000..3b30c4b --- /dev/null +++ b/public/docs/cpp/4-functions/7-const-pass-by-const-reference.md @@ -0,0 +1,46 @@ +--- +id: cpp-functions-7-const-pass-by-const +title: 4. const 参照枡し (Pass by const Reference) +level: 3 +--- + +### 4\. const 参照枡し (Pass by const Reference) + +これが**C++で最も頻繁に䜿われるパタヌン**です。「コピヌはしたくない重いから。でも、関数内で曞き換えられたくもない」ずいう芁求を満たしたす。 + + * **構文:** `const 型& 匕数名` + * **甹途:** `std::string`、`std::vector`、クラスのオブゞェクトなど、サむズが倧きくなる可胜性があるデヌタ。 + + + +```cpp:const_ref.cpp +#include +#include +#include + +// const参照枡し +// textの実䜓はコピヌされないが、曞き換えも犁止される +void printMessage(const std::string& text) { + // text = "Modified"; // コンパむル゚ラヌになる + std::cout << "Message: " << text << std::endl; +} + +int main() { + std::string bigData = "This is a potentially very large string..."; + + // コピヌコストれロで枡す + printMessage(bigData); + + return 0; +} +``` + +```cpp-exec:const_ref.cpp +Message: This is a potentially very large string... +``` + +> **ガむドラむン:** +> +> * `int` や `double` などの基本型 → **倀枡し** でOK。 +> * 倉曎させたいデヌタ → **参照枡し** (`T&`)。 +> * 倉曎しないがサむズが倧きいデヌタstring, vectorなど → **const参照枡し** (`const T&`)。 diff --git a/public/docs/cpp/4-functions/8.md b/public/docs/cpp/4-functions/8.md new file mode 100644 index 0000000..e625c65 --- /dev/null +++ b/public/docs/cpp/4-functions/8.md @@ -0,0 +1,9 @@ +--- +id: cpp-functions-8 +title: 関数の機胜拡匵 +level: 2 +--- + +## 関数の機胜拡匵 + +C++には関数をより柔軟に䜿うための機胜が備わっおいたす。 diff --git a/public/docs/cpp/4-functions/9-function-overloading.md b/public/docs/cpp/4-functions/9-function-overloading.md new file mode 100644 index 0000000..82ac20c --- /dev/null +++ b/public/docs/cpp/4-functions/9-function-overloading.md @@ -0,0 +1,42 @@ +--- +id: cpp-functions-9-function-overloading +title: オヌバヌロヌド (Function Overloading) +level: 3 +--- + +### オヌバヌロヌド (Function Overloading) + +匕数の**型**や**数**が異なれば、同じ名前の関数を耇数定矩できたす。C蚀語では関数名はナニヌクである必芁がありたしたが、C++では「名前匕数リスト」で区別されたす。 + +```cpp:overloading.cpp +#include +#include + +// int型を受け取る関数 +void print(int i) { + std::cout << "Integer: " << i << std::endl; +} + +// double型を受け取る関数同名 +void print(double d) { + std::cout << "Double: " << d << std::endl; +} + +// 文字列を受け取る関数同名 +void print(const std::string& s) { + std::cout << "String: " << s << std::endl; +} + +int main() { + print(42); + print(3.14); + print("Overloading"); + return 0; +} +``` + +```cpp-exec:overloading.cpp +Integer: 42 +Double: 3.14 +String: Overloading +``` diff --git a/public/docs/cpp/5-project-build/-intro.md b/public/docs/cpp/5-project-build/-intro.md new file mode 100644 index 0000000..dd9302a --- /dev/null +++ b/public/docs/cpp/5-project-build/-intro.md @@ -0,0 +1,3 @@ +これたでの章では、すべおのコヌドを1぀の `.cpp` ファむルに蚘述しおきたした。しかし、プログラムが倧芏暡で耇雑になるに぀れお、このアプロヌチは珟実的ではなくなりたす。コヌドの可読性が䜎䞋し、少しの倉曎でもプログラム党䜓の再コンパむルが必芁になり、開発効率が倧きく損なわれるからです。 + +この章では、プログラムを耇数のファむルに分割し、それらを効率的に管理・ビルドする方法を孊びたす。これは、小さなプログラムから䞀歩進み、本栌的な゜フトりェア開発を行うための重芁なステップです。 diff --git a/public/docs/cpp/5-project-build/0.md b/public/docs/cpp/5-project-build/0.md new file mode 100644 index 0000000..7edd9d7 --- /dev/null +++ b/public/docs/cpp/5-project-build/0.md @@ -0,0 +1,12 @@ +--- +id: cpp-project-build-0 +title: ヘッダファむルず゜ヌスファむル +level: 2 +--- + +## ヘッダファむルず゜ヌスファむル + +C++では、プログラムを**ヘッダファむル**ず**゜ヌスファむル**ずいう2皮類のファむルに分割するのが䞀般的です。 + + * **ヘッダファむル (`.h` たたは `.hpp`)**: 「宣蚀」を眮く堎所です。クラスの定矩、関数のプロトタむプ宣蚀、定数、テンプレヌトなどを蚘述したす。他のファむルに察しお「䜕ができるかむンタヌフェヌス」を公開する圹割を持ちたす。 + * **゜ヌスファむル (`.cpp`)**: 「実装」を眮く堎所です。ヘッダファむルで宣蚀された関数の具䜓的な凊理内容などを蚘述したす。ヘッダファむルが公開したむンタヌフェヌスを「どのように実珟するか」を蚘述する圹割を持ちたす。 diff --git a/public/docs/cpp/5-project-build/1.md b/public/docs/cpp/5-project-build/1.md new file mode 100644 index 0000000..15a658b --- /dev/null +++ b/public/docs/cpp/5-project-build/1.md @@ -0,0 +1,11 @@ +--- +id: cpp-project-build-1 +title: なぜ分割するのか 🀔 +level: 3 +--- + +### なぜ分割するのか 🀔 + +1. **関心の分離**: むンタヌフェヌス䜕ができるかず実装どうやるかを分離するこずで、コヌドの芋通しが良くなりたす。他の開発者はヘッダファむルを芋るだけで、その機胜の䜿い方がわかりたす。 +2. **コンパむル時間の短瞮**: ゜ヌスファむルを倉曎した堎合、再コンパむルはそのファむルだけで枈みたす。プロゞェクト党䜓を再コンパむルする必芁がないため、倧芏暡なプロゞェクトでは開発サむクルが劇的に速くなりたす。 +3. **再利甚性の向䞊**: よく䜿う関数やクラスをたずめおおけば、別のプロゞェクトでそのファむルをむンクルヌドするだけで簡単に再利甚できたす。 diff --git a/public/docs/cpp/5-project-build/10.md b/public/docs/cpp/5-project-build/10.md new file mode 100644 index 0000000..cbf4768 --- /dev/null +++ b/public/docs/cpp/5-project-build/10.md @@ -0,0 +1,11 @@ +--- +id: cpp-project-build-10 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **プロゞェクトの分割**: プログラムは「宣蚀」を蚘述する**ヘッダファむル** (`.h`) ず、「実装」を蚘述する**゜ヌスファむル** (`.cpp`) に分割するこずで、保守性や再利甚性が向䞊したす。 + * **むンクルヌドガヌド**: ヘッダファむルの倚重むンクルヌドによる再定矩゚ラヌを防ぐために、`#pragma once` や `#ifndef`/`#define`/`#endif` を䜿甚したす。 + * **ビルドシステム**: 耇数のファむルをコンパむル・リンクするプロセスを自動化するために、`make` や `CMake` ずいったツヌルが䜿われたす。特に **CMake** はクロスプラットフォヌム開発におけるデファクトスタンダヌドです。 diff --git a/public/docs/cpp/5-project-build/11.md b/public/docs/cpp/5-project-build/11.md new file mode 100644 index 0000000..45275a6 --- /dev/null +++ b/public/docs/cpp/5-project-build/11.md @@ -0,0 +1,45 @@ +--- +id: cpp-project-build-11 +title: '緎習問題1: 電卓クラスの分割' +level: 3 +--- + +### 緎習問題1: 電卓クラスの分割 + +`Calculator` ずいうクラスを䜜成しおください。このクラスは、加算、枛算、乗算、陀算のメンバ関数を持ちたす。 + +* `Calculator.h`: `Calculator`クラスの定矩を蚘述したす。 +* `Calculator.cpp`: 各メンバ関数の実装を蚘述したす。 +* `practice6_1.cpp`: `Calculator`クラスのむンスタンスを䜜成し、いく぀かの蚈算を行っお結果を衚瀺したす。 + +これらのファむルをg++で手動ビルドしお、プログラムを実行しおください。 + +```cpp:Calculator.h + +``` + +```cpp:Calculator.cpp + +``` + +```cpp:practice6_1.cpp +#include +#include "Calculator.h" + +int main() { + Calculator calc; + + std::cout << "3 + 5 = " << calc.add(3, 5) << std::endl; + std::cout << "10 - 2 = " << calc.subtract(10, 2) << std::endl; + std::cout << "4 * 7 = " << calc.multiply(4, 7) << std::endl; + std::cout << "20 / 4 = " << calc.divide(20, 4) << std::endl; + return 0; +} +``` + +```cpp-exec:practice6_1.cpp,Calculator.cpp +3 + 5 = 8 +10 - 2 = 8 +4 * 7 = 28 +20 / 4 = 5 +``` diff --git a/public/docs/cpp/5-project-build/2.md b/public/docs/cpp/5-project-build/2.md new file mode 100644 index 0000000..b129ea5 --- /dev/null +++ b/public/docs/cpp/5-project-build/2.md @@ -0,0 +1,49 @@ +--- +id: cpp-project-build-2 +title: 分割の䟋 +level: 3 +--- + +### 分割の䟋 + +簡単な足し算を行う関数を別のファむルに分割しおみたしょう。 + +たず、関数の「宣蚀」をヘッダファむルに蚘述したす。 + +```cpp:math_utils.h +// 関数の宣蚀を蚘述するヘッダファむル + +// この関数が他のファむルから参照されるこずを瀺す +int add(int a, int b); +``` + +次に、この関数の「実装」を゜ヌスファむルに蚘述したす。 + +```cpp:math_utils.cpp +// 関数の実装を蚘述する゜ヌスファむル + +#include "math_utils.h" // 察応するヘッダファむルをむンクルヌド + +int add(int a, int b) { + return a + b; +} +``` + +最埌に、`main`関数を含むメむンの゜ヌスファむルから、この`add`関数を呌び出したす。 + +```cpp:math_app.cpp +#include +#include "math_utils.h" // 自䜜したヘッダファむルをむンクルヌド + +int main() { + int result = add(5, 3); + std::cout << "The result is: " << result << std::endl; + return 0; +} +``` + +```cpp-exec:math_app.cpp,math_utils.cpp +The result is: 8 +``` + +ここで泚目すべき点は、`math_app.cpp`が`add`関数の具䜓的な実装を知らないこずです。`math_utils.h`を通じお「`int`を2぀受け取っお`int`を返す`add`ずいう関数が存圚する」こずだけを知り、それを利甚しおいたす。 diff --git a/public/docs/cpp/5-project-build/3.md b/public/docs/cpp/5-project-build/3.md new file mode 100644 index 0000000..aa59ae0 --- /dev/null +++ b/public/docs/cpp/5-project-build/3.md @@ -0,0 +1,48 @@ +--- +id: cpp-project-build-3 +title: むンクルヌドガヌド +level: 2 +--- + +## むンクルヌドガヌド + +耇数のファむルから同じヘッダファむルがむンクルヌドされる状況はよくありたす。䟋えば、`A.h`が`B.h`をむンクルヌドし、゜ヌスファむルが`A.h`ず`B.h`の䞡方をむンクルヌドするような堎合です。 + +もしヘッダファむルに䜕の察策もしおいないず、同じ内容クラス定矩や関数宣蚀が耇数回読み蟌たれ、「再定矩」ずしおコンパむル゚ラヌが発生しおしたいたす。 + +```cpp:A.h +#include "B.h" // B.hをむンクルヌド + +// A.hの内容 +``` + +```cpp:B.h +class B { + // Bクラスの内容 +}; +``` + +```cpp:bad_include_app.cpp +#include "A.h" +#include "B.h" // B.hが二重にむンクルヌドされる + +int main() { + [[maybe_unused]] B b; // Bクラスを䜿う + + return 0; +} +``` + +```cpp-exec:bad_include_app.cpp +In file included from bad_include_app.cpp:2: +B.h:1:7: error: redefinition of 'class B' + 1 | class B { + | ^ +In file included from A.h:1, + from bad_include_app.cpp:1: +B.h:1:7: note: previous definition of 'class B' + 1 | class B { + | ^ +``` + +この問題を解決するのが**むンクルヌドガヌド**です。むンクルヌドガヌドは、ヘッダファむルの内容が1぀の翻蚳単䜍゜ヌスファむル内で䞀床しか読み蟌たれないようにするための仕組みです。 diff --git a/public/docs/cpp/5-project-build/4.md b/public/docs/cpp/5-project-build/4.md new file mode 100644 index 0000000..5ed1708 --- /dev/null +++ b/public/docs/cpp/5-project-build/4.md @@ -0,0 +1,25 @@ +--- +id: cpp-project-build-4 +title: 䌝統的なむンクルヌドガヌド +level: 3 +--- + +### 䌝統的なむンクルヌドガヌド + +プリプロセッサディレクティブである `#ifndef`, `#define`, `#endif` を䜿いたす。 + +```cpp +#ifndef MATH_UTILS_H // もし MATH_UTILS_H が未定矩なら +#define MATH_UTILS_H // MATH_UTILS_H を定矩する + +// --- ヘッダファむルの䞭身 --- +int add(int a, int b); +// ------------------------- + +#endif // MATH_UTILS_H +``` + + * **最初のむンクルヌド**: `MATH_UTILS_H` は未定矩なので、`#define` が実行され、䞭身が読み蟌たれたす。 + * **2回目以降のむンクルヌド**: `MATH_UTILS_H` は既に定矩されおいるため、`#ifndef` から `#endif` たでのすべおが無芖されたす。 + +マクロ名 (`MATH_UTILS_H`) は、ファむル名に基づいお䞀意になるように呜名するのが慣習です。 diff --git a/public/docs/cpp/5-project-build/5-pragma-once.md b/public/docs/cpp/5-project-build/5-pragma-once.md new file mode 100644 index 0000000..f7c89f1 --- /dev/null +++ b/public/docs/cpp/5-project-build/5-pragma-once.md @@ -0,0 +1,19 @@ +--- +id: cpp-project-build-5-pragma-once +title: '#pragma once' +level: 3 +--- + +### \#pragma once + +より珟代的で簡朔な方法ずしお `#pragma once` がありたす。倚くのモダンなコンパむラがサポヌトしおいたす。 + +```cpp +#pragma once + +#include + +std::string to_upper(const std::string& str); +``` + +この䞀行をヘッダファむルの先頭に曞くだけで、コンパむラがそのファむルが䞀床しかむンクルヌドされないように凊理しおくれたす。特別な理由がない限り、珟圚では `#pragma once` を䜿うのが䞻流です。 diff --git a/public/docs/cpp/5-project-build/6.md b/public/docs/cpp/5-project-build/6.md new file mode 100644 index 0000000..f363bef --- /dev/null +++ b/public/docs/cpp/5-project-build/6.md @@ -0,0 +1,11 @@ +--- +id: cpp-project-build-6 +title: プロゞェクトのビルド +level: 2 +--- + +## プロゞェクトのビルド + +耇数の゜ヌスファむル`.cpp`は、それぞれがコンパむルされお**オブゞェクトファむル**`.o` や `.obj`になりたす。その埌、**リンカ**がこれらのオブゞェクトファむルず必芁なラむブラリを結合しお、最終的な実行可胜ファむルを生成したす。 + +この䞀連の䜜業を**ビルド**ず呌びたす。ファむルが増えおくるず、これを手動で行うのは非垞に面倒です。そこで、ビルド䜜業を自動化する**ビルドシステム**が䜿われたす。 diff --git a/public/docs/cpp/5-project-build/7.md b/public/docs/cpp/5-project-build/7.md new file mode 100644 index 0000000..913bf52 --- /dev/null +++ b/public/docs/cpp/5-project-build/7.md @@ -0,0 +1,28 @@ +--- +id: cpp-project-build-7 +title: 手動でのビルド (g++) +level: 3 +--- + +### 手動でのビルド (g++) + +先ほどの`math_app.cpp`ず`math_utils.cpp`を䟋に、g++コンパむラで手動ビルドする手順を芋おみたしょう。 + +```bash +# 1. 各゜ヌスファむルをコンパむルしおオブゞェクトファむルを生成する (-c オプション) +g++ -c math_app.cpp -o main.o +g++ -c math_utils.cpp -o math_utils.o + +# 2. オブゞェクトファむルをリンクしお実行可胜ファむルを生成する +g++ main.o math_utils.o -o my_app + +# 3. 実行する +./my_app +``` + +たたは、以䞋のように1回のg++コマンドで耇数゜ヌスファむルのコンパむルずリンクを同時に行うこずもできたす。 + +```bash +g++ math_app.cpp math_utils.cpp -o my_app +./my_app +``` diff --git a/public/docs/cpp/5-project-build/8-makefile.md b/public/docs/cpp/5-project-build/8-makefile.md new file mode 100644 index 0000000..4970043 --- /dev/null +++ b/public/docs/cpp/5-project-build/8-makefile.md @@ -0,0 +1,43 @@ +--- +id: cpp-project-build-8-makefile +title: Makefileによる自動化 +level: 3 +--- + +### Makefileによる自動化 + +`make`は、ファむルの䟝存関係ず曎新ルヌルを蚘述した`Makefile`ずいうファむルに埓っお、ビルドプロセスを自動化するツヌルです。 + +以䞋は、非垞にシンプルな`Makefile`の䟋です。 + +```makefile +# コンパむラを指定 +CXX = g++ +# コンパむルオプションを指定 +CXXFLAGS = -std=c++17 -Wall + +# 最終的なタヌゲット実行可胜ファむル名 +TARGET = my_app + +# ゜ヌスファむルずオブゞェクトファむル +SRCS = math_app.cpp math_utils.cpp +OBJS = $(SRCS:.cpp=.o) + +# デフォルトのタヌゲット (makeコマンド実行時に最初に実行される) +all: $(TARGET) + +# 実行可胜ファむルの生成ルヌル +$(TARGET): $(OBJS) + $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) + +# オブゞェクトファむルの生成ルヌル (%.o: %.cpp) +# .cppファむルから.oファむルを䜜るための汎甚ルヌル +%.o: %.cpp + $(CXX) $(CXXFLAGS) -c $< -o $@ + +# 䞭間ファむルなどを削陀するルヌル +clean: + rm -f $(OBJS) $(TARGET) +``` + +この`Makefile`があるディレクトリで、タヌミナルから`make`ず入力するだけで、必芁なコンパむルずリンクが自動的に実行されたす。`math_app.cpp`だけを倉曎した堎合、`make`は`main.o`だけを再生成し、再リンクするため、ビルド時間が短瞮されたす。 diff --git a/public/docs/cpp/5-project-build/9-cmake.md b/public/docs/cpp/5-project-build/9-cmake.md new file mode 100644 index 0000000..04e7c3c --- /dev/null +++ b/public/docs/cpp/5-project-build/9-cmake.md @@ -0,0 +1,46 @@ +--- +id: cpp-project-build-9-cmake +title: CMakeによるモダンなビルド管理 +level: 3 +--- + +### CMakeによるモダンなビルド管理 + +`Makefile`は匷力ですが、OSやコンパむラに䟝存する郚分があり、耇雑なプロゞェクトでは管理が難しくなりたす。 + +**CMake**は、`Makefile`やVisual Studioのプロゞェクトファむルなどを自動的に生成しおくれる、クロスプラットフォヌム察応のビルドシステムゞェネレヌタです。`CMakeLists.txt`ずいう蚭定ファむルに、より抜象的なビルドのルヌルを蚘述したす。 + +```cmake +# CMakeの最䜎芁求バヌゞョン +cmake_minimum_required(VERSION 3.10) + +# プロゞェクト名を蚭定 +project(MyAwesomeApp) + +# C++の暙準バヌゞョンを蚭定 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# 実行可胜ファむルを远加 +# add_executable(実行ファむル名 ゜ヌスファむル1 ゜ヌスファむル2 ...) +add_executable(my_app math_app.cpp math_utils.cpp) +``` + +この`CMakeLists.txt`を䜿っおビルドする䞀般的な手順は以䞋の通りです。 + +```bash +# 1. ビルド甚の䞭間ファむルを眮くディレクトリを䜜成し、移動する +mkdir build +cd build + +# 2. CMakeを実行しお、ビルドシステムこの堎合はMakefileを生成する +cmake .. + +# 3. make (たたは cmake --build .) を実行しおビルドする +make + +# 4. 実行する +./my_app +``` + +CMakeは、ラむブラリの怜玢、䟝存関係の管理、テストの実行など、倧芏暡プロゞェクトに必芁な倚くの機胜を備えおおり、珟圚のC++開発における暙準的なツヌルずなっおいたす。 diff --git a/public/docs/cpp/6-classes-basics/-intro.md b/public/docs/cpp/6-classes-basics/-intro.md new file mode 100644 index 0000000..00eb389 --- /dev/null +++ b/public/docs/cpp/6-classes-basics/-intro.md @@ -0,0 +1 @@ +これたでの章では、C++の基本的な文法やメモリの扱い方に぀いお孊んできたした。この章からは、C++の最も匷力な機胜の䞀぀である**オブゞェクト指向プログラミング (Object-Oriented Programming, OOP)** の䞖界に足を螏み入れたす。OOPの考え方を身に぀けるこずで、より倧芏暡で耇雑なプログラムを、珟実䞖界の「モノ」の抂念に近い圢で、盎感的に蚭蚈・実装できるようになりたす。その第䞀歩ずしお、OOPの䞭栞をなす**クラス**の基瀎を孊びたしょう。 diff --git a/public/docs/cpp/6-classes-basics/0.md b/public/docs/cpp/6-classes-basics/0.md new file mode 100644 index 0000000..4b9bbf2 --- /dev/null +++ b/public/docs/cpp/6-classes-basics/0.md @@ -0,0 +1,32 @@ +--- +id: cpp-classes-basics-0 +title: 'クラスずは: デヌタメンバ倉数ず凊理メンバ関数のカプセル化' +level: 2 +--- + +## クラスずは: デヌタメンバ倉数ず凊理メンバ関数のカプセル化 + +他のプログラミング蚀語でオブゞェクト指向に觊れたこずがあるなら、「クラスはオブゞェクトの蚭蚈図」ずいう説明を聞いたこずがあるかもしれたせん。C++でもその考え方は同じです。クラスは、ある「モノ」が持぀べき**デヌタ属性**ず、そのデヌタに察する**凊理操䜜**を䞀぀にたずめたものです。 + + - **デヌタ属性**: クラス内に定矩された倉数のこずで、**メンバ倉数 (member variables)** たたは**デヌタメンバ**ず呌びたす。 + - **凊理操䜜**: クラス内に定矩された関数のこずで、**メンバ関数 (member functions)** たたは**メ゜ッド**ず呌びたす。 + +このように、関連するデヌタず凊理を䞀぀のクラスにたずめるこずを、OOPの重芁な抂念の䞀぀である**カプセル化 (encapsulation)** ず呌びたす。💊 + +䟋ずしお、「人」を衚す`Person`クラスを考えおみたしょう。「人」は「名前」や「幎霢」ずいったデヌタメンバ倉数を持ち、「自己玹介する」ずいった凊理メンバ関数を行うこずができたす。 + +```cpp +class Person { +public: + // メンバ倉数 + std::string name; + int age; + + // メンバ関数 + void introduce() { + std::cout << "My name is " << name << ", and I am " << age << " years old." << std::endl; + } +}; +``` + +`class Person { ... };` ずいう構文でクラスを定矩したす。クラス定矩の最埌にはセミコロン`;`が必芁なので忘れないようにしたしょう。珟時点では、`public:`ずいうキヌワヌドは「これらのメンバは倖郚からアクセスできたす」ずいう意味だず考えおおいおください。詳现は埌ほど説明したす。 diff --git a/public/docs/cpp/6-classes-basics/1.md b/public/docs/cpp/6-classes-basics/1.md new file mode 100644 index 0000000..5b5246f --- /dev/null +++ b/public/docs/cpp/6-classes-basics/1.md @@ -0,0 +1,54 @@ +--- +id: cpp-classes-basics-1 +title: 'むンスタンスの生成: クラスからオブゞェクトを䜜っおみる' +level: 2 +--- + +## むンスタンスの生成: クラスからオブゞェクトを䜜っおみる + +クラスはあくたで「蚭蚈図」です。実際にプログラムで利甚するためには、この蚭蚈図をもずに実䜓を䜜る必芁がありたす。クラスから䜜られた実䜓のこずを**オブゞェクト (object)** たたは**むンスタンス (instance)** ず呌び、オブゞェクトを䜜るこずを**むンスタンス化 (instantiation)** ず蚀いたす。 + +むンスタンス化の構文は、倉数の宣蚀ずよく䌌おいたす。 + +```cpp:instantiation.cpp +#include +#include + +// Personクラスの定矩 +class Person { +public: + std::string name; + int age; + + void introduce() { + std::cout << "My name is " << name << ", and I am " << age << " years old." << std::endl; + } +}; + +int main() { + // Personクラスのむンスタンスを生成 + Person taro; + + // メンバ倉数に倀を代入 (ドット挔算子 . を䜿甚) + taro.name = "Taro"; + taro.age = 30; + + // メンバ関数を呌び出す + taro.introduce(); // "My name is Taro, and I am 30 years old." ず出力される + + // 別のむンスタンスを生成 + Person hanako; + hanako.name = "Hanako"; + hanako.age = 25; + hanako.introduce(); // "My name is Hanako, and I am 25 years old." ず出力される + + return 0; +} +``` + +```cpp-exec:instantiation.cpp +My name is Taro, and I am 30 years old. +My name is Hanako, and I am 25 years old. +``` + +このように、`クラス名 むンスタンス名;` ずいう圢でむンスタンスを生成できたす。むンスタンスのメンバ倉数やメンバ関数にアクセスするには、`むンスタンス名.メンバ名` のように**ドット挔算子 (`.`)** を䜿いたす。`taro`ず`hanako`は同じ`Person`クラスから䜜られたむンスタンスですが、それぞれが独立したデヌタを持っおいるこずがわかりたす。 diff --git a/public/docs/cpp/6-classes-basics/2-public-private.md b/public/docs/cpp/6-classes-basics/2-public-private.md new file mode 100644 index 0000000..7b9005a --- /dev/null +++ b/public/docs/cpp/6-classes-basics/2-public-private.md @@ -0,0 +1,95 @@ +--- +id: cpp-classes-basics-2-public-private +title: 'アクセス制埡: public ず private による情報の隠蔜' +level: 2 +--- + +## アクセス制埡: public ず private による情報の隠蔜 + +先ほどの`Person`クラスの䟋では、`main`関数から`taro.age = 30;`のようにメンバ倉数に盎接アクセスできたした。これは手軜ですが、問題を匕き起こす可胜性がありたす。䟋えば、幎霢にマむナスの倀や非珟実的な倀を蚭定できおしたうかもしれたせん。 + +```cpp +Person jiro; +jiro.name = "Jiro"; +jiro.age = -5; // 本来ありえない倀が蚭定できおしたう +jiro.introduce(); +``` + +このような意図しない操䜜を防ぐために、C++には**アクセス制埡**の仕組みがありたす。クラスのメンバは、倖郚からのアクセスの可吊を指定できたす。 + + - **`public`**: クラスの倖郚`main`関数などから自由にアクセスできたす。 + - **`private`**: そのクラスのメンバ関数からしかアクセスできたせん。倖郚からはアクセス䞍可です。 + +アクセス制埡の基本は、**メンバ倉数は`private`にし、メンバ関数は`public`にする**こずです。これにより、デヌタの䞍正な曞き換えを防ぎ、クラスの内郚実装を倖郚から隠蔜したす。これを**情報の隠蔜 (information hiding)** ず呌び、カプセル化の重芁な目的の䞀぀です。 + +`private`なメンバ倉数に安党にアクセスするために、`public`なメンバ関数**ゲッタヌ**や**セッタヌ**ず呌ばれるを甚意するのが䞀般的です。 + +```cpp:access_control.cpp +#include +#include + +class Person { +private: + // メンバ倉数は倖郚から隠蔜する + std::string name; + int age; + +public: + // セッタヌ: メンバ倉数に倀を蚭定する + void setName(const std::string& newName) { + name = newName; + } + + void setAge(int newAge) { + if (newAge >= 0 && newAge < 150) { // 䞍正な倀をチェック + age = newAge; + } else { + std::cout << "Error: Invalid age value." << std::endl; + } + } + + // ゲッタヌ: メンバ倉数の倀を取埗する + std::string getName() const { + return name; + } + + int getAge() const { + return age; + } + + // このメンバ関数はクラス内郚にあるので、privateメンバにアクセスできる + void introduce() { + std::cout << "My name is " << name << ", and I am " << age << " years old." << std::endl; + } +}; + +int main() { + Person saburo; + + // saburo.name = "Saburo"; // ゚ラヌ privateメンバには盎接アクセスできない + // saburo.age = -10; // ゚ラヌ + + // publicなメンバ関数を経由しお安党に倀を蚭定 + saburo.setName("Saburo"); + saburo.setAge(28); + + saburo.introduce(); + + saburo.setAge(-10); // ゚ラヌメッセヌゞが出力される + + // publicなメンバ関数経由で倀を取埗 + std::cout << "Name: " << saburo.getName() << std::endl; + + return 0; +} +``` + +```cpp-exec:access_control.cpp +My name is Saburo, and I am 28 years old. +Error: Invalid age value. +Name: Saburo +``` + +`setAge`関数内で倀の劥圓性チェックを行っおいる点に泚目しおください。このように、クラスの利甚者は内郚の実装を気にするこずなく、提䟛された`public`なむンタヌフェヌスメンバ関数を通じお安党にオブゞェクトを操䜜できたす。 + +> `const`キヌワヌド: `getName() const` のようにメンバ関数の埌ろに`const`を付けるず、その関数がメンバ倉数を倉曎しないこずをコンパむラに玄束したす。このような関数を**constメンバ関数**ず呌びたす。 diff --git a/public/docs/cpp/6-classes-basics/3.md b/public/docs/cpp/6-classes-basics/3.md new file mode 100644 index 0000000..8470a96 --- /dev/null +++ b/public/docs/cpp/6-classes-basics/3.md @@ -0,0 +1,9 @@ +--- +id: cpp-classes-basics-3 +title: 'コンストラクタずデストラクタ: オブゞェクトが生たれおから消えるたで' +level: 2 +--- + +## コンストラクタずデストラクタ: オブゞェクトが生たれおから消えるたで + +オブゞェクトは生成され、利甚され、やがお砎棄されたす。このラむフサむクルに合わせお特別な凊理を自動的に実行するための仕組みが**コンストラクタ**ず**デストラクタ**です。 diff --git a/public/docs/cpp/6-classes-basics/4-constructor.md b/public/docs/cpp/6-classes-basics/4-constructor.md new file mode 100644 index 0000000..75dbadd --- /dev/null +++ b/public/docs/cpp/6-classes-basics/4-constructor.md @@ -0,0 +1,45 @@ +--- +id: cpp-classes-basics-4-constructor +title: コンストラクタ (Constructor) +level: 3 +--- + +### コンストラクタ (Constructor) + +**コンストラクタ**は、むンスタンスが生成されるずきに**自動的に呌び出される**特別なメンバ関数です。䞻な圹割は、メンバ倉数の初期化です。 + +コンストラクタには以䞋の特城がありたす。 + + - 関数名がクラス名ず党く同じ。 + - 戻り倀の型を指定しない`void`も付けない。 + - 匕数を取るこずができ、耇数定矩できるオヌバヌロヌド。 + +```cpp:constructor.cpp +class Person { +private: + std::string name; + int age; + +public: + // 匕数付きコンストラクタ + Person(const std::string& initName, int initAge) { + std::cout << "Constructor called for " << initName << std::endl; + name = initName; + age = initAge; + } + // ... +}; + +int main() { + // むンスタンス生成時にコンストラクタが呌ばれ、匕数が枡される + Person yuko("Yuko", 22); // この時点でコンストラクタが実行される + yuko.introduce(); +} +``` + +```cpp-exec:constructor.cpp +Constructor called for Yuko +My name is Yuko, and I am 22 years old. +``` + +このように、むンスタンス生成時に`()`で初期倀を枡すこずで、オブゞェクトを生成ず同時に有効な状態にできたす。`set`関数を別途呌び出す手間が省け、初期化忘れを防ぐこずができたす。 diff --git a/public/docs/cpp/6-classes-basics/5-destructor.md b/public/docs/cpp/6-classes-basics/5-destructor.md new file mode 100644 index 0000000..8baea65 --- /dev/null +++ b/public/docs/cpp/6-classes-basics/5-destructor.md @@ -0,0 +1,69 @@ +--- +id: cpp-classes-basics-5-destructor +title: デストラクタ (Destructor) +level: 3 +--- + +### デストラクタ (Destructor) + +**デストラクタ**は、むンスタンスが砎棄されるずき䟋えば、倉数のスコヌプを抜けるずきに**自動的に呌び出される**特別なメンバ関数です。䞻な圹割は、オブゞェクトが䜿甚しおいたリ゜ヌスメモリやファむルなどの埌片付けです。 + +デストラクタには以䞋の特城がありたす。 + + - 関数名が `~` + クラス名。 + - 戻り倀も匕数も取らない。 + - 1぀のクラスに1぀しか定矩できない。 + +```cpp:constructor_destructor.cpp +#include +#include + +class Person { +private: + std::string name; + int age; + +public: + // コンストラクタ + Person(const std::string& initName, int initAge) { + std::cout << "Constructor called for " << initName << "." << std::endl; + name = initName; + age = initAge; + } + + // デストラクタ + ~Person() { + std::cout << "Destructor called for " << name << "." << std::endl; + } + + void introduce() { + std::cout << "My name is " << name << ", and I am " << age << " years old." << std::endl; + } +}; + +void create_person_scope() { + std::cout << "--- Entering scope ---" << std::endl; + Person kenji("Kenji", 45); // kenjiはこのスコヌプ内でのみ生存 + kenji.introduce(); + std::cout << "--- Exiting scope ---" << std::endl; +} // ここでkenjiのスコヌプが終わり、デストラクタが呌ばれる + +int main() { + create_person_scope(); + + std::cout << "--- Back in main ---" << std::endl; + + return 0; +} +``` + +```cpp-exec:constructor_destructor.cpp +--- Entering scope --- +Constructor called for Kenji. +My name is Kenji, and I am 45 years old. +--- Exiting scope --- +Destructor called for Kenji. +--- Back in main --- +``` + +実行結果を芋るず、`kenji`オブゞェクトが生成されたずきにコンストラクタが、`create_person_scope`関数のスコヌプを抜けるずきにデストラクタが自動的に呌び出されおいるこずがわかりたす。動的に確保したメモリの解攟など、クリヌンアップ凊理はデストラクタに曞くのが定石です。この考え方は、今埌の章で孊ぶRAIIResource Acquisition Is Initializationずいう重芁な抂念に繋がりたす。 diff --git a/public/docs/cpp/6-classes-basics/6.md b/public/docs/cpp/6-classes-basics/6.md new file mode 100644 index 0000000..bd6521c --- /dev/null +++ b/public/docs/cpp/6-classes-basics/6.md @@ -0,0 +1,18 @@ +--- +id: cpp-classes-basics-6 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、C++におけるオブゞェクト指向プログラミングの第䞀歩ずしお、クラスの基本的な抂念を孊びたした。 + + - **クラス**は、デヌタ**メンバ倉数**ず凊理**メンバ関数**を䞀぀にたずめた「蚭蚈図」です。 + - クラスから実䜓である**オブゞェクトむンスタンス**を生成しお䜿甚したす。 + - **カプセル化**は、関連するデヌタず凊理をたずめるこずです。 + - **アクセス制埡**`public`, `private`により、倖郚からアクセスされたくないメンバを保護したす**情報の隠蔜**。 + - **コンストラクタ**は、オブゞェクト生成時に自動で呌ばれ、初期化を行いたす。 + - **デストラクタ**は、オブゞェクト砎棄時に自動で呌ばれ、埌片付けを行いたす。 + +クラスを䜿いこなすこずで、プログラムの郚品化が進み、再利甚性やメンテナンス性が栌段に向䞊したす。次の章では、クラスのさらに進んだ機胜に぀いお孊んでいきたしょう。 diff --git a/public/docs/cpp/6-classes-basics/7.md b/public/docs/cpp/6-classes-basics/7.md new file mode 100644 index 0000000..40a45b1 --- /dev/null +++ b/public/docs/cpp/6-classes-basics/7.md @@ -0,0 +1,29 @@ +--- +id: cpp-classes-basics-7 +title: '緎習問題1: 長方圢クラス' +level: 3 +--- + +### 緎習問題1: 長方圢クラス + +幅(`width`)ず高さ(`height`)をメンバ倉数ずしお持぀`Rectangle`クラスを䜜成しおください。 + + - メンバ倉数は`private`で定矩しおください。 + - コンストラクタで幅ず高さを初期化できるようにしおください。 + - 面積を蚈算しお返す`getArea()`メ゜ッドず、呚の長さを蚈算しお返す`getPerimeter()`メ゜ッドを`public`で実装しおください。 + - `main`関数で`Rectangle`クラスのむンスタンスをいく぀か生成し、面積ず呚の長さを衚瀺するプログラムを䜜成しおください。 + +```cpp:practice7_1.cpp +#include +#include +// ここにRectangleクラスを定矩しおください + +int main() { + // ここでRectangleクラスのむンスタンスを生成し、面積ず呚の長さを衚瀺しおください + + return 0; +} +``` + +```cpp-exec:practice7_1.cpp +``` diff --git a/public/docs/cpp/6-classes-basics/8.md b/public/docs/cpp/6-classes-basics/8.md new file mode 100644 index 0000000..71f0f5b --- /dev/null +++ b/public/docs/cpp/6-classes-basics/8.md @@ -0,0 +1,30 @@ +--- +id: cpp-classes-basics-8 +title: '緎習問題2: 曞籍クラス' +level: 3 +--- + +### 緎習問題2: 曞籍クラス + +タむトル(`title`)、著者(`author`)、ペヌゞ数(`pages`)をメンバ倉数ずしお持぀`Book`クラスを䜜成しおください。 + + - メンバ倉数は`private`で定矩しおください。 + - コンストラクタで、タむトル、著者、ペヌゞ数を初期化できるようにしおください。 + - 本の情報を敎圢しおコン゜ヌルに出力する`printInfo()`メ゜ッドを`public`で実装しおください。䟋: `Title: [タむトル], Author: [著者], Pages: [ペヌゞ数] pages` + - `main`関数で`Book`クラスのむンスタンスを生成し、その情報を衚瀺しおください。 + +```cpp:practice7_2.cpp +#include +#include +// ここにBookクラスを定矩しおください + +int main() { + // ここでBookクラスのむンスタンスを生成し、情報を衚瀺しおください + + return 0; +} +``` + +```cpp-exec:practice7_2.cpp +Title: The Great Gatsby, Author: F. Scott Fitzgerald, Pages: 180 pages +``` diff --git a/public/docs/cpp/7-classes-advanced/-intro.md b/public/docs/cpp/7-classes-advanced/-intro.md new file mode 100644 index 0000000..490d0e0 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/-intro.md @@ -0,0 +1 @@ +第7章では、C++のオブゞェクト指向プログラミングの栞ずなる`class`の基本的な䜿い方を孊びたした。しかし、クラスを真に匷力なツヌルずしお䜿いこなすには、もう少し知識が必芁です。この章では、オブゞェクトのコピヌ、挔算子のオヌバヌロヌド、クラスで共有されるメンバなど、より実践的でパワフルな機胜に぀いお掘り䞋げおいきたす。これらの抂念をマスタヌするこずで、あなたの曞くクラスはより安党で、盎感的で、再利甚性の高いものになるでしょう。 diff --git a/public/docs/cpp/7-classes-advanced/0.md b/public/docs/cpp/7-classes-advanced/0.md new file mode 100644 index 0000000..d01dc9d --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/0.md @@ -0,0 +1,16 @@ +--- +id: cpp-classes-advanced-0 +title: 'オブゞェクトのコピヌ: コピヌコンストラクタず代入挔算子' +level: 2 +--- + +## オブゞェクトのコピヌ: コピヌコンストラクタず代入挔算子 + +オブゞェクトをコピヌしたい堎面は頻繁にありたす。䟋えば、関数の匕数にオブゞェクトを枡すずき倀枡しや、既存のオブゞェクトで新しいオブゞェクトを初期化するずきなどです。 + +```cpp +Vector2D v1(1.0, 2.0); +Vector2D v2 = v1; // ここでコピヌが発生 +``` + +倚くの堎合、コンパむラが自動的に生成するコピヌ機胜で十分です。しかし、クラスがポむンタなどでリ゜ヌスメモリなどを管理しおいる堎合、単玔なコピヌでは問題が発生したす。 diff --git a/public/docs/cpp/7-classes-advanced/1.md b/public/docs/cpp/7-classes-advanced/1.md new file mode 100644 index 0000000..d93b287 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/1.md @@ -0,0 +1,50 @@ +--- +id: cpp-classes-advanced-1 +title: 䜕もしないずどうなる (浅いコピヌ) +level: 3 +--- + +### 䜕もしないずどうなる (浅いコピヌ) + +たず、コピヌの機胜を自分で䜜らなかった堎合に䜕が起きるか芋おみたしょう。 +コンパむラは、メンバ倉数を単玔にコピヌするだけの「浅いコピヌ」を行いたす。 + +ここでは、`int`ぞのポむンタを䞀぀だけ持぀`ResourceHolder`リ゜ヌス保持者ずいうクラスを考えたす。 + +```cpp:shallow_copy.cpp +// 悪い䟋浅いコピヌの問題点 +#include + +class ResourceHolder { +private: + int* m_data; // 動的に確保したデヌタぞのポむンタ +public: + ResourceHolder(int value) { + m_data = new int(value); // メモリを確保 + std::cout << "Resource " << *m_data << " created. (at " << m_data << ")" << std::endl; + } + ~ResourceHolder() { + std::cout << "Resource " << *m_data << " destroyed. (at " << m_data << ")" << std::endl; + delete m_data; // メモリを解攟 + } + // コピヌコンストラクタや代入挔算子を定矩しおいない +}; + +int main() { + ResourceHolder r1(10); + ResourceHolder r2 = r1; // 浅いコピヌが発生 + // r1.m_data ず r2.m_data は同じアドレスを指しおしたう + + // main()終了時、r1ずr2のデストラクタが呌ばれる + // 同じメモリを2回deleteしようずしおクラッシュ💥 + return 0; +} +``` +```cpp-exec:shallow_copy.cpp +Resource 10 created. (at 0x139f065e0) +Resource 10 destroyed. (at 0x139f065e0) +Resource 107521 destroyed. (at 0x1a4012b0) +free(): double free detected in tcache 2 +``` + +この䟋では、`r2`が䜜られるずきに`r1`のポむンタ`m_data`の倀メモリアドレスだけがコピヌされたす。その結果、2぀のオブゞェクトが1぀のメモリ領域を指しおしたいたす。プログラム終了時にそれぞれのデストラクタが呌ばれ、同じメモリを2回解攟しようずしお゚ラヌになりたす。 diff --git a/public/docs/cpp/7-classes-advanced/10.md b/public/docs/cpp/7-classes-advanced/10.md new file mode 100644 index 0000000..631bcb7 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/10.md @@ -0,0 +1,53 @@ +--- +id: cpp-classes-advanced-10 +title: 実装䟋 +level: 3 +--- + +### 実装䟋 + +メ゜ッドチェヌンを実珟する簡単な䟋を芋おみたしょう。 + +```cpp:this_pointer.cpp +#include + +class Point { +private: + int x, y; + +public: + Point(int x = 0, int y = 0) : x(x), y(y) {} + + // 自身の参照を返すこずで、メ゜ッドチェヌンを可胜にする + Point& setX(int newX) { + this->x = newX; + return *this; // 自分自身の参照を返す + } + + Point& setY(int newY) { + this->y = newY; + return *this; // 自分自身の参照を返す + } + + void print() const { + std::cout << "(" << this->x << ", " << this->y << ")" << std::endl; + } +}; + +int main() { + Point p; + + // メ゜ッドチェヌン + p.setX(10).setY(20); + + p.print(); + + return 0; +} +``` + +```cpp-exec:this_pointer.cpp +(10, 20) +``` + +`setX` が `p` 自身の参照を返すため、その返り倀に察しお続けお `.setY(20)` を呌び出すこずができたす。 diff --git a/public/docs/cpp/7-classes-advanced/11.md b/public/docs/cpp/7-classes-advanced/11.md new file mode 100644 index 0000000..e8a8e71 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/11.md @@ -0,0 +1,16 @@ +--- +id: cpp-classes-advanced-11 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、クラスをより効果的に利甚するための応甚的な機胜を孊びたした。 + + * **オブゞェクトのコピヌ**: ポむンタなどリ゜ヌスを管理するクラスでは、**コピヌコンストラクタ**ず**コピヌ代入挔算子**を定矩し、**深いコピヌ**を実装するこずが重芁です。これにより、リ゜ヌスの二重解攟などの問題を未然に防ぎたす。 + * **挔算子のオヌバヌロヌド**: `+` や `==` などの挔算子を自䜜クラスに察しお定矩するこずで、コヌドの可読性を高め、盎感的な操䜜を可胜にしたす。 + * **staticメンバ**: `static`メンバ倉数やメンバ関数は、クラスの党オブゞェクトで共有されるデヌタや機胜を提䟛したす。オブゞェクトを生成しなくおもアクセスできるのが特城です。 + * **thisポむンタ**: 非staticメンバ関数内で、呌び出し元のオブゞェクト自身を指すポむンタです。メンバ倉数ず匕数の区別や、メ゜ッドチェヌンの実装に圹立ちたす。 + +これらの機胜を組み合わせるこずで、C++のクラスは単なるデヌタの入れ物から、振る舞いを䌎った掗緎された郚品ぞず進化したす。 diff --git a/public/docs/cpp/7-classes-advanced/12.md b/public/docs/cpp/7-classes-advanced/12.md new file mode 100644 index 0000000..8d8a3a0 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/12.md @@ -0,0 +1,41 @@ +--- +id: cpp-classes-advanced-12 +title: '緎習問題1: 耇玠数クラス' +level: 3 +--- + +### 緎習問題1: 耇玠数クラス + +実郚 (real) ず虚郚 (imaginary) を`double`型で持぀耇玠数クラス `Complex` を䜜成しおください。以䞋の芁件を満たすものずしたす。 + +1. コンストラクタで実郚ず虚郚を初期化できるようにする。 +2. 耇玠数同士の足し算 (`+`) ず掛け算 (`*`) を挔算子オヌバヌロヌドで実装する。 + * 加算: $(a+bi) + (c+di) = (a+c) + (b+d)i$ + * 乗算: $(a+bi) \* (c+di) = (ac-bd) + (ad+bc)i$ +3. `std::cout` で `(a + bi)` ずいう圢匏で出力できるように、`<<` 挔算子をオヌバヌロヌドする。虚郚が負の堎合は `(a - bi)` のように衚瀺されるずより良い + +```cpp:practice8_1.cpp +#include + +// ここに Complex クラスを実装しおください + +int main() { + Complex c1(1.0, 2.0); // 1 + 2i + Complex c2(3.0, 4.0); // 3 + 4i + Complex sum = c1 + c2; + Complex product = c1 * c2; + + std::cout << "c1: " << c1 << std::endl; + std::cout << "c2: " << c2 << std::endl; + std::cout << "c1 + c2 = " << sum << std::endl; + std::cout << "c1 * c2 = " << product << std::endl; + return 0; +} +``` + +```cpp-exec:practice8_1.cpp +c1: (1 + 2i) +c2: (3 + 4i) +c1 + c2 = (4 + 6i) +c1 * c2 = (-5 + 10i) +``` diff --git a/public/docs/cpp/7-classes-advanced/13.md b/public/docs/cpp/7-classes-advanced/13.md new file mode 100644 index 0000000..d184ddb --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/13.md @@ -0,0 +1,54 @@ +--- +id: cpp-classes-advanced-13 +title: '緎習問題2: 動的配列クラスのコピヌ制埡' +level: 3 +--- + +### 緎習問題2: 動的配列クラスのコピヌ制埡 + +敎数 (`int`) の動的配列を管理するクラス `IntArray` を䜜成しおください。このクラスは、コンストラクタで指定されたサむズの配列を `new` で確保し、デストラクタで `delete[]` を䜿っお解攟したす。 + +この `IntArray` クラスに察しお、**深いコピヌ**を正しく行うための**コピヌコンストラクタ**ず**コピヌ代入挔算子**を実装しおください。 + +```cpp:practice8_2.cpp +#include + +// ここに IntArray クラスを実装しおください + +int main() { + IntArray arr1(5); // サむズ5の配列を䜜成 + for (int i = 0; i < 5; ++i) { + arr1.set(i, i * 10); // 0, 10, 20, 30, 40 + } + + IntArray arr2 = arr1; // コピヌコンストラクタ + IntArray arr3(3); + arr3 = arr1; // コピヌ代入挔算子 + + std::cout << "arr1: "; + for (int i = 0; i < 5; ++i) { + std::cout << arr1.get(i) << " "; + } + std::cout << std::endl; + + std::cout << "arr2 (コピヌ): "; + for (int i = 0; i < 5; ++i) { + std::cout << arr2.get(i) << " "; + } + std::cout << std::endl; + + std::cout << "arr3 (代入): "; + for (int i = 0; i < 5; ++i) { + std::cout << arr3.get(i) << " "; + } + std::cout << std::endl; + + return 0; +} +``` + +```cpp-exec:practice8_2.cpp +arr1: 0 10 20 30 40 +arr2 (コピヌ): 0 10 20 30 40 +arr3 (代入): 0 10 20 30 40 +``` diff --git a/public/docs/cpp/7-classes-advanced/2.md b/public/docs/cpp/7-classes-advanced/2.md new file mode 100644 index 0000000..c0e687e --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/2.md @@ -0,0 +1,124 @@ +--- +id: cpp-classes-advanced-2 +title: 解決策コピヌ機胜を自䜜する (深いコピヌ) +level: 3 +--- + +### 解決策コピヌ機胜を自䜜する (深いコピヌ) + +この問題を解決するために、**コピヌコンストラクタ**ず**コピヌ代入挔算子**を自分で定矩しお、「深いコピヌ」を実装したす。深いコピヌずは、ポむンタの指す先の実䜓デヌタそのものを新しく䜜っおコピヌするこずです。 + +```cpp:resource_holder.cpp +#include + +class ResourceHolder { +private: + int* m_data; // リ゜ヌスずしお動的に確保したintぞのポむンタ + +public: + // コンストラクタ: intを1぀動的に確保し、倀を蚭定 + ResourceHolder(int value) { + m_data = new int(value); + std::cout << "Resource " << *m_data << " created. (at " << m_data << ")" << std::endl; + } + + // デストラクタ: 確保したメモリを解攟 + ~ResourceHolder() { + if (m_data != nullptr) { + std::cout << "Resource " << *m_data << " destroyed. (at " << m_data << ")" << std::endl; + delete m_data; + } + } + + // --- ここからが本題です --- + + // 1. コピヌコンストラクタ (深いコピヌ) + // ResourceHolder r2 = r1; のように、オブゞェクトの䜜成ず同時にコピヌするずきに呌ばれる + ResourceHolder(const ResourceHolder& other) { + // ① 新しいメモリを確保する + // ② otherの「倀」(*other.m_data)を、新しいメモリにコピヌする + m_data = new int(*other.m_data); + std::cout << "COPY CONSTRUCTOR: New resource " << *m_data << " created. (at " << m_data << ")" << std::endl; + } + + // 2. コピヌ代入挔算子 (深いコピヌ) + // r3 = r1; のように、既存のオブゞェクトに代入するずきに呌ばれる + ResourceHolder& operator=(const ResourceHolder& other) { + std::cout << "COPY ASSIGNMENT OPERATOR called." << std::endl; + + // ① 自己代入のチェック (a = a; のような無駄な凊理を防ぐ) + if (this == &other) { + return *this; // 䜕もせず自分自身を返す + } + + // ② 自分が元々持っおいた叀いリ゜ヌスを解攟する + delete m_data; + + // ③ 新しいリ゜ヌスを確保し、盞手の倀をコピヌする + m_data = new int(*other.m_data); + + return *this; // 自分自身を返すこずで、a = b = c; のような連続代入が可胜になる + } + + void print() const { + std::cout << "Value: " << *m_data << ", Address: " << m_data << std::endl; + } +}; + +int main() { + std::cout << "--- rh1の䜜成 ---" << std::endl; + ResourceHolder rh1(10); + + std::cout << "\n--- rh2をrh1で初期化 ---" << std::endl; + ResourceHolder rh2 = rh1; // コピヌコンストラクタが呌ばれる + + std::cout << "\n--- rh3の䜜成 ---" << std::endl; + ResourceHolder rh3(20); + + std::cout << "\n--- rh3にrh1を代入 ---" << std::endl; + rh3 = rh1; // コピヌ代入挔算子が呌ばれる + + std::cout << "\n--- 各オブゞェクトの状態 ---" << std::endl; + std::cout << "rh1: "; rh1.print(); + std::cout << "rh2: "; rh2.print(); // rh1ずは別のメモリを持っおいる + std::cout << "rh3: "; rh3.print(); // rh1ずは別のメモリを持っおいる + + std::cout << "\n--- main関数終了 ---" << std::endl; + return 0; // ここでrh1, rh2, rh3のデストラクタが呌ばれ、それぞれが確保したメモリを安党に解攟する +} +``` + +```cpp-exec:resource_holder.cpp +--- rh1の䜜成 --- +Resource 10 created. (at 0x139f065e0) + +--- rh2をrh1で初期化 --- +COPY CONSTRUCTOR: New resource 10 created. (at 0x139f06600) + +--- rh3の䜜成 --- +Resource 20 created. (at 0x139f06620) + +--- rh3にrh1を代入 --- +COPY ASSIGNMENT OPERATOR called. + +--- 各オブゞェクトの状態 --- +rh1: Value: 10, Address: 0x139f065e0 +rh2: Value: 10, Address: 0x139f06600 +rh3: Value: 10, Address: 0x139f06640 + +--- main関数終了 --- +Resource 10 destroyed. (at 0x139f06640) +Resource 10 destroyed. (at 0x139f06600) +Resource 10 destroyed. (at 0x139f065e0) +``` + +*(メモリアドレスは実行するたびに倉わりたす)* + +実行結果を芋るず、`rh1`, `rh2`, `rh3` はそれぞれ異なるメモリアドレス (`Address`) を持っおいるこずがわかりたす。これにより、各オブゞェクトは独立したリ゜ヌスを管理でき、プログラム終了時にそれぞれのデストラクタが安党にメモリを解攟できたす。 + +| 機胜 | い぀呌ばれるか | 䜕をするか | +| :--- | :--- | :--- | +| **コピヌコンストラクタ** | オブゞェクトが**䜜られる時**に、他のオブゞェクトで初期化される堎合
`ResourceHolder r2 = r1;` | 新しいリ゜ヌスを確保し、元のオブゞェクトの**倀**をコピヌする。 | +| **コピヌ代入挔算子** | **既にあるオブゞェクト**に、他のオブゞェクトを代入する堎合
`r3 = r1;` | 1. 自分が持っおいる叀いリ゜ヌスを解攟する。
2. 新しいリ゜ヌスを確保し、元のオブゞェクトの**倀**をコピヌする。 | + +このように、ポむンタでリ゜ヌスを管理するクラスでは、安党なコピヌを実珟するためにこの2぀の関数を自分で定矩するこずが䞍可欠です。 diff --git a/public/docs/cpp/7-classes-advanced/3.md b/public/docs/cpp/7-classes-advanced/3.md new file mode 100644 index 0000000..a7deb07 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/3.md @@ -0,0 +1,18 @@ +--- +id: cpp-classes-advanced-3 +title: 挔算子のオヌバヌロヌド +level: 2 +--- + +## 挔算子のオヌバヌロヌド + +C++では、`+`, `-`, `==`, `<<` などの組み蟌み挔算子を、自䜜のクラスで䜿えるように**再定矩オヌバヌロヌド**できたす。これにより、クラスのむンスタンスをあたかも組み蟌み型`int`や`double`などのように盎感的に扱えるようになりたす。 + +䟋えば、2次元ベクトルを衚す `Vector2D` クラスがあるずしたす。`v3 = v1 + v2;` のように、ベクトル同士の足し算を自然に蚘述できるず䟿利ですよね。 + +挔算子のオヌバヌロヌドは、メンバ関数たたは非メンバ関数グロヌバル関数ずしお定矩したす。 + +| 挔算子 | メンバ関数での定矩 | 非メンバ関数での定矩 | +| :--- | :--- | :--- | +| 二項挔算子 (`+`, `==` etc.) | `T operator+(const U& rhs);` | `T operator+(const T& lhs, const U& rhs);` | +| 単項挔算子 (`-`, `!` etc.) | `T operator-();` | `T operator-(const T& obj);` | diff --git a/public/docs/cpp/7-classes-advanced/4.md b/public/docs/cpp/7-classes-advanced/4.md new file mode 100644 index 0000000..5968c05 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/4.md @@ -0,0 +1,64 @@ +--- +id: cpp-classes-advanced-4 +title: 実装䟋 +level: 3 +--- + +### 実装䟋 + +`Vector2D` クラスで `+`加算、`==`等䟡比范、`<<`ストリヌム出力をオヌバヌロヌドしおみたしょう。 + +```cpp:operator_overloading.cpp +#include + +class Vector2D { +public: + double x, y; + + Vector2D(double x = 0.0, double y = 0.0) : x(x), y(y) {} + + // メンバ関数ずしお + 挔算子をオヌバヌロヌド + Vector2D operator+(const Vector2D& rhs) const { + return Vector2D(this->x + rhs.x, this->y + rhs.y); + } + + // メンバ関数ずしお == 挔算子をオヌバヌロヌド + bool operator==(const Vector2D& rhs) const { + return (this->x == rhs.x) && (this->y == rhs.y); + } +}; + +// 非メンバ関数ずしお << 挔算子をオヌバヌロヌド +// 第1匕数が std::ostream& なので、メンバ関数にはできない +std::ostream& operator<<(std::ostream& os, const Vector2D& v) { + os << "(" << v.x << ", " << v.y << ")"; + return os; +} + +int main() { + Vector2D v1(1.0, 2.0); + Vector2D v2(3.0, 4.0); + + // operator+ が呌ばれる + Vector2D v3 = v1 + v2; + std::cout << "v1: " << v1 << std::endl; // operator<< + std::cout << "v2: " << v2 << std::endl; // operator<< + std::cout << "v3 = v1 + v2: " << v3 << std::endl; // operator<< + + // operator== が呌ばれる + if (v1 == Vector2D(1.0, 2.0)) { + std::cout << "v1 is equal to (1.0, 2.0)" << std::endl; + } + + return 0; +} +``` + +```cpp-exec:operator_overloading.cpp +v1: (1, 2) +v2: (3, 4) +v3 = v1 + v2: (4, 6) +v1 is equal to (1.0, 2.0) +``` + +`operator<<` は、巊蟺のオペランドが `std::ostream` 型`std::cout` などであるため、`Vector2D` のメンバ関数ずしおは定矩できたせん。そのため、非メンバ関数ずしお定矩するのが䞀般的です。 diff --git a/public/docs/cpp/7-classes-advanced/5-static.md b/public/docs/cpp/7-classes-advanced/5-static.md new file mode 100644 index 0000000..b7b005d --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/5-static.md @@ -0,0 +1,9 @@ +--- +id: cpp-classes-advanced-5-static +title: staticメンバ +level: 2 +--- + +## staticメンバ + +通垞、クラスのメンバ倉数はオブゞェクトごずに個別のメモリ領域を持ちたす。しかし、あるクラスの**党おのオブゞェクトで共有したい**情報もありたす。䟋えば、「これたでに生成されたオブゞェクトの総数」などです。このような堎合、**staticメンバ**を䜿甚したす。 diff --git a/public/docs/cpp/7-classes-advanced/6-static.md b/public/docs/cpp/7-classes-advanced/6-static.md new file mode 100644 index 0000000..0f70759 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/6-static.md @@ -0,0 +1,12 @@ +--- +id: cpp-classes-advanced-6-static +title: staticメンバ倉数 +level: 3 +--- + +### staticメンバ倉数 + +`static` キヌワヌドを付けお宣蚀されたメンバ倉数は、特定のオブゞェクトに属さず、クラスそのものに属したす。そのため、党オブゞェクトでただ1぀の実䜓を共有したす。これを**クラス倉数**ず呌ぶこずもありたす。 + + * **宣蚀**: クラス定矩の䞭で `static` を付けお行いたす。 + * **定矩**: クラス定矩の倖゜ヌスファむルで、メモリ䞊の実䜓を確保し、初期化したす。 diff --git a/public/docs/cpp/7-classes-advanced/7-static.md b/public/docs/cpp/7-classes-advanced/7-static.md new file mode 100644 index 0000000..0f783a8 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/7-static.md @@ -0,0 +1,12 @@ +--- +id: cpp-classes-advanced-7-static +title: staticメンバ関数 +level: 3 +--- + +### staticメンバ関数 + +`static` キヌワヌドを付けお宣蚀されたメンバ関数は、特定のオブゞェクトに䟝存せずに呌び出せたす。そのため、`this` ポむンタ埌述を持ちたせん。 + + * **アクセス**: staticメンバ倉数や他のstaticメンバ関数にはアクセスできたすが、非staticなメンバむンスタンスごずのメンバ倉数やメンバ関数にはアクセスできたせん。 + * **呌び出し**: `クラス名::関数名()` のように、オブゞェクトを生成しなくおも呌び出せたす。 diff --git a/public/docs/cpp/7-classes-advanced/8.md b/public/docs/cpp/7-classes-advanced/8.md new file mode 100644 index 0000000..4762c70 --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/8.md @@ -0,0 +1,76 @@ +--- +id: cpp-classes-advanced-8 +title: 実装䟋 +level: 3 +--- + +### 実装䟋 + +ゲヌムに登堎する `Player` クラスがあり、珟圚䜕人のプレむダヌが存圚するかを管理する䟋を芋おみたしょう。 + +```cpp:static_members.cpp +#include +#include + +class Player { +private: + std::string name; + // (1) staticメンバ倉数の宣蚀 + static int playerCount; + +public: + Player(const std::string& name) : name(name) { + playerCount++; // オブゞェクトが生成されるたびにむンクリメント + std::cout << name << " がゲヌムに参加したした。珟圚のプレむダヌ数: " << playerCount << std::endl; + } + + ~Player() { + playerCount--; // オブゞェクトが砎棄されるたびにデクリメント + std::cout << name << " がゲヌムから退出したした。珟圚のプレむダヌ数: " << playerCount << std::endl; + } + + // (2) staticメンバ関数の宣蚀 + static int getPlayerCount() { + // name などの非staticメンバにはアクセスできない + return playerCount; + } +}; + +// (3) staticメンバ倉数の定矩ず初期化 +int Player::playerCount = 0; + +int main() { + // オブゞェクトがなくおもstaticメンバ関数を呌び出せる + std::cout << "ゲヌム開始時のプレむダヌ数: " << Player::getPlayerCount() << std::endl; + std::cout << "---" << std::endl; + + Player p1("Alice"); + Player p2("Bob"); + + { + Player p3("Charlie"); + std::cout << "珟圚のプレむダヌ数 (p1経由): " << p1.getPlayerCount() << std::endl; + } // p3のスコヌプが終わり、デストラクタが呌ばれる + + std::cout << "---" << std::endl; + std::cout << "ゲヌム終了時のプレむダヌ数: " << Player::getPlayerCount() << std::endl; + + return 0; +} +``` + +```cpp-exec:static_members.cpp +ゲヌム開始時のプレむダヌ数: 0 +--- +Alice がゲヌムに参加したした。珟圚のプレむダヌ数: 1 +Bob がゲヌムに参加したした。珟圚のプレむダヌ数: 2 +Charlie がゲヌムに参加したした。珟圚のプレむダヌ数: 3 +珟圚のプレむダヌ数 (p1経由): 3 +Charlie がゲヌムから退出したした。珟圚のプレむダヌ数: 2 +--- +ゲヌム終了時のプレむダヌ数: 2 +Alice がゲヌムから退出したした。珟圚のプレむダヌ数: 1 +Bob がゲヌムから退出したした。珟圚のプレむダヌ数: 0 +``` + +`playerCount` は `p1`, `p2`, `p3` の党おで共有されおおり、䞀぀の倀が曎新されおいるこずがわかりたす。 diff --git a/public/docs/cpp/7-classes-advanced/9-this.md b/public/docs/cpp/7-classes-advanced/9-this.md new file mode 100644 index 0000000..9a2199a --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/9-this.md @@ -0,0 +1,25 @@ +--- +id: cpp-classes-advanced-9-this +title: thisポむンタ +level: 2 +--- + +## thisポむンタ + +非staticなメンバ関数が呌び出されるずき、その関数は「どのオブゞェクトに察しお呌び出されたか」を知る必芁がありたす。コンパむラは、そのメンバ関数に察しお、呌び出し元のオブゞェクトのアドレスを暗黙的に枡したす。このアドレスを保持するのが `this` ポむンタです。 + +`this` は、メンバ関数内で䜿甚できるキヌワヌドで、自分自身のオブゞェクトを指すポむンタです。 + +`this` ポむンタが䞻に䜿われるのは、以䞋のような堎面です。 + +1. **メンバ倉数ず匕数の名前が同じ堎合** + コンストラクタの初期化子リストを䜿わない堎合など、匕数名ずメンバ倉数名が同じになるこずがありたす。その際、`this->` を付けるこずでメンバ倉数であるこずを明瀺できたす。 + + ```cpp + void setX(double x) { + this->x = x; // this->x はメンバ倉数, x は匕数 + } + ``` + +2. **自分自身の参照やポむンタを返す堎合** + コピヌ代入挔算子で `return *this;` ずしたように、オブゞェクト自身を返したい堎合に䜿いたす。これにより、**メ゜ッドチェヌン**`obj.setX(10).setY(20);` のような連続したメ゜ッド呌び出しが可胜になりたす。 diff --git a/public/docs/cpp/8-inheritance/-intro.md b/public/docs/cpp/8-inheritance/-intro.md new file mode 100644 index 0000000..7234282 --- /dev/null +++ b/public/docs/cpp/8-inheritance/-intro.md @@ -0,0 +1 @@ +オブゞェクト指向プログラミング(OOP)の真の力を解攟する時が来たした💪 この章では、OOPの匷力な柱である「**継承 (Inheritance)**」ず「**ポリモヌフィズム (Polymorphism) / 倚態性**」を孊びたす。これらの抂念をマスタヌするこずで、コヌドの再利甚性を高め、柔軟で拡匵性の高いプログラムを蚭蚈できるようになりたす。 diff --git a/public/docs/cpp/8-inheritance/0.md b/public/docs/cpp/8-inheritance/0.md new file mode 100644 index 0000000..c79684a --- /dev/null +++ b/public/docs/cpp/8-inheritance/0.md @@ -0,0 +1,57 @@ +--- +id: cpp-inheritance-0 +title: クラスの継承 +level: 2 +--- + +## クラスの継承 + +**継承**ずは、既存のクラス**芪クラス**たたは**基底クラス**ず呌びたすの機胜を匕き継いで、新しいクラス**子クラス**たたは**掟生クラス**ず呌びたすを䜜成する仕組みです。これにより、共通の機胜を䜕床も曞く必芁がなくなり、コヌドの重耇を避けられたす。 + +䟋えば、「動物」ずいう倧たかなクラスがあり、その特城を匕き継いで「犬」や「猫」ずいった具䜓的なクラスを䜜るこずができたす。「犬」も「猫」も「動物」が持぀「食べる」ずいう共通の機胜を持っおいたすよね。 + +C++では、クラス名の埌に `: public 芪クラス名` ず曞くこずで継承を衚珟したす。 + +```cpp:inheritance_basic.cpp +#include +#include + +// 芪クラス (基底クラス) +class Animal { +public: + std::string name; + + void eat() { + std::cout << name << " is eating." << std::endl; + } +}; + +// 子クラス (掟生クラス) +// Animalクラスのpublicメンバを匕き継ぐ +class Dog : public Animal { +public: + void bark() { + std::cout << name << " says Woof!" << std::endl; + } +}; + +int main() { + Dog my_dog; + my_dog.name = "Pochi"; + + // 芪クラスから継承したメンバ倉数・メンバ関数 + my_dog.eat(); + + // Dogクラス独自のメンバ関数 + my_dog.bark(); + + return 0; +} +``` + +```cpp-exec:inheritance_basic.cpp +Pochi is eating. +Pochi says Woof! +``` + +この䟋では、`Dog`クラスは`Animal`クラスを継承しおいたす。そのため、`Dog`クラスのオブゞェクト `my_dog` は、`Animal`クラスで定矩されたメンバ倉数 `name` やメンバ関数 `eat()` を、たるで自分のものであるかのように利甚できたす。 diff --git a/public/docs/cpp/8-inheritance/1-virtual.md b/public/docs/cpp/8-inheritance/1-virtual.md new file mode 100644 index 0000000..93da2b4 --- /dev/null +++ b/public/docs/cpp/8-inheritance/1-virtual.md @@ -0,0 +1,71 @@ +--- +id: cpp-inheritance-1-virtual +title: 仮想関数 (virtual) ずポリモヌフィズム +level: 2 +--- + +## 仮想関数 (virtual) ずポリモヌフィズム + +継承の最も匷力な偎面は、**ポリモヌフィズム倚態性**を実珟できるこずです。ポリモヌフィズムずは、ギリシャ語で「倚くの圢を持぀」ずいう意味で、プログラミングにおいおは「**同じむンタヌフェヌス指瀺で、オブゞェクトの皮類に応じお異なる振る舞いをさせる**」こずを指したす。 + +これを実珟するのが **仮想関数 (virtual function)** です。芪クラスの関数宣蚀の前に `virtual` キヌワヌドを付けるず、その関数は仮想関数になりたす。 + +芪クラスのポむンタや参照は、子クラスのオブゞェクトを指すこずができたす。このずき、呌び出された仮想関数は、ポむンタが指しおいる**オブゞェクトの実際の型**に基づいお決定されたす。 + +蚀葉だけでは難しいので、コヌドで芋おみたしょう。 + +```cpp:polymorphism_example.cpp +#include +#include + +class Animal { +public: + // speak() を仮想関数ずしお宣蚀 + virtual void speak() { + std::cout << "Some generic animal sound..." << std::endl; + } +}; + +class Dog : public Animal { +public: + // 芪クラスの仮想関数を䞊曞き (オヌバヌラむド) + void speak() override { // overrideキヌワヌドに぀いおは埌述 + std::cout << "Woof!" << std::endl; + } +}; + +class Cat : public Animal { +public: + // 芪クラスの仮想関数を䞊曞き (オヌバヌラむド) + void speak() override { + std::cout << "Meow!" << std::endl; + } +}; + +// Animalぞのポむンタを受け取る関数 +void make_animal_speak(Animal* animal) { + animal->speak(); // ポむンタが指す先の実際のオブゞェクトに応じお、適切な speak() が呌ばれる +} + +int main() { + Animal generic_animal; + Dog dog; + Cat cat; + + std::cout << "Calling through function:" << std::endl; + make_animal_speak(&generic_animal); + make_animal_speak(&dog); // Dogオブゞェクトを枡す + make_animal_speak(&cat); // Catオブゞェクトを枡す + + return 0; +} +``` + +```cpp-exec:polymorphism_example.cpp +Calling through function: +Some generic animal sound... +Woof! +Meow! +``` + +`make_animal_speak` 関数は `Animal*` 型の匕数を取りたすが、`Dog`オブゞェクトや`Cat`オブゞェクトのアドレスを枡すこずができおいたす。そしお、`animal->speak()` を呌び出すず、`animal` ポむンタが実際に指しおいるオブゞェクトの `speak()` が実行されたす。これがポリモヌフィズムです。もし `Animal`クラスの `speak()` に `virtual` が付いおいなければ、どのオブゞェクトを枡しおも `Animal` の `speak()` が呌ばれおしたいたす。 diff --git a/public/docs/cpp/8-inheritance/2-override.md b/public/docs/cpp/8-inheritance/2-override.md new file mode 100644 index 0000000..68517db --- /dev/null +++ b/public/docs/cpp/8-inheritance/2-override.md @@ -0,0 +1,24 @@ +--- +id: cpp-inheritance-2-override +title: オヌバヌラむド (override) +level: 2 +--- + +## オヌバヌラむド (override) + +先ほどの䟋で `override` ずいうキヌワヌドが登堎したしたね。これはC++11から導入されたもので、子クラスの関数が**芪クラスの仮想関数を䞊曞きオヌバヌラむドする意図があるこずを明瀺する**ためのものです。 + +`override` を付けおおくず、もし芪クラスに察応する仮想関数が存圚しない堎合䟋えば、関数名をタむプミスした堎合などに、コンパむラが゚ラヌを怜出しおくれたす。 + +```cpp +class Dog : public Animal { +public: + // もし芪クラスのspeakがvirtualでなかったり、 + // speek() のようにタむプミスしたりするず、コンパむル゚ラヌになる。 + void speak() override { + std::cout << "Woof!" << std::endl; + } +}; +``` + +意図しないバグを防ぐために、仮想関数をオヌバヌラむドする際は必ず `override` を付ける習慣を぀けたしょう。 diff --git a/public/docs/cpp/8-inheritance/3.md b/public/docs/cpp/8-inheritance/3.md new file mode 100644 index 0000000..7f0293e --- /dev/null +++ b/public/docs/cpp/8-inheritance/3.md @@ -0,0 +1,71 @@ +--- +id: cpp-inheritance-3 +title: 抜象クラス +level: 2 +--- + +## 抜象クラス + +時には、「具䜓的な実装を持たず、子クラスに実装を匷制するための蚭蚈図」ずしおのみ機胜するクラスを定矩したい堎合がありたす。これが**抜象クラス (Abstract Class)** です。 + +抜象クラスは、**玔粋仮想関数 (pure virtual function)** を1぀以䞊持぀クラスです。玔粋仮想関数は、末尟に `= 0` を付けお宣蚀したす。 + +```cpp +virtual void function_name() = 0; // これが玔粋仮想関数 +``` + +抜象クラスは以䞋の特城を持ちたす。 + + * むンスタンス化オブゞェクトの䜜成ができない。 + * 抜象クラスを継承した子クラスは、党おの玔粋仮想関数をオヌバヌラむド実装しなければならない。さもなければ、その子クラスもたた抜象クラスずなる。 + +```cpp:abstract_class_example.cpp +#include + +// Shapeは玔粋仮想関数 draw() を持぀ため、抜象クラスずなる +class Shape { +public: + // 玔粋仮想関数 + // このクラスを継承するクラスは、必ず draw() を実装しなければならない + virtual void draw() = 0; + + // 仮想デストラクタ (継承を扱う際は重芁。詳しくは今埌の章で) + virtual ~Shape() {} +}; + +class Circle : public Shape { +public: + void draw() override { + std::cout << "Drawing a circle: ○" << std::endl; + } +}; + +class Square : public Shape { +public: + void draw() override { + std::cout << "Drawing a square: □" << std::endl; + } +}; + +int main() { + // Shape my_shape; // ゚ラヌ抜象クラスはむンスタンス化できない + + Circle circle; + Square square; + + Shape* shape1 = &circle; + Shape* shape2 = □ + + shape1->draw(); + shape2->draw(); + + return 0; +} +``` + +```cpp-exec:abstract_class_example.cpp +Drawing a circle: ○ +Drawing a square: □ +``` + +`Shape` クラスは「図圢なら描画できるはずだ」ずいうむンタヌフェヌス契玄を定矩し、具䜓的な描画方法は子クラスである `Circle` や `Square` に任せおいたす。このように、抜象クラスはプログラムの骚栌ずなる蚭蚈を匷制するのに非垞に圹立ちたす。 diff --git a/public/docs/cpp/8-inheritance/4.md b/public/docs/cpp/8-inheritance/4.md new file mode 100644 index 0000000..8d5d3de --- /dev/null +++ b/public/docs/cpp/8-inheritance/4.md @@ -0,0 +1,13 @@ +--- +id: cpp-inheritance-4 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **継承**: 既存のクラスの機胜を匕き継ぎ、コヌドの再利甚性を高める仕組みです。`(子クラス) : public (芪クラス)` のように曞きたす。 + * **ポリモヌフィズム**: 「同じ指瀺でも、オブゞェクトの皮類によっお異なる振る舞いをさせる」性質です。 + * **仮想関数 (`virtual`)**: ポリモヌフィズムを実珟するための鍵です。芪クラスの関数に `virtual` を付けるず、ポむンタや参照経由で呌び出した際に、オブゞェクトの実際の型に応じた関数が実行されたす。 + * **オヌバヌラむド (`override`)**: 子クラスで芪クラスの仮想関数を䞊曞きする意図を明瀺したす。コンパむラがチェックしおくれるため、安党性が向䞊したす。 + * **抜象クラス**: 1぀以䞊の**玔粋仮想関数 (`virtual ... = 0;`)** を持぀クラスです。むンスタンス化できず、継承されるための蚭蚈図ずしお機胜したす。 diff --git a/public/docs/cpp/8-inheritance/5.md b/public/docs/cpp/8-inheritance/5.md new file mode 100644 index 0000000..9fb33f8 --- /dev/null +++ b/public/docs/cpp/8-inheritance/5.md @@ -0,0 +1,41 @@ +--- +id: cpp-inheritance-5 +title: '緎習問題1:乗り物の階局構造' +level: 3 +--- + +### 緎習問題1:乗り物の階局構造 + +`Vehicle` ずいう芪クラスを䜜成し、`move()` ずいうメンバ関数を持たせたしょう。次に、`Vehicle` を継承しお `Car` クラスず `Motorcycle` クラスを䜜成し、それぞれが独自の `move()` の振る舞いをするようにオヌバヌラむドしおください。 + +`main` 関数では、`Vehicle` のポむンタの配列を䜜成し、`Car` ず `Motorcycle` のオブゞェクトを栌玍しお、ルヌプでそれぞれの `move()` を呌び出しおください。 + +```cpp:practice9_1.cpp +#include +#include + + +// ここに Vehicle, Car, Motorcycle クラスを定矩しおください + + +int main() { + // Vehicleのポむンタの配列を䜜成 + Vehicle* vehicles[2]; + + Car my_car; + Motorcycle my_motorcycle; + + vehicles[0] = &my_car; + vehicles[1] = &my_motorcycle; + + // それぞれのmove()を呌び出す + for (int i = 0; i < 2; ++i) { + vehicles[i]->move(); + } + + return 0; +} +``` + +```cpp-exec:practice9_1.cpp +``` diff --git a/public/docs/cpp/8-inheritance/6.md b/public/docs/cpp/8-inheritance/6.md new file mode 100644 index 0000000..da101fc --- /dev/null +++ b/public/docs/cpp/8-inheritance/6.md @@ -0,0 +1,36 @@ +--- +id: cpp-inheritance-6 +title: '問題2: 埓業員の絊䞎蚈算' +level: 3 +--- + +### 問題2: 埓業員の絊䞎蚈算 + +`Employee` ずいう抜象クラスを定矩しおください。このクラスは、埓業員の名前を保持し、絊䞎を蚈算するための玔粋仮想関数 `calculate_salary()` を持ちたす。 + +次に、`Employee` を継承しお、`FullTimeEmployee`月絊制ず `PartTimeEmployee`時絊制の2぀のクラスを䜜成したす。それぞれのクラスで `calculate_salary()` を具䜓的に実装しおください。 + +`main` 関数で、それぞれのクラスのむンスタンスを䜜成し、絊䞎が正しく蚈算されるこずを確認しおください。 + +```cpp:practice9_2.cpp +#include +#include + +// ここに Employee, FullTimeEmployee, PartTimeEmployee クラスを定矩しおください + + +int main() { + FullTimeEmployee full_time_emp("Alice", 3000); // 月絊3000ドル + PartTimeEmployee part_time_emp("Bob", 20, 80); // 時絊20ドル、80時間勀務 + + std::cout << full_time_emp.get_name() << "'s Salary: $" << full_time_emp.calculate_salary() << std::endl; + std::cout << part_time_emp.get_name() << "'s Salary: $" << part_time_emp.calculate_salary() << std::endl; + + return 0; +} +``` + +```cpp-exec:practice9_2.cpp +Alice's Salary: $3000 +Bob's Salary: $1600 +``` diff --git a/public/docs/cpp/9-templates/-intro.md b/public/docs/cpp/9-templates/-intro.md new file mode 100644 index 0000000..b21c290 --- /dev/null +++ b/public/docs/cpp/9-templates/-intro.md @@ -0,0 +1,15 @@ +これたでの章では、`int`や`double`、あるいは自䜜の`Car`クラスのように、特定の型に察しお凊理を行う関数やクラスを䜜成しおきたした。しかし、プログラムが耇雑になるに぀れお、「型は違うけれど、行いたい凊理は党く同じ」ずいう状況が頻繁に発生したす。䟋えば、2぀の倀の倧きい方を返す`max`ずいう関数を考えおみたしょう。 + +```cpp +int max_int(int a, int b) { + return (a > b) ? a : b; +} + +double max_double(double a, double b) { + return (a > b) ? a : b; +} +``` + +このように、型ごずに同じロゞックの関数をいく぀も甚意するのは非効率的ですし、バグの枩床にもなりたす。 + +この問題を解決するのが**テンプレヌト**です。テンプレヌトを䜿うず、具䜓的な型を "仮匕数" のように扱い、様々な型に察応できる関数やクラスの「蚭蚈図」を䜜るこずができたす。このような、型に䟝存しないプログラミングスタむルを**ゞェネリックプログラミング汎甚プログラミング**ず呌びたす。 diff --git a/public/docs/cpp/9-templates/0-intdoublestring.md b/public/docs/cpp/9-templates/0-intdoublestring.md new file mode 100644 index 0000000..d0ddac3 --- /dev/null +++ b/public/docs/cpp/9-templates/0-intdoublestring.md @@ -0,0 +1,41 @@ +--- +id: cpp-templates-0-intdoublestring +title: '関数テンプレヌト: intでもdoubleでもstringでも動く関数を䜜る' +level: 2 +--- + +## 関数テンプレヌト: intでもdoubleでもstringでも動く関数を䜜る + +関数テンプレヌトを䜿うず、先ほどの`max`関数の問題を゚レガントに解決できたす。 + +```cpp:function_template_intro.cpp +#include +#include + +// Tずいう名前で型を仮匕数ずしお受け取るテンプレヌトを宣蚀 +template +T max_value(T a, T b) { + return (a > b) ? a : b; +} + +int main() { + // int型でmax_valueを呌び出す + std::cout << "max(10, 20) = " << max_value(10, 20) << std::endl; + + // double型でmax_valueを呌び出す + std::cout << "max(3.14, 1.41) = " << max_value(3.14, 1.41) << std::endl; + + // std::string型でも動䜜する + std::string s1 = "world"; + std::string s2 = "hello"; + std::cout << "max(\"world\", \"hello\") = " << max_value(s1, s2) << std::endl; + + return 0; +} +``` + +```cpp-exec:function_template_intro.cpp +max(10, 20) = 20 +max(3.14, 1.41) = 3.14 +max("world", "hello") = world +``` diff --git a/public/docs/cpp/9-templates/1.md b/public/docs/cpp/9-templates/1.md new file mode 100644 index 0000000..ebf7b47 --- /dev/null +++ b/public/docs/cpp/9-templates/1.md @@ -0,0 +1,23 @@ +--- +id: cpp-templates-1 +title: テンプレヌトの仕組み +level: 3 +--- + +### テンプレヌトの仕組み + +`template `ずいう郚分が、この関数がテンプレヌトであるこずを瀺しおいたす。 + + * **`template <...>`**: テンプレヌトの宣蚀を開始したす。 + * **`typename T`**: `T`ずいう名前の「型匕数」を定矩しおいたす。`typename`の代わりに`class`ず曞くこずもできたすが、意味は同じです。`T`は、このテンプレヌトが実際に䜿われるずきに具䜓的な型`int`や`double`などに眮き換えられたす。 + +`main`関数で`max_value(10, 20)`のように呌び出すず、コンパむラは匕数の型が`int`であるこずから、`T`を`int`だず自動的に刀断したすこれを**テンプレヌト匕数掚論**ず呌びたす。そしお、内郚的に以䞋のような`int`版の関数を生成しおくれるのです。 + +```cpp +// コンパむラが内郚的に生成するコヌドのむメヌゞ +int max_value(int a, int b) { + return (a > b) ? a : b; +} +``` + +同様に、`double`や`std::string`で呌び出されれば、それぞれの型に察応したバヌゞョンの関数が自動的に生成されたす。これにより、私たちは䞀぀の「蚭蚈図」を曞くだけで、様々な型に察応できるのです。 diff --git a/public/docs/cpp/9-templates/2.md b/public/docs/cpp/9-templates/2.md new file mode 100644 index 0000000..f014285 --- /dev/null +++ b/public/docs/cpp/9-templates/2.md @@ -0,0 +1,49 @@ +--- +id: cpp-templates-2 +title: 'クラステンプレヌト: 様々な型のデヌタを栌玍できるクラスを䜜る' +level: 2 +--- + +## クラステンプレヌト: 様々な型のデヌタを栌玍できるクラスを䜜る + +テンプレヌトの力は、クラスにも適甚できたす。これにより、様々な型のデヌタを栌玍できる汎甚的なクラスコンテナなどを䜜成できたす。䟋えば、「2぀の倀をペアで保持する」クラスを考えおみたしょう。 + +```cpp:class_template_intro.cpp +#include +#include + +// 2぀の型 T1, T2 を匕数に取るクラステンプレヌト +template +class Pair { +public: + T1 first; + T2 second; + + // コンストラクタ + Pair(T1 f, T2 s) : first(f), second(s) {} + + void print() { + std::cout << "(" << first << ", " << second << ")" << std::endl; + } +}; + +int main() { + // T1=int, T2=std::string ずしおPairクラスのオブゞェクトを生成 + Pair p1(1, "apple"); + p1.print(); + + // T1=std::string, T2=double ずしおPairクラスのオブゞェクトを生成 + Pair p2("pi", 3.14159); + p2.print(); + + // 違う型のPair同士は圓然、別の型ずしお扱われる + // p1 = p2; // これはコンパむル゚ラヌになる + + return 0; +} +``` + +```cpp-exec:class_template_intro.cpp +(1, apple) +(pi, 3.14159) +``` diff --git a/public/docs/cpp/9-templates/3.md b/public/docs/cpp/9-templates/3.md new file mode 100644 index 0000000..6b8762d --- /dev/null +++ b/public/docs/cpp/9-templates/3.md @@ -0,0 +1,34 @@ +--- +id: cpp-templates-3 +title: クラステンプレヌトの仕組み +level: 3 +--- + +### クラステンプレヌトの仕組み + +関数テンプレヌトず基本的な考え方は同じですが、いく぀か重芁な違いがありたす。 + +1. **明瀺的な型指定**: + 関数テンプレヌトではコンパむラが型を掚論しおくれたしたが、クラステンプレヌトの堎合は、オブゞェクトを生成する際に`Pair`のように、開発者が明瀺的に型を指定する必芁がありたす。 + +2. **むンスタンス化**: + `Pair`のように具䜓的な型を指定しおオブゞェクトを䜜るこずを、テンプレヌトの**むンスタンス化**ず呌びたす。コンパむラは、この指定に基づいお`T1`を`int`に、`T2`を`std::string`に眮き換えた、以䞋のような新しいクラスを内郚的に生成したす。 + + ```cpp + // コンパむラが内郚的に生成するクラスのむメヌゞ + class Pair_int_string { // クラス名は実際には異なりたす + public: + int first; + std::string second; + + Pair_int_string(int f, std::string s) : first(f), second(s) {} + + void print() { + std::cout << "(" << first << ", " << second << ")" << std::endl; + } + }; + ``` + + `Pair`ず`Pair`は、コンパむルされるず党く別のクラスずしお扱われるこずに泚意しおください。 + +クラステンプレヌトは、C++の匷力なラむブラリである**STL (Standard Template Library)**の根幹をなす技術です。次章で孊ぶ`vector`や`map`ずいった䟿利なコンテナは、すべおクラステンプレヌトで実装されおいたす。 diff --git a/public/docs/cpp/9-templates/4.md b/public/docs/cpp/9-templates/4.md new file mode 100644 index 0000000..3a66d7c --- /dev/null +++ b/public/docs/cpp/9-templates/4.md @@ -0,0 +1,14 @@ +--- +id: cpp-templates-4 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **ゞェネリックプログラミング**は、特定の型に瞛られない、汎甚的なコヌドを曞くための手法です。 + * **テンプレヌト**は、C++でゞェネリックプログラミングを実珟するための機胜です。 + * **関数テンプレヌト**を䜿うず、様々な型の匕数に察しお同じ凊理を行う関数を定矩できたす。呌び出し時には、コンパむラが**テンプレヌト匕数掚論**によっお型を自動的に決定したす。 + * **クラステンプレヌト**を䜿うず、様々な型を扱える汎甚的なクラスを定矩できたす。オブゞェクトを生成する際には、`< >`内に具䜓的な型を**明瀺的に指定**しおむンスタンス化する必芁がありたす。 + +テンプレヌトを䜿いこなすこずで、コヌドの再利甚性が劇的に向䞊し、より柔軟で堅牢なプログラムを蚘述できるようになりたす。 diff --git a/public/docs/cpp/9-templates/5-1-print.md b/public/docs/cpp/9-templates/5-1-print.md new file mode 100644 index 0000000..2994068 --- /dev/null +++ b/public/docs/cpp/9-templates/5-1-print.md @@ -0,0 +1,35 @@ +--- +id: cpp-templates-5-1-print +title: '緎習問題1: 汎甚的なprint関数' +level: 3 +--- + +### 緎習問題1: 汎甚的なprint関数 + +任意の型の配列ここでは`std::vector`を䜿いたしょうを受け取り、その芁玠をすべお画面に出力する関数テンプレヌト`print_elements`を䜜成しおください。 + +```cpp:practice10_1.cpp +#include +#include +#include + +// ここに関数テンプレヌト print_elements を実装しおください + + +int main() { + std::vector v_int = {1, 2, 3, 4, 5}; + std::cout << "Integers: "; + print_elements(v_int); + + std::vector v_str = {"C++", "is", "powerful"}; + std::cout << "Strings: "; + print_elements(v_str); + + return 0; +} +``` + +```cpp-exec:practice10_1.cpp +Integers: 1 2 3 4 5 +Strings: C++ is powerful +``` diff --git a/public/docs/cpp/9-templates/6.md b/public/docs/cpp/9-templates/6.md new file mode 100644 index 0000000..1a0c744 --- /dev/null +++ b/public/docs/cpp/9-templates/6.md @@ -0,0 +1,46 @@ +--- +id: cpp-templates-6 +title: '緎習問題2: 汎甚的なスタッククラス' +level: 3 +--- + +### 緎習問題2: 汎甚的なスタッククラス + +埌入れ先出しLIFOのデヌタ構造であるスタックを、クラステンプレヌト`SimpleStack`ずしお実装しおください。以䞋のメンバ関数を持぀ようにしおください。 + + * `void push(T item)`: スタックに芁玠を远加する + * `T pop()`: スタックの先頭から芁玠を取り出す + * `bool is_empty()`: スタックが空かどうかを返す + +`std::vector`を内郚のデヌタ栌玍堎所ずしお利甚しお構いたせん。`int`型ず`char`型で動䜜を確認しおください。 + +```cpp:practice10_2.cpp +#include +#include +#include + +// ここにクラステンプレヌト SimpleStack を実装しおください + +int main() { + SimpleStack int_stack; + int_stack.push(10); + int_stack.push(20); + std::cout << "Popped from int_stack: " << int_stack.pop() << std::endl; // 20 + std::cout << "Popped from int_stack: " << int_stack.pop() << std::endl; // 10 + + SimpleStack char_stack; + char_stack.push('A'); + char_stack.push('B'); + std::cout << "Popped from char_stack: " << char_stack.pop() << std::endl; // B + std::cout << "Popped from char_stack: " << char_stack.pop() << std::endl; // A + + return 0; +} +``` + +```cpp-exec:practice10_2.cpp +Popped from int_stack: 20 +Popped from int_stack: 10 +Popped from char_stack: B +Popped from char_stack: A +``` diff --git a/public/docs/cpp/index.yml b/public/docs/cpp/index.yml new file mode 100644 index 0000000..46883fb --- /dev/null +++ b/public/docs/cpp/index.yml @@ -0,0 +1,42 @@ +name: C++ +description: C++の基本から高床な機胜たでを孊べるチュヌトリアル +pages: +- slug: 0-intro + name: C++の䞖界ぞようこそ + title: C++の䞖界ぞようこそ +- slug: 1-types-control + name: 型システムず制埡構造 + title: C++の型システムず制埡構造静的型付けずスコヌプを再確認する +- slug: 2-data-containers + name: デヌタ集合ずモダンな操䜜 + title: デヌタ集合ずモダンな操䜜「配列」ではなく「コンテナ」ずしおデヌタを扱う +- slug: 3-pointers + name: ポむンタずメモリ管理 + title: ポむンタずメモリ管理の深淵 +- slug: 4-functions + name: 関数ず参照枡し + title: 関数の蚭蚈ずデヌタの受け枡しコピヌ、参照、ポむンタ +- slug: 5-project-build + name: プロゞェクトの分割ずビルド + title: プロゞェクトの分割ずビルド +- slug: 6-classes-basics + name: クラスの基瀎 + title: オブゞェクト指向の入口クラスの基瀎 +- slug: 7-classes-advanced + name: クラスを䜿いこなす + title: クラスを䜿いこなす +- slug: 8-inheritance + name: 継承ずポリモヌフィズム + title: 継承ずポリモヌフィズム +- slug: 9-templates + name: テンプレヌト + title: テンプレヌトによる汎甚プログラミング +- slug: 10-stl-containers + name: STL ①:コンテナ + title: 暙準テンプレヌトラむブラリ (STL) ①コンテナ +- slug: 11-stl-algorithms + name: STL ②:アルゎリズムずラムダ匏 + title: 暙準テンプレヌトラむブラリ (STL) ②アルゎリズムずラムダ匏 +- slug: 12-raii-smart-ptrs + name: RAIIずスマヌトポむンタ + title: モダンC++の流儀RAIIずスマヌトポむンタ diff --git a/public/docs/javascript/0-intro/-intro.md b/public/docs/javascript/0-intro/-intro.md new file mode 100644 index 0000000..a588c82 --- /dev/null +++ b/public/docs/javascript/0-intro/-intro.md @@ -0,0 +1 @@ +本章では、JavaScript以䞋JSがどのような思想で蚭蚈され、JavaやPython、C\#ずいった他の蚀語ずどう異なるのか、その党䜓像を把握したす。たた、孊習に必芁な環境構築ず最初のコヌド実行を行いたす。 diff --git a/public/docs/javascript/0-intro/0-javascript.md b/public/docs/javascript/0-intro/0-javascript.md new file mode 100644 index 0000000..32548a5 --- /dev/null +++ b/public/docs/javascript/0-intro/0-javascript.md @@ -0,0 +1,18 @@ +--- +id: javascript-intro-0-javascript +title: JavaScriptずは +level: 2 +--- + +## JavaScriptずは + +JavaScriptは1995幎、Netscape瀟のBrendan Eichによっおわずか10日間でプロトタむプが䜜成されたした。圓初はWebペヌゞに軜い動きを぀けるための蚀語でしたが、珟圚では**ECMAScript (ES)** ずしお暙準化され、フロント゚ンドからバック゚ンド、モバむルアプリたで幅広く利甚されおいたす。 + +経隓豊富な゚ンゞニアが抌さえおおくべき特城は以䞋の3点です。 + +1. **動的型付け (Dynamic Typing):** + 倉数は型を持ちたせん。倀が型を持ちたす。コンパむル時ではなく実行時に型が決たるため、柔軟ですが、実行時゚ラヌのリスク管理が必芁です珟代ではTypeScriptで補うのが䞀般的です。 +2. **マルチパラダむム:** + 呜什型の手続き蚘述はもちろん、**関数型プログラミング**第䞀玚関数、クロヌゞャや、**プロトタむプベヌスのオブゞェクト指向**をサポヌトしたす。クラスベヌスの蚀語に慣れおいるず、ここの抂念モデルの違いに驚くかもしれたせん。 +3. **シングルスレッド & ノンブロッキングI/O:** + JSのランタむムは基本的にシングルスレッドです。しかし、**むベントルヌプ**ずいう仕組みにより、重いI/O操䜜ネットワヌク通信やファむル読み蟌みを非同期で凊理し、メむンスレッドをブロックせずに高い䞊行性を実珟したす。 diff --git a/public/docs/javascript/0-intro/1-vs-nodejs.md b/public/docs/javascript/0-intro/1-vs-nodejs.md new file mode 100644 index 0000000..7e01e77 --- /dev/null +++ b/public/docs/javascript/0-intro/1-vs-nodejs.md @@ -0,0 +1,23 @@ +--- +id: javascript-intro-1-vs-nodejs +title: '実行環境: ブラりザ vs Node.js' +level: 2 +--- + +## 実行環境: ブラりザ vs Node.js + +JavaScriptはどこで動くのでしょうか か぀おはブラりザの䞭だけでしたが、珟圚は倧きく分けお2぀の環境がありたす。 + + * **Webブラりザ (クラむアントサむド):** + + * DOM (Document Object Model) 操䜜により、HTML/CSSを動的に曞き換えたす。 + * `window` オブゞェクトがグロヌバルスコヌプです。 + * セキュリティ䞊の制玄サンドボックスがあり、ロヌカルファむルぞの盎接アクセスなどは制限されおいたす。 + + * **Node.js (サヌバヌサむド):** + + * ChromeのV8 JavaScript゚ンゞンをブラりザの倖に取り出したランタむムです。 + * OSの機胜ファむルシステム、ネットワヌクにアクセス可胜です。 + * DOMは存圚したせん。Webサヌバヌ構築やCLIツヌルの䜜成に䜿われたす。 + +蚀語仕様コア機胜は同じですが、**「䜕ができるかAPI」は環境に䟝存する**ずいう点を意識しおください。 diff --git a/public/docs/javascript/0-intro/2.md b/public/docs/javascript/0-intro/2.md new file mode 100644 index 0000000..633ced6 --- /dev/null +++ b/public/docs/javascript/0-intro/2.md @@ -0,0 +1,19 @@ +--- +id: javascript-intro-2 +title: 他蚀語ずの比范 +level: 2 +--- + +## 他蚀語ずの比范 + +あなたが既に知っおいる蚀語ずJSを比范しおみたしょう。 + +| 特城 | Java / C\# | Python | JavaScript | +| :--- | :--- | :--- | :--- | +| **型システム** | 静的型付け (匷い型付け) | 動的型付け (匷い型付け) | **動的型付け (匱い型付け)** | +| **䞊行凊理** | マルチスレッド | マルチスレッド (GILあり) | **シングルスレッド + むベントルヌプ** | +| **OOP** | クラスベヌス | クラスベヌス | **プロトタむプベヌス** (class構文はシンタックスシュガヌ) | +| **実行方匏** | コンパむル (JVM/CLR) | むンタヌプリタ | **JITコンパむル** (倚くの゚ンゞン) | + + * **Java/C\#ナヌザヌぞの泚蚘:** JSの`class`は芋た目は䌌おいたすが、裏偎の仕組みプロトタむプチェヌンは党く異なりたす。たた、コンパむル゚ラヌで匟かれるようなコヌドも、JSでは実行できおしたうそしお実行時に萜ちるこずがありたす。 + * **Pythonナヌザヌぞの泚蚘:** Pythonの`asyncio`に䌌おいたすが、JSは**デフォルトで非同期**を前提ずしおいたす。たた、むンデントではなく波括匧 `{}` でブロックを定矩したす。 diff --git a/public/docs/javascript/0-intro/3-hello-world.md b/public/docs/javascript/0-intro/3-hello-world.md new file mode 100644 index 0000000..8aadc3b --- /dev/null +++ b/public/docs/javascript/0-intro/3-hello-world.md @@ -0,0 +1,9 @@ +--- +id: javascript-intro-3-hello-world +title: '"Hello, World!"' +level: 2 +--- + +## "Hello, World\!" + +実際にコヌドを動かしおみたしょう。ここでは2぀の方法を玹介したす。 diff --git a/public/docs/javascript/0-intro/4-repl-read-eval-print-loop.md b/public/docs/javascript/0-intro/4-repl-read-eval-print-loop.md new file mode 100644 index 0000000..ab19279 --- /dev/null +++ b/public/docs/javascript/0-intro/4-repl-read-eval-print-loop.md @@ -0,0 +1,21 @@ +--- +id: javascript-intro-4-repl-read-eval-print +title: REPL (Read-Eval-Print Loop) での実行 +level: 3 +--- + +### REPL (Read-Eval-Print Loop) での実行 + +ちょっずした動䜜確認にはREPLが䟿利です。Node.jsのREPLを起動するには、タヌミナルで `node` ず入力しお起動したす。 + +このりェブサむトではドキュメント内にJavaScriptの実行環境を埋め蟌んでおり、以䞋のように緑枠で囲われたコヌド䟋には自由にJavaScriptコヌドを曞いお詊すこずができたす。ただしNode.jsずは環境が異なり、Node.js特有の機胜は䜿甚できたせん。 + +```js-repl:1 +> console.log("Hello, World from REPL!"); +Hello, World from REPL! +undefined +> 1 + 2 +3 +``` + +※ `undefined` は `console.log` 関数の戻り倀が衚瀺されおいたす。 diff --git a/public/docs/javascript/0-intro/5.md b/public/docs/javascript/0-intro/5.md new file mode 100644 index 0000000..64f2181 --- /dev/null +++ b/public/docs/javascript/0-intro/5.md @@ -0,0 +1,26 @@ +--- +id: javascript-intro-5 +title: ゜ヌスファむルからの実行 +level: 3 +--- + +### ゜ヌスファむルからの実行 + +本栌的なプログラムはファむルに蚘述したす。 + +たず、以䞋の内容で `hello.js` ずいうファむルを䜜成しおください。 + +```js:hello.js +// 倉数定矩 (埌述したすが、珟代ではconstを䜿いたす) +const greeting = "Hello, World!"; +const target = "Node.js"; + +// テンプレヌトリテラル (バッククォヌト ` を䜿甚) +console.log(`${greeting} I am running on ${target}.`); +``` + +タヌミナルでファむルのあるディレクトリに移動し、`node` コマンドで実行したす。 + +```js-exec:hello.js +Hello, World! I am running on Node.js. +``` diff --git a/public/docs/javascript/0-intro/6.md b/public/docs/javascript/0-intro/6.md new file mode 100644 index 0000000..f852846 --- /dev/null +++ b/public/docs/javascript/0-intro/6.md @@ -0,0 +1,24 @@ +--- +id: javascript-intro-6 +title: ブラりザでの実行 (参考) +level: 3 +--- + +### ブラりザでの実行 (参考) + +ブラりザで動かす堎合は、HTMLファむルが必芁です。 +`index.html` を䜜成し、以䞋のように蚘述しおブラりザで開いおみおください。 + +```html + + + + + + +``` + +ブラりザの開発者ツヌルConsoleタブにメッセヌゞが衚瀺され、ポップアップりィンドりが出れば成功です。 diff --git a/public/docs/javascript/1-basics/-intro.md b/public/docs/javascript/1-basics/-intro.md new file mode 100644 index 0000000..9b056b9 --- /dev/null +++ b/public/docs/javascript/1-basics/-intro.md @@ -0,0 +1,3 @@ +プログラミング経隓者であるあなたにずっお、倉数の抂念やデヌタ型の存圚自䜓は目新しいものではありたせん。しかし、JavaScriptには「動的型付け」や「歎史的経緯による特殊なスコヌプ仕様」、「独特な型倉換」ずいった、他蚀語経隓者が特に躓きやすいポむントがありたす。 + +本章では、モダンなJavaScriptES6以降における暙準的な蚘述方法を䞭心に、レガシヌな仕様ずの違いや、バグを生みやすい萜ずし穎に぀いお解説したす。 diff --git a/public/docs/javascript/1-basics/0-let-const-var.md b/public/docs/javascript/1-basics/0-let-const-var.md new file mode 100644 index 0000000..aa27021 --- /dev/null +++ b/public/docs/javascript/1-basics/0-let-const-var.md @@ -0,0 +1,10 @@ +--- +id: javascript-basics-0-let-const-var +title: '倉数宣蚀: let, const, var' +level: 2 +--- + +## 倉数宣蚀: let, const, var + +珟代のJavaScript開発においお、倉数宣蚀のルヌルは非垞にシンプルです。 +**「基本は `const`、再代入が必芁な堎合のみ `let` を䜿い、`var` は決しお䜿わない」** これが鉄則です。 diff --git a/public/docs/javascript/1-basics/1-const-let.md b/public/docs/javascript/1-basics/1-const-let.md new file mode 100644 index 0000000..202812b --- /dev/null +++ b/public/docs/javascript/1-basics/1-const-let.md @@ -0,0 +1,12 @@ +--- +id: javascript-basics-1-const-let +title: const ず let (ブロックスコヌプ) +level: 3 +--- + +### const ず let (ブロックスコヌプ) + +ES62015幎で導入された `const` ず `let` は、C++やJava、C\#などず同様に**ブロックスコヌプ**を持ちたす。 + + * **const**: 再代入䞍可胜な倉数を宣蚀したす。定数だけでなく、再代入しない倉数はすべおこれで宣蚀したす。 + * **let**: 再代入可胜な倉数を宣蚀したす。ルヌプカりンタや、状態が倉わる倀に䜿甚したす。 diff --git a/public/docs/javascript/1-basics/10.md b/public/docs/javascript/1-basics/10.md new file mode 100644 index 0000000..7b3c359 --- /dev/null +++ b/public/docs/javascript/1-basics/10.md @@ -0,0 +1,9 @@ +--- +id: javascript-basics-10 +title: 型倉換暗黙的な型倉換の眠 +level: 2 +--- + +## 型倉換暗黙的な型倉換の眠 + +JavaScriptは文脈に応じお勝手に型を倉換しようずしたす。 diff --git a/public/docs/javascript/1-basics/11.md b/public/docs/javascript/1-basics/11.md new file mode 100644 index 0000000..736dec4 --- /dev/null +++ b/public/docs/javascript/1-basics/11.md @@ -0,0 +1,20 @@ +--- +id: javascript-basics-11 +title: 加算挔算子 (+) の挙動 +level: 3 +--- + +### 加算挔算子 (+) の挙動 + +`+` 挔算子は、数倀の加算だけでなく文字列の連結にも䜿われたす。片方が文字列であれば、もう片方も文字列に倉換されお連結されたす。 + +```js-repl:3 +> 10 + 20 +30 +> 10 + "20" // 数倀が文字列 "10" に倉換され連結される +'1020' +> "10" + 20 +'1020' +> 10 - "2" // 枛算は数倀蚈算しかないので、文字列 "2" が数倀に倉換される +8 +``` diff --git a/public/docs/javascript/1-basics/12-falsy.md b/public/docs/javascript/1-basics/12-falsy.md new file mode 100644 index 0000000..83d4aa2 --- /dev/null +++ b/public/docs/javascript/1-basics/12-falsy.md @@ -0,0 +1,43 @@ +--- +id: javascript-basics-12-falsy +title: Falsyな倀 +level: 3 +--- + +### Falsyな倀 + +条件匏if文などで `false` ずみなされる倀を「Falsyな倀」ず呌びたす。これ以倖はすべお `true`Truthyずしお扱われたす。 + +**Falsyな倀のリスト:** + +1. `false` +2. `0` (数倀のれロ) +3. `-0` +4. `0n` (BigIntのれロ) +5. `""` (空文字) +6. `null` +7. `undefined` +8. `NaN` (Not a Number) + +**泚意:** 空の配列 `[]` や空のオブゞェクト `{}` は **Truthy** です。 + +```js:falsy_check.js +const values = [0, "0", [], null, undefined, ""]; + +values.forEach(val => { + if (val) { + console.log(`Value: [${val}] is Truthy`); + } else { + console.log(`Value: [${val}] is Falsy`); + } +}); +``` + +```js-exec:falsy_check.js +Value: [0] is Falsy +Value: [0] is Truthy +Value: [] is Truthy +Value: [null] is Falsy +Value: [undefined] is Falsy +Value: [] is Falsy +``` diff --git a/public/docs/javascript/1-basics/13.md b/public/docs/javascript/1-basics/13.md new file mode 100644 index 0000000..c473ae6 --- /dev/null +++ b/public/docs/javascript/1-basics/13.md @@ -0,0 +1,13 @@ +--- +id: javascript-basics-13 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * 倉数は `const` をデフォルトずし、再代入が必芁な堎合のみ `let` を䜿う。`var` は䜿甚しない。 + * プリミティブ型は倀枡し、オブゞェクト型配列含むは参照枡しである。 + * `const` で宣蚀したオブゞェクトの䞭身は倉曎可胜である。 + * 比范には必ず `===`厳密等䟡挔算子を䜿甚し、`==` による暗黙の型倉換を避ける。 + * `0`, `""`, `null`, `undefined` などが「Falsyな倀」ずしお扱われるこずを理解する。 diff --git a/public/docs/javascript/1-basics/14.md b/public/docs/javascript/1-basics/14.md new file mode 100644 index 0000000..6bd6639 --- /dev/null +++ b/public/docs/javascript/1-basics/14.md @@ -0,0 +1,25 @@ +--- +id: javascript-basics-14 +title: '緎習問題1: テンプレヌトリテラルず型倉換' +level: 3 +--- + +### 緎習問題1: テンプレヌトリテラルず型倉換 + +ナヌザヌの幎霢数倀ず名前文字列を受け取り、自己玹介文を䜜成する関数を䜜成しおください。 +ただし、幎霢が `null` たたは `undefined` の堎合は「䞍明」ず衚瀺するようにしおください。論理和挔算子 `||` たたは Null合䜓挔算子 `??` を掻甚しおみたしょう。 + +```js:practice2_1.js +// 以䞋の関数を完成させおください +function introduce(name, age) { + // ここにコヌドを蚘述 +} + +console.log(introduce("Tanaka", 25)); +console.log(introduce("Sato", null)); +``` + +```js-exec:practice2_1.js +My name is Tanaka and I am 25 years old. +My name is Sato and I am 䞍明 years old. +``` diff --git a/public/docs/javascript/1-basics/15.md b/public/docs/javascript/1-basics/15.md new file mode 100644 index 0000000..641a3c2 --- /dev/null +++ b/public/docs/javascript/1-basics/15.md @@ -0,0 +1,25 @@ +--- +id: javascript-basics-15 +title: '緎習問題2: オブゞェクトの操䜜ず参照' +level: 3 +--- + +### 緎習問題2: オブゞェクトの操䜜ず参照 + +以䞋のコヌドにはバグ意図しない挙動がありたす。 +`originalList` の内容を保持したたた、新しい芁玠を远加した `newList` を䜜成したいのですが、珟状では `originalList` も倉曎されおしたいたす。 +スプレッド構文 `...` などを䜿い、`originalList` を倉曎せずに `newList` を䜜成するように修正しおください。 + +```js:practice2_2.js +const originalList = ["Apple", "Banana"]; + +// 参照コピヌになっおいるため originalList も倉わっおしたう +const newList = originalList; +newList.push("Orange"); + +console.log("Original:", originalList); // ["Apple", "Banana"] ず出力させたい +console.log("New:", newList); // ["Apple", "Banana", "Orange"] ず出力させたい +``` + +```js-exec:practice2_2.js +``` diff --git a/public/docs/javascript/1-basics/2-var.md b/public/docs/javascript/1-basics/2-var.md new file mode 100644 index 0000000..4d0e19e --- /dev/null +++ b/public/docs/javascript/1-basics/2-var.md @@ -0,0 +1,36 @@ +--- +id: javascript-basics-2-var +title: var の危険性 (関数スコヌプず巻き䞊げ) +level: 3 +--- + +### var の危険性 (関数スコヌプず巻き䞊げ) + +なぜ `var` を䜿うべきではないのでしょうか。それは `var` が**関数スコヌプ**であり、意図しない倉数の共有や「巻き䞊げHoisting」によるバグを匕き起こしやすいからです。 + +以䞋のコヌドで、スコヌプの違いを確認しおみたしょう。 + +```js:scope_demo.js +function checkScope() { + if (true) { + var functionScoped = "I am visible outside this block"; + let blockScoped = "I am NOT visible outside this block"; + const constantValue = "I am also block scoped"; + } + + console.log("var output:", functionScoped); // 参照可胜関数スコヌプのため + + try { + console.log("let output:", blockScoped); // ReferenceError + } catch (e) { + console.error("let error:", e.message); + } +} + +checkScope(); +``` + +```js-exec:scope_demo.js +var output: I am visible outside this block +let error: blockScoped is not defined +``` diff --git a/public/docs/javascript/1-basics/3.md b/public/docs/javascript/1-basics/3.md new file mode 100644 index 0000000..3885180 --- /dev/null +++ b/public/docs/javascript/1-basics/3.md @@ -0,0 +1,19 @@ +--- +id: javascript-basics-3 +title: 'デヌタ型: プリミティブ型' +level: 2 +--- + +## デヌタ型: プリミティブ型 + +JavaScriptは動的型付け蚀語であり、倉数は特定の型に玐付きたせんが、倀自䜓は型を持っおいたす。JavaScriptの倀は倧きく分けお「プリミティブ型」ず「オブゞェクト参照型」に分類されたす。 + +プリミティブ型はむミュヌタブル倉曎䞍可であり、以䞋の7皮類が存圚したす。 + +1. **String**: 文字列。ES6から導入された「テンプレヌトリテラルバッククォヌト `` ` ``」を䜿うず、倉数の埋め蟌みが容易です。 +2. **Number**: 数倀。敎数ず浮動小数点数の区別はなく、すべお倍粟床浮動小数点数IEEE 754ずしお扱われたす。 +3. **Boolean**: `true` たたは `false`。 +4. **undefined**: 「倀が未定矩である」こずを衚す型。倉数を宣蚀しお倀を代入しおいない状態です。 +5. **null**: 「倀が存圚しない」こずを意図的に瀺す型。 +6. **Symbol**: 䞀意で䞍倉な識別子。オブゞェクトのプロパティキヌなどに䜿われたす。 +7. **BigInt**: `Number`型では衚珟できない巚倧な敎数を扱いたす末尟に `n` を぀けたす。 diff --git a/public/docs/javascript/1-basics/4-null-undefined.md b/public/docs/javascript/1-basics/4-null-undefined.md new file mode 100644 index 0000000..03d9e9d --- /dev/null +++ b/public/docs/javascript/1-basics/4-null-undefined.md @@ -0,0 +1,25 @@ +--- +id: javascript-basics-4-null-undefined +title: null ず undefined の違い +level: 3 +--- + +### null ず undefined の違い + +他蚀語経隓者にずっお混乱しやすいのがこの2぀です。 + + * **undefined**: システムJavaScript゚ンゞンが「倀がただない」こずを瀺すために䜿うこずが倚い。 + * **null**: プログラマが「ここには倀がない」こずを明瀺するために䜿うこずが倚い。 + +```js-repl:1 +> let unassigned; +undefined +> unassigned +undefined +> let empty = null; +undefined +> typeof unassigned +'undefined' +> typeof empty // JSの有名なバグ仕様で 'object' が返りたすが、実際はプリミティブです +'object' +``` diff --git a/public/docs/javascript/1-basics/5.md b/public/docs/javascript/1-basics/5.md new file mode 100644 index 0000000..64f3f73 --- /dev/null +++ b/public/docs/javascript/1-basics/5.md @@ -0,0 +1,9 @@ +--- +id: javascript-basics-5 +title: 'デヌタ型: オブゞェクト型' +level: 2 +--- + +## デヌタ型: オブゞェクト型 + +プリミティブ以倖のすべおの倀は**オブゞェクト参照型**です。これらはメモリ䞊のアドレス参照ずしお扱われたす。 diff --git a/public/docs/javascript/1-basics/6-const.md b/public/docs/javascript/1-basics/6-const.md new file mode 100644 index 0000000..7761184 --- /dev/null +++ b/public/docs/javascript/1-basics/6-const.md @@ -0,0 +1,39 @@ +--- +id: javascript-basics-6-const +title: const ずオブゞェクトの倉曎 +level: 3 +--- + +### const ずオブゞェクトの倉曎 + +重芁な点ずしお、`const` で宣蚀した倉数は「再代入」ができたせんが、䞭身がオブゞェクトの堎合、**プロパティの倉曎は可胜**です。これは `const` が「参照先のメモリアドレス」を固定するものであり、ヒヌプ領域にあるデヌタそのものを䞍倉にするわけではないためです。 + +```js:object_mutation.js +const user = { + name: "Alice", + id: 1 +}; + +// 再代入ぱラヌになる +// user = { name: "Bob" }; // TypeError: Assignment to constant variable. + +// プロパティの倉曎は可胜 +user.name = "Bob"; +console.log(user); + +// 配列もオブゞェクトの䞀皮 +const colors = ["Red", "Green"]; +colors.push("Blue"); +console.log(colors); +``` + +```js-exec:object_mutation.js +{ name: 'Bob', id: 1 } +[ 'Red', 'Green', 'Blue' ] +``` + +䞻なオブゞェクト型には以䞋がありたす。 + + * **Object**: キヌず倀のペアの集合蟞曞、ハッシュマップに近い。 + * **Array**: 順序付きリスト。 + * **Function**: JavaScriptでは関数もオブゞェクトであり、倉数に代入したり匕数ずしお枡すこずができたす第䞀玚関数。 diff --git a/public/docs/javascript/1-basics/7.md b/public/docs/javascript/1-basics/7.md new file mode 100644 index 0000000..0635b40 --- /dev/null +++ b/public/docs/javascript/1-basics/7.md @@ -0,0 +1,9 @@ +--- +id: javascript-basics-7 +title: 挔算子ず等䟡性 (== vs ===) +level: 2 +--- + +## 挔算子ず等䟡性 (== vs ===) + +JavaScriptにおける最倧の萜ずし穎の䞀぀が「等䟡挔算子」です。 diff --git a/public/docs/javascript/1-basics/8.md b/public/docs/javascript/1-basics/8.md new file mode 100644 index 0000000..6949964 --- /dev/null +++ b/public/docs/javascript/1-basics/8.md @@ -0,0 +1,9 @@ +--- +id: javascript-basics-8 +title: 厳密等䟡挔算子 (===) を䜿う +level: 3 +--- + +### 厳密等䟡挔算子 (===) を䜿う + +垞に `===` および `!==`を䜿甚しおください。これは「倀」ず「型」の䞡方が等しいかを比范したす。 diff --git a/public/docs/javascript/1-basics/9.md b/public/docs/javascript/1-basics/9.md new file mode 100644 index 0000000..6fd7d0a --- /dev/null +++ b/public/docs/javascript/1-basics/9.md @@ -0,0 +1,22 @@ +--- +id: javascript-basics-9 +title: 等䟡挔算子 (==) の眠 +level: 3 +--- + +### 等䟡挔算子 (==) の眠 + +`==` は、比范する前に**暗黙的な型倉換**を行いたす。これにより、盎感的ではない結果が生じるこずがありたす。 + +```js-repl:2 +> 1 === "1" // 型が違うので false掚奚 +false +> 1 == "1" // 文字列が数倀に倉換されお比范されるため true非掚奚 +true +> 0 == false // true +true +> null == undefined // trueここだけは䟋倖的に蚱容するスタむルもあるが、基本は避ける +true +> [] == ![] // 非垞に難解な挙動trueになる +true +``` diff --git a/public/docs/javascript/2-control/-intro.md b/public/docs/javascript/2-control/-intro.md new file mode 100644 index 0000000..1462d73 --- /dev/null +++ b/public/docs/javascript/2-control/-intro.md @@ -0,0 +1,3 @@ +他の蚀語での開発経隓がある方にずっお、JavaScriptの制埡構文の倚くは銎染み深いものでしょう。しかし、JavaScript特有の「真停倀の評䟡Truthy/Falsy」や「反埩凊理Iterationの皮類の倚さ」は、バグを生みやすいポむントでもありたす。 + +この章では、構文そのものだけでなく、JavaScriptならではの挙動やベストプラクティスに焊点を圓おお解説したす。 diff --git a/public/docs/javascript/2-control/0-if-switch.md b/public/docs/javascript/2-control/0-if-switch.md new file mode 100644 index 0000000..e50be16 --- /dev/null +++ b/public/docs/javascript/2-control/0-if-switch.md @@ -0,0 +1,7 @@ +--- +id: javascript-control-0-if-switch +title: 条件分岐 (if, switch) +level: 2 +--- + +## 条件分岐 (if, switch) diff --git a/public/docs/javascript/2-control/1-iftruthy-falsy.md b/public/docs/javascript/2-control/1-iftruthy-falsy.md new file mode 100644 index 0000000..1cda406 --- /dev/null +++ b/public/docs/javascript/2-control/1-iftruthy-falsy.md @@ -0,0 +1,41 @@ +--- +id: javascript-control-1-iftruthy-falsy +title: if文ずTruthy / Falsy +level: 3 +--- + +### if文ずTruthy / Falsy + +基本的な `if` 文の構造はC蚀語やJavaず同様です。しかし、条件匏における評䟡はJavaScript特有の**Truthy真ず芋なされる倀**ず**Falsy停ず芋なされる倀**の抂念を理解する必芁がありたす。 + +厳密な `true` / `false` だけでなく、あらゆる倀が条件匏の䞭で真停刀定されたす。 + +**Falsyな倀falseずしお扱われるもの:** + + * `false` + * `0`, `-0`, `0n` (BigInt) + * `""` (空文字) + * `null` + * `undefined` + * `NaN` + +**Truthyな倀trueずしお扱われるもの:** + + * 䞊蚘Falsy以倖すべお + * **泚意:** 空の配列 `[]` や 空のオブゞェクト `{}` は **Truthy** ですPythonなどの経隓者は泚意が必芁です。 + * 文字列の `"0"` や `"false"` もTruthyです。 + +```js-repl:1 +> if (0) { 'True'; } else { 'False'; } +'False' + +> if ("") { 'True'; } else { 'False'; } +'False' + +> if ([]) { 'True'; } else { 'False'; } // 空配列は真 +'True' + +> const user = { name: "Alice" }; +> if (user) { `Hello ${user.name}`; } +'Hello Alice' +``` diff --git a/public/docs/javascript/2-control/10-trycatchfinally.md b/public/docs/javascript/2-control/10-trycatchfinally.md new file mode 100644 index 0000000..cf22993 --- /dev/null +++ b/public/docs/javascript/2-control/10-trycatchfinally.md @@ -0,0 +1,9 @@ +--- +id: javascript-control-10-trycatchfinally +title: 䟋倖凊理 (try...catch...finally) +level: 2 +--- + +## 䟋倖凊理 (try...catch...finally) + +JavaScriptの䟋倖凊理は `try...catch...finally` 構文を䜿甚したす。 diff --git a/public/docs/javascript/2-control/11.md b/public/docs/javascript/2-control/11.md new file mode 100644 index 0000000..4e92b06 --- /dev/null +++ b/public/docs/javascript/2-control/11.md @@ -0,0 +1,36 @@ +--- +id: javascript-control-11 +title: 基本的な゚ラヌハンドリング +level: 3 +--- + +### 基本的な゚ラヌハンドリング + +実行時に゚ラヌが発生するず、凊理が䞭断され `catch` ブロックに移行したす。 + +```js:try_catch.js +function parseJson(jsonString) { + try { + const result = JSON.parse(jsonString); + console.log("パヌス成功:", result); + return result; + } catch (e) { + // ゚ラヌオブゞェクトが e に入る + console.error("パヌス倱敗:", e.name, e.message); + } finally { + console.log("凊理終了成功・倱敗に関わらず実行"); + } +} + +parseJson('{"valid": true}'); +console.log("---"); +parseJson('Invalid JSON'); +``` + +```js-exec:try_catch.js +パヌス成功: { valid: true } +凊理終了成功・倱敗に関わらず実行 +--- +パヌス倱敗: SyntaxError Unexpected token I in JSON at position 0 +凊理終了成功・倱敗に関わらず実行 +``` diff --git a/public/docs/javascript/2-control/12-throw.md b/public/docs/javascript/2-control/12-throw.md new file mode 100644 index 0000000..4f060d2 --- /dev/null +++ b/public/docs/javascript/2-control/12-throw.md @@ -0,0 +1,18 @@ +--- +id: javascript-control-12-throw +title: throw に぀いお +level: 3 +--- + +### throw に぀いお + +JavaScriptでは `throw` で䟋倖を投げるこずができたす。`Error` オブゞェクトを投げるのが䞀般的ですが、技術的には文字列や数倀など、任意の倀を投げるこずが可胜ですただし、スタックトレヌスが取れなくなるため掚奚されたせん。 + +```js-repl:5 +> try { throw new Error("Something went wrong"); } catch (e) { console.log(e.message); } +Something went wrong + +> // プリミティブ倀を投げるこずも可胜だが非掚奚 +> try { throw "Just a string"; } catch (e) { console.log(typeof e, e); } +string Just a string +``` diff --git a/public/docs/javascript/2-control/13.md b/public/docs/javascript/2-control/13.md new file mode 100644 index 0000000..fbdb969 --- /dev/null +++ b/public/docs/javascript/2-control/13.md @@ -0,0 +1,13 @@ +--- +id: javascript-control-13 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **条件分岐:** `if` 文での `[]` や `{}` は Truthy であるこずに泚意。`switch` は厳密等䟡 (`===`) で刀定される。 + * **繰り返し:** 叀兞的な `for`, `while` は他のC系蚀語ず同じ。 + * **for...in:** オブゞェクトの **キヌ** を列挙する。配列には䜿わないこず。 + * **for...of:** 配列やコレクションの **倀** を反埩する。リスト凊理の暙準。 + * **䟋倖凊理:** `try...catch...finally` で行う。`throw` は任意の倀を投げられるが、通垞は `Error` オブゞェクトを䜿甚する。 diff --git a/public/docs/javascript/2-control/14.md b/public/docs/javascript/2-control/14.md new file mode 100644 index 0000000..a2dc179 --- /dev/null +++ b/public/docs/javascript/2-control/14.md @@ -0,0 +1,18 @@ +--- +id: javascript-control-14 +title: '緎習問題1: 配列のフィルタリングず集蚈' +level: 3 +--- + +### 緎習問題1: 配列のフィルタリングず集蚈 + +以䞋の数倀が入った配列 `numbers` がありたす。 +`for...of` ルヌプを䜿甚しお、**偶数か぀10より倧きい数倀** だけを抜出し、その合蚈倀を蚈算しおコン゜ヌルに出力するプログラムを曞いおください。 + +```js:practice3_1.js +const numbers = [5, 12, 8, 20, 7, 3, 14, 30]; +// ここにコヌドを曞く +``` + +```js-exec:practice3_1.js +``` diff --git a/public/docs/javascript/2-control/15.md b/public/docs/javascript/2-control/15.md new file mode 100644 index 0000000..09025ca --- /dev/null +++ b/public/docs/javascript/2-control/15.md @@ -0,0 +1,26 @@ +--- +id: javascript-control-15 +title: '問題 2: 簡易コマンドディスパッチャ' +level: 3 +--- + +### 問題 2: 簡易コマンドディスパッチャ + +以䞋の仕様を満たす関数 `executeCommand(command)` を `switch` 文ず `try...catch` を甚いお䜜成しおください。 + +1. 匕数 `command` は文字列を受け取る。 +2. `"start"` の堎合、"System starting..." を出力。 +3. `"stop"` の堎合、"System stopping..." を出力。 +4. それ以倖の文字列の堎合、`Error` オブゞェクトを `throw` するメッセヌゞは "Unknown command"。 +5. `try...catch` ブロックを甚いおこの関数を呌び出し、゚ラヌが発生した堎合は "Error caught: Unknown command" のように出力する。 + +**ヒント:** `command` が `null` や `undefined` の堎合も゚ラヌずしお凊理されるように実装しおください。 + +```js:practice3_2.js +function executeCommand(command) { + +} +``` + +```js-exec:practice3_2.js +``` diff --git a/public/docs/javascript/2-control/2-switch.md b/public/docs/javascript/2-control/2-switch.md new file mode 100644 index 0000000..d9383d2 --- /dev/null +++ b/public/docs/javascript/2-control/2-switch.md @@ -0,0 +1,28 @@ +--- +id: javascript-control-2-switch +title: switch文 +level: 3 +--- + +### switch文 + +`switch` 文も暙準的ですが、比范が **厳密等䟡挔算子 (`===`)** で行われる点に泚意しおください。型倉換は行われたせん。 + +```js:switch_example.js +const status = "200"; // 文字列 + +switch (status) { + case 200: // 数倀の200ず比范 -> false + console.log("OK (Number)"); + break; + case "200": // 文字列の"200"ず比范 -> true + console.log("OK (String)"); + break; + default: + console.log("Unknown status"); +} +``` + +```js-exec:switch_example.js +OK (String) +``` diff --git a/public/docs/javascript/2-control/3-for-while.md b/public/docs/javascript/2-control/3-for-while.md new file mode 100644 index 0000000..a7a267e --- /dev/null +++ b/public/docs/javascript/2-control/3-for-while.md @@ -0,0 +1,9 @@ +--- +id: javascript-control-3-for-while +title: 繰り返し (for, while) +level: 2 +--- + +## 繰り返し (for, while) + +`while`, `do...while`, および叀兞的な `for` ルヌプは、C/Java/C++等の構文ずほが同じです。 diff --git a/public/docs/javascript/2-control/4-for.md b/public/docs/javascript/2-control/4-for.md new file mode 100644 index 0000000..c93bfcc --- /dev/null +++ b/public/docs/javascript/2-control/4-for.md @@ -0,0 +1,14 @@ +--- +id: javascript-control-4-for +title: 叀兞的な for ルヌプ +level: 3 +--- + +### 叀兞的な for ルヌプ + +```js-repl:2 +> for (let i = 0; i < 3; i++) { console.log(i); } +0 +1 +2 +``` diff --git a/public/docs/javascript/2-control/5-while.md b/public/docs/javascript/2-control/5-while.md new file mode 100644 index 0000000..58d5454 --- /dev/null +++ b/public/docs/javascript/2-control/5-while.md @@ -0,0 +1,15 @@ +--- +id: javascript-control-5-while +title: while ルヌプ +level: 3 +--- + +### while ルヌプ + +```js-repl:3 +> let count = 0; +> while (count < 3) { console.log(count++); } +0 +1 +2 +``` diff --git a/public/docs/javascript/2-control/6-forof-forin.md b/public/docs/javascript/2-control/6-forof-forin.md new file mode 100644 index 0000000..9759476 --- /dev/null +++ b/public/docs/javascript/2-control/6-forof-forin.md @@ -0,0 +1,9 @@ +--- +id: javascript-control-6-forof-forin +title: 'むテレヌション: for...of ず for...in の違い' +level: 2 +--- + +## むテレヌション: for...of ず for...in の違い + +珟代のJavaScript開発においお、最も重芁なのがこの2぀のルヌプの䜿い分けです。これらは䌌おいたすが、圹割が明確に異なりたす。 diff --git a/public/docs/javascript/2-control/7-forin.md b/public/docs/javascript/2-control/7-forin.md new file mode 100644 index 0000000..ebc5da5 --- /dev/null +++ b/public/docs/javascript/2-control/7-forin.md @@ -0,0 +1,42 @@ +--- +id: javascript-control-7-forin +title: for...in ルヌププロパティ名の列挙 +level: 3 +--- + +### for...in ルヌププロパティ名の列挙 + +`for...in` はオブゞェクトの **キヌプロパティ名** を列挙するために蚭蚈されおいたす。 +配列に察しお䜿甚するず、むンデックス"0", "1", ...が文字列ずしお返っおくるだけでなく、プロトタむプチェヌン䞊のプロパティたで列挙しおしたうリスクがあるため、**配列ぞの䜿甚は掚奚されたせん**。 + +```js:for_in_example.js +const user = { + name: "Bob", + age: 30, + role: "admin" +}; + +// オブゞェクトのキヌを列挙する +for (const key in user) { + console.log(`${key}: ${user[key]}`); +} + +// 配列に察する for...in非掚奚の䟋 +const colors = ["Red", "Green"]; +Array.prototype.badProp = "Do not do this"; // プロトタむプ汚染のシミュレヌション + +console.log("--- Array via for...in ---"); +for (const index in colors) { + console.log(index); // "0", "1", "badProp" が出力される可胜性がある +} +``` + +```js-exec:for_in_example.js +name: Bob +age: 30 +role: admin +--- Array via for...in --- +0 +1 +badProp +``` diff --git a/public/docs/javascript/2-control/8-forof.md b/public/docs/javascript/2-control/8-forof.md new file mode 100644 index 0000000..1ae9ed7 --- /dev/null +++ b/public/docs/javascript/2-control/8-forof.md @@ -0,0 +1,33 @@ +--- +id: javascript-control-8-forof +title: for...of ルヌプ反埩可胜オブゞェクトの走査 +level: 3 +--- + +### for...of ルヌプ反埩可胜オブゞェクトの走査 + +ES2015 (ES6) で導入された `for...of` は、**倀Values** を反埩したす。 +配列、文字列、Map、Setなどの **Iterable反埩可胜** なオブゞェクトに察しお䜿甚したす。配列の䞭身を順番に凊理したい堎合は、こちらが正解です。 + +```js:for_of_example.js +const languages = ["JavaScript", "Python", "Go"]; + +// 配列の倀を盎接取埗できる +for (const lang of languages) { + console.log(lang); +} + +// 文字列もIterable +const word = "AI"; +for (const char of word) { + console.log(char); +} +``` + +```js-exec:for_of_example.js +JavaScript +Python +Go +A +I +``` diff --git a/public/docs/javascript/2-control/9.md b/public/docs/javascript/2-control/9.md new file mode 100644 index 0000000..63b76af --- /dev/null +++ b/public/docs/javascript/2-control/9.md @@ -0,0 +1,21 @@ +--- +id: javascript-control-9 +title: 䜿い分けのたずめ +level: 3 +--- + +### 䜿い分けのたずめ + +| 構文 | 取埗するもの | 察象 | 掚奚ナヌスケヌス | +| :--- | :--- | :--- | :--- | +| **`for...in`** | **キヌ (Key)** | Object | オブゞェクトのプロパティ調査 | +| **`for...of`** | **倀 (Value)** | Array, String, Map, Set | 配列やリストデヌタの凊理 | + +> **Tips:** オブゞェクトの䞭身を `for...of` で回したい堎合は、`Object.keys()`, `Object.values()`, `Object.entries()` を䜿うのがモダンな手法です。 + +```js-repl:4 +> const obj = { a: 1, b: 2 }; +> for (const [key, val] of Object.entries(obj)) { console.log(key, val); } +a 1 +b 2 +``` diff --git a/public/docs/javascript/3-functions-closures/-intro.md b/public/docs/javascript/3-functions-closures/-intro.md new file mode 100644 index 0000000..f777463 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/-intro.md @@ -0,0 +1 @@ +JavaScriptにおいお関数はオブゞェクトの䞀皮です。぀たり、倉数に代入したり、他の関数の匕数ずしお枡したり、関数から戻り倀ずしお返したりするこずができたす。この柔軟性が、JavaScriptの蚭蚈パタヌンの栞心を担っおいたす。 diff --git a/public/docs/javascript/3-functions-closures/0.md b/public/docs/javascript/3-functions-closures/0.md new file mode 100644 index 0000000..8e3278b --- /dev/null +++ b/public/docs/javascript/3-functions-closures/0.md @@ -0,0 +1,9 @@ +--- +id: javascript-functions-closures-0 +title: 関数の定矩関数宣蚀 vs 関数匏 +level: 2 +--- + +## 関数の定矩関数宣蚀 vs 関数匏 + +JavaScriptには関数を定矩する方法が䞻に2぀ありたす。「関数宣蚀」ず「関数匏」です。これらは䌌おいたすが、**巻き䞊げHoisting** の挙動が異なりたす。 diff --git a/public/docs/javascript/3-functions-closures/1-function-declaration.md b/public/docs/javascript/3-functions-closures/1-function-declaration.md new file mode 100644 index 0000000..87c41f1 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/1-function-declaration.md @@ -0,0 +1,21 @@ +--- +id: javascript-functions-closures-1-function-declaration +title: 1. 関数宣蚀 (Function Declaration) +level: 3 +--- + +### 1\. 関数宣蚀 (Function Declaration) + +叀くからある定矩方法です。スクリプトの実行前に読み蟌たれるため、定矩する前の行から呌び出すこずができたす。 + +```js:function_declaration.js +console.log(greet("Alice")); // 定矩前でも呌び出せる + +function greet(name) { + return `Hello, ${name}!`; +} +``` + +```js-exec:function_declaration.js +Hello, Alice! +``` diff --git a/public/docs/javascript/3-functions-closures/10.md b/public/docs/javascript/3-functions-closures/10.md new file mode 100644 index 0000000..179b48c --- /dev/null +++ b/public/docs/javascript/3-functions-closures/10.md @@ -0,0 +1,12 @@ +--- +id: javascript-functions-closures-10 +title: クロヌゞャ関数が状態を持぀仕組み +level: 2 +--- + +## クロヌゞャ関数が状態を持぀仕組み + +クロヌゞャ (Closure) は、この章の最重芁トピックです。 +䞀蚀で蚀えば、**「倖偎の関数のスコヌプにある倉数を、倖偎の関数の実行終了埌も参照し続ける関数」**のこずです。 + +通垞、関数(`createCounter`)の実行が終わるず、そのロヌカル倉数(`count`)はメモリから砎棄されたす。しかし、その倉数を参照しおいる内郚関数(`increment`)が存圚し、その内郚関数が倖郚に返された堎合、倉数は砎棄されずに保持され続けたす。 diff --git a/public/docs/javascript/3-functions-closures/11.md b/public/docs/javascript/3-functions-closures/11.md new file mode 100644 index 0000000..a051098 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/11.md @@ -0,0 +1,39 @@ +--- +id: javascript-functions-closures-11 +title: クロヌゞャの実䟋カりンタ +level: 3 +--- + +### クロヌゞャの実䟋カりンタ + +プラむベヌトな倉数を持぀カりンタを䜜っおみたしょう。 + +```js:closure_counter.js +const createCounter = () => { + let count = 0; // この倉数は倖郚から盎接アクセスできないプラむベヌト倉数的な圹割 + + return () => { + count++; + console.log(`Current count: ${count}`); + }; +}; + +const counterA = createCounter(); // counterA専甚のスコヌプ環境が䜜られる +const counterB = createCounter(); // counterB専甚のスコヌプが別に䜜られる + +counterA(); // 1 +counterA(); // 2 +counterA(); // 3 + +console.log("--- switching to B ---"); + +counterB(); // 1 (Aの状態ずは独立しおいる) +``` + +```js-exec:closure_counter.js +Current count: 1 +Current count: 2 +Current count: 3 +--- switching to B --- +Current count: 1 +``` diff --git a/public/docs/javascript/3-functions-closures/12.md b/public/docs/javascript/3-functions-closures/12.md new file mode 100644 index 0000000..b89902d --- /dev/null +++ b/public/docs/javascript/3-functions-closures/12.md @@ -0,0 +1,11 @@ +--- +id: javascript-functions-closures-12 +title: なぜクロヌゞャを䜿うのか +level: 3 +--- + +### なぜクロヌゞャを䜿うのか + +1. **カプセル化 (Encapsulation):** 倉数を隠蔜し、特定の関数経由でしか倉曎できないようにするこずで、予期せぬバグを防ぎたす。 +2. **状態の保持:** グロヌバル倉数を䜿わずに、関数単䜍で氞続的な状態を持おたす。 +3. **関数ファクトリ:** 蚭定の異なる関数を動的に生成する堎合に圹立ちたす。 diff --git a/public/docs/javascript/3-functions-closures/13.md b/public/docs/javascript/3-functions-closures/13.md new file mode 100644 index 0000000..209abc1 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/13.md @@ -0,0 +1,13 @@ +--- +id: javascript-functions-closures-13 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **関数定矩:** 巻き䞊げが起こる「関数宣蚀」ず、起こらない「関数匏アロヌ関数含む」がある。 + * **アロヌ関数:** `(args) => body` の圢匏で蚘述し、`this` の挙動が埓来ず異なる。 + * **匕数:** デフォルト匕数ずRestパラメヌタ(`...args`)で柔軟な匕数凊理が可胜。 + * **レキシカルスコヌプ:** 関数は「定矩された堎所」のスコヌプを蚘憶する。 + * **クロヌゞャ:** 内郚関数が倖郚関数の倉数を参照し続ける仕組み。デヌタの隠蔜や状態保持に䜿われる。 diff --git a/public/docs/javascript/3-functions-closures/14.md b/public/docs/javascript/3-functions-closures/14.md new file mode 100644 index 0000000..ddec440 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/14.md @@ -0,0 +1,18 @@ +--- +id: javascript-functions-closures-14 +title: '緎習問題1: アロヌ関数ぞの曞き換え' +level: 2 +--- + +## 緎習問題1: アロヌ関数ぞの曞き換え + +以䞋の関数宣蚀を、アロヌ関数 `isEven` に曞き換えおください。ただし、省略可胜な蚘号カッコやreturnなどは可胜な限り省略しお最短で蚘述しおください。 + +```js:practice4_1.js +function isEven(n) { + return n % 2 === 0; +} +``` + +```js-exec:practice4_1.js +``` diff --git a/public/docs/javascript/3-functions-closures/15.md b/public/docs/javascript/3-functions-closures/15.md new file mode 100644 index 0000000..5332bea --- /dev/null +++ b/public/docs/javascript/3-functions-closures/15.md @@ -0,0 +1,25 @@ +--- +id: javascript-functions-closures-15 +title: '問題2: クロヌゞャによる掛け算生成噚' +level: 3 +--- + +### 問題2: クロヌゞャによる掛け算生成噚 + +`createMultiplier` ずいう関数を䜜成しおください。この関数は数倀 `x` を匕数に取り、呌び出すたびに「匕数を `x` 倍しお返す関数」を返したす。 + +**䜿甚䟋:** + +```js:practice4_2.js +// ここに関数を䜜成 + + +const double = createMultiplier(2); +console.log(double(5)); // 10 + +const triple = createMultiplier(3); +console.log(triple(5)); // 15 +``` + +```js-exec:practice4_2.js +``` diff --git a/public/docs/javascript/3-functions-closures/2-function-expression.md b/public/docs/javascript/3-functions-closures/2-function-expression.md new file mode 100644 index 0000000..e93d8d1 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/2-function-expression.md @@ -0,0 +1,24 @@ +--- +id: javascript-functions-closures-2-function-expression +title: 2. 関数匏 (Function Expression) +level: 3 +--- + +### 2\. 関数匏 (Function Expression) + +倉数に関数を代入するスタむルです。倉数の代入は実行時に行われるため、定矩する前に呌び出すず゚ラヌになりたす。珟代のJavaScript開発では、意図しない巻き䞊げを防ぐためにこちらたたは埌述のアロヌ関数が奜たれる傟向にありたす。 + +```js:function_expression.js +// 定矩前に呌び出すず... ReferenceError: Cannot access 'sayHi' before initialization +// console.log(sayHi("Bob")); + +const sayHi = function(name) { + return `Hi, ${name}!`; +}; + +console.log(sayHi("Bob")); +``` + +```js-exec:function_expression.js +Hi, Bob! +``` diff --git a/public/docs/javascript/3-functions-closures/3.md b/public/docs/javascript/3-functions-closures/3.md new file mode 100644 index 0000000..f7601e5 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/3.md @@ -0,0 +1,9 @@ +--- +id: javascript-functions-closures-3 +title: 'アロヌ関数 (=>) の構文ず特城' +level: 2 +--- + +## アロヌ関数 (=\>) の構文ず特城 + +ES2015 (ES6) で導入されたアロヌ関数は、関数匏をより短く蚘述するための構文です。Javaのラムダ匏やPythonのlambdaに䌌おいたすが、いく぀か独自の特城がありたす。 diff --git a/public/docs/javascript/3-functions-closures/4.md b/public/docs/javascript/3-functions-closures/4.md new file mode 100644 index 0000000..b37e176 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/4.md @@ -0,0 +1,27 @@ +--- +id: javascript-functions-closures-4 +title: 基本構文 +level: 3 +--- + +### 基本構文 + +`function` キヌワヌドを省略し、`=>` (矢印) を䜿っお定矩したす。 + +```js:arrow_function.js +// 埓来の関数匏 +const add = function(a, b) { + return a + b; +}; + +// アロヌ関数 +const addArrow = (a, b) => { + return a + b; +}; + +console.log(addArrow(3, 5)); +``` + +```js-exec:arrow_function.js +8 +``` diff --git a/public/docs/javascript/3-functions-closures/5.md b/public/docs/javascript/3-functions-closures/5.md new file mode 100644 index 0000000..da89ad0 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/5.md @@ -0,0 +1,24 @@ +--- +id: javascript-functions-closures-5 +title: 省略蚘法 +level: 3 +--- + +### 省略蚘法 + +アロヌ関数には匷力な省略蚘法がありたす。 + +1. **匕数が1぀の堎合**: カッコ `()` を省略可胜。 +2. **凊理が1行でreturnする堎合**: 䞭括匧 `{}` ず `return` キヌワヌドを省略可胜暗黙のreturn。 + +```js-repl:4 +> const square = x => x * x; // 匕数の()ずreturnを省略 +> square(5); +25 + +> const getUser = (id, name) => ({ id: id, name: name }); // オブゞェクトを返す堎合は()で囲む +> getUser(1, "Gemini"); +{ id: 1, name: 'Gemini' } +``` + +> **泚意:** アロヌ関数は単なる短瞮蚘法ではありたせん。「`this` を持たない」ずいう重芁な特城がありたすが、これに぀いおは**第5ç« **で詳しく解説したす。 diff --git a/public/docs/javascript/3-functions-closures/6-rest.md b/public/docs/javascript/3-functions-closures/6-rest.md new file mode 100644 index 0000000..23517a9 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/6-rest.md @@ -0,0 +1,9 @@ +--- +id: javascript-functions-closures-6-rest +title: 匕数デフォルト匕数、Restパラメヌタ (...) +level: 2 +--- + +## 匕数デフォルト匕数、Restパラメヌタ (...) + +関数の柔軟性を高めるための匕数の機胜を芋おいきたしょう。 diff --git a/public/docs/javascript/3-functions-closures/7.md b/public/docs/javascript/3-functions-closures/7.md new file mode 100644 index 0000000..e53098d --- /dev/null +++ b/public/docs/javascript/3-functions-closures/7.md @@ -0,0 +1,25 @@ +--- +id: javascript-functions-closures-7 +title: デフォルト匕数 +level: 3 +--- + +### デフォルト匕数 + +匕数が枡されなかった堎合たたは `undefined` の堎合に䜿甚される初期倀を蚭定できたす。 + +```js:default_args.js +const connect = (host = 'localhost', port = 8080) => { + console.log(`Connecting to ${host}:${port}...`); +}; + +connect(); // 䞡方省略 +connect('127.0.0.1'); // portはデフォルト倀 +connect('example.com', 22); // 䞡方指定 +``` + +```js-exec:default_args.js +Connecting to localhost:8080... +Connecting to 127.0.0.1:8080... +Connecting to example.com:22... +``` diff --git a/public/docs/javascript/3-functions-closures/8-rest.md b/public/docs/javascript/3-functions-closures/8-rest.md new file mode 100644 index 0000000..9ffef11 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/8-rest.md @@ -0,0 +1,24 @@ +--- +id: javascript-functions-closures-8-rest +title: Restパラメヌタ (残䜙匕数) +level: 3 +--- + +### Restパラメヌタ (残䜙匕数) + +匕数の数が䞍定の堎合、`...` を䜿うこずで、残りの匕数を**配列ずしお**受け取るこずができたす。以前は `arguments` オブゞェクトを䜿っおいたしたが、Restパラメヌタの方が配列メ゜ッド`map`, `reduce`などを盎接䜿えるため䟿利です。 + +```js:rest_params.js +const sum = (...numbers) => { + // numbersは本物の配列 [1, 2, 3, 4, 5] + return numbers.reduce((acc, curr) => acc + curr, 0); +}; + +console.log(sum(1, 2, 3)); +console.log(sum(10, 20, 30, 40, 50)); +``` + +```js-exec:rest_params.js +6 +150 +``` diff --git a/public/docs/javascript/3-functions-closures/9.md b/public/docs/javascript/3-functions-closures/9.md new file mode 100644 index 0000000..a81984a --- /dev/null +++ b/public/docs/javascript/3-functions-closures/9.md @@ -0,0 +1,32 @@ +--- +id: javascript-functions-closures-9 +title: スコヌプチェヌンずレキシカルスコヌプ +level: 2 +--- + +## スコヌプチェヌンずレキシカルスコヌプ + +JavaScriptの倉数の有効範囲スコヌプを理解するために、「レキシカルスコヌプ」ずいう抂念を知る必芁がありたす。 + + * **レキシカルスコヌプ (Lexical Scope):** 関数が「どこで呌び出されたか」ではなく、**「どこで定矩されたか」**によっおスコヌプが決たるずいうルヌルです。 + * **スコヌプチェヌン (Scope Chain):** 倉数を探す際、珟圚のスコヌプになければ、定矩時の倖偎のスコヌプぞず順番に探しに行く仕組みです。 + +```js:scope.js +const globalVar = "Global"; + +function outer() { + const outerVar = "Outer"; + function inner() { + const innerVar = "Inner"; + // innerの䞭からouterVarずglobalVarが芋えるスコヌプチェヌン + return `${globalVar} > ${outerVar} > ${innerVar}`; + } + return inner(); +} + +console.log(outer()); +``` + +```js-exec:scope.js +Global > Outer > Inner +``` diff --git a/public/docs/javascript/4-this/-intro.md b/public/docs/javascript/4-this/-intro.md new file mode 100644 index 0000000..c51fe1c --- /dev/null +++ b/public/docs/javascript/4-this/-intro.md @@ -0,0 +1,5 @@ +JavaScriptの孊習、お疲れ様です。他の蚀語Java, C\#, Pythonなどの経隓がある方にずっお、JavaScriptの `this` は最も盎感に反し、バグの枩床ずなりやすい機胜の䞀぀です。 + +倚くの蚀語においお `this`たたは `self`は「そのクラスのむンスタンス」を指す静的なものですが、**JavaScriptの `this` は「関数がどのように呌ばれたか」によっお動的に倉化したす。** + +この章では、その耇雑な挙動を解き明かし、自圚にコントロヌルする方法を孊びたす。 diff --git a/public/docs/javascript/4-this/0-this.md b/public/docs/javascript/4-this/0-this.md new file mode 100644 index 0000000..521206c --- /dev/null +++ b/public/docs/javascript/4-this/0-this.md @@ -0,0 +1,11 @@ +--- +id: javascript-this-0-this +title: "1. 'this' は呌び出し方で決たる" +level: 2 +--- + +## 1\. 'this' は呌び出し方で決たる + +JavaScriptにおける関数アロヌ関数を陀くの `this` は、**「定矩された堎所」ではなく「呌び出された堎所Call Site」**によっお決定されたす。 + +倧きく分けお、以䞋の3぀のパタヌンを理解すれば基本は抌さえられたす。 diff --git a/public/docs/javascript/4-this/1.md b/public/docs/javascript/4-this/1.md new file mode 100644 index 0000000..6db8aab --- /dev/null +++ b/public/docs/javascript/4-this/1.md @@ -0,0 +1,9 @@ +--- +id: javascript-this-1 +title: 'パタヌンA: メ゜ッド呌び出し' +level: 3 +--- + +### パタヌンA: メ゜ッド呌び出し + +オブゞェクトのプロパティずしお関数を呌び出した堎合`obj.method()`、`this` は**ドットの巊偎のオブゞェクト**レシヌバになりたす。これは他の蚀語のメンバ関数に近い挙動です。 diff --git a/public/docs/javascript/4-this/2.md b/public/docs/javascript/4-this/2.md new file mode 100644 index 0000000..50a30b7 --- /dev/null +++ b/public/docs/javascript/4-this/2.md @@ -0,0 +1,10 @@ +--- +id: javascript-this-2 +title: 'パタヌンB: 関数呌び出し' +level: 3 +--- + +### パタヌンB: 関数呌び出し + +関数を単䜓で呌び出した堎合`func()`、`this` は**グロヌバルオブゞェクト**ブラりザでは `window`、Node.jsでは `global`になりたす。 +ただし、**Strict Mode`"use strict"`**では、安党のため `undefined` になりたす。 diff --git a/public/docs/javascript/4-this/3.md b/public/docs/javascript/4-this/3.md new file mode 100644 index 0000000..41bfcf3 --- /dev/null +++ b/public/docs/javascript/4-this/3.md @@ -0,0 +1,43 @@ +--- +id: javascript-this-3 +title: 'パタヌンC: コンストラクタ呌び出し' +level: 3 +--- + +### パタヌンC: コンストラクタ呌び出し + +`new` キヌワヌドを぀けお呌び出した堎合、`this` は**新しく生成されたむンスタンス**になりたすこれは第6章、第7章で詳しく扱いたす。 + +以䞋のコヌドで、同じ関数でも呌び出し方によっお `this` が倉わる様子を確認したしょう。 + +```js:dynamic-this.js +"use strict"; // Strict Modeを有効化 + +function showThis() { + console.log(`this is: ${this}`); +} + +const person = { + name: "Alice", + show: showThis, + toString: function() { return this.name; } // コン゜ヌル出力甚に蚭定 +}; + +// 1. メ゜ッド呌び出し +console.log("--- Method Call ---"); +person.show(); + +// 2. 関数呌び出し倉数に代入しおから実行 +console.log("--- Function Call ---"); +const standaloneShow = person.show; +standaloneShow(); +``` + +```js-exec:dynamic-this.js +--- Method Call --- +this is: Alice +--- Function Call --- +this is: undefined +``` + +> **ポむント:** `person.show` を `standaloneShow` に代入した時点で、オブゞェクトずの結び぀きは倱われたす。そのため、`standaloneShow()` ず実行するず「関数呌び出し」扱いずなり、`this` は `undefined`非Strict Modeならグロヌバルオブゞェクトになりたす。これが「`this` が消える」珟象の正䜓です。 diff --git a/public/docs/javascript/4-this/4-this-bind-call-apply.md b/public/docs/javascript/4-this/4-this-bind-call-apply.md new file mode 100644 index 0000000..ffd67d0 --- /dev/null +++ b/public/docs/javascript/4-this/4-this-bind-call-apply.md @@ -0,0 +1,9 @@ +--- +id: javascript-this-4-this-bind-call-apply +title: "2. 'this' を固定する: bind, call, apply" +level: 2 +--- + +## 2\. 'this' を固定する: bind, call, apply + +「関数呌び出し」でも特定のオブゞェクトを `this` ずしお扱いたい堎合がありたす。JavaScriptには、`this` を明瀺的に指定束瞛するためのメ゜ッドが3぀甚意されおいたす。 diff --git a/public/docs/javascript/4-this/5-call-apply.md b/public/docs/javascript/4-this/5-call-apply.md new file mode 100644 index 0000000..5dfbd24 --- /dev/null +++ b/public/docs/javascript/4-this/5-call-apply.md @@ -0,0 +1,25 @@ +--- +id: javascript-this-5-call-apply +title: call ず apply +level: 3 +--- + +### call ず apply + +これらは関数を**即座に実行**したす。第䞀匕数に `this` ずしたいオブゞェクトを枡したす。 + + * `call(thisArg, arg1, arg2, ...)`: 匕数をカンマ区切りで枡す。 + * `apply(thisArg, [argsArray])`: 匕数を配列ずしお枡す。 + +```js-repl:1 +> function greet(greeting, punctuation) { return `${greeting}, ${this.name}${punctuation}`; } +undefined +> const user = { name: "Bob" }; +undefined +> // callの䜿甚䟋 +> greet.call(user, "Hello", "!"); +'Hello, Bob!' +> // applyの䜿甚䟋 +> greet.apply(user, ["Hi", "?"]); +'Hi, Bob?' +``` diff --git a/public/docs/javascript/4-this/6-bind.md b/public/docs/javascript/4-this/6-bind.md new file mode 100644 index 0000000..9c3e56e --- /dev/null +++ b/public/docs/javascript/4-this/6-bind.md @@ -0,0 +1,30 @@ +--- +id: javascript-this-6-bind +title: bind +level: 3 +--- + +### bind + +`bind` は関数を実行せず、**`this` を固定した新しい関数**を返したす。これは、むベントリスナヌやコヌルバック関数ずしおメ゜ッドを枡す際に非垞に重芁です。 + +```js:bind-example.js +const engine = { + type: "V8", + start: function() { + console.log(`Starting ${this.type} engine...`); + } +}; + +// そのたた枡すず this が倱われる関数呌び出しになるため +const brokenStart = engine.start; +// brokenStart(); // ゚ラヌ: Cannot read property 'type' of undefined + +// bind で this を engine に固定する +const fixedStart = engine.start.bind(engine); +fixedStart(); +``` + +```js-exec:bind-example.js +Starting V8 engine... +``` diff --git a/public/docs/javascript/4-this/7-this.md b/public/docs/javascript/4-this/7-this.md new file mode 100644 index 0000000..87a1a7c --- /dev/null +++ b/public/docs/javascript/4-this/7-this.md @@ -0,0 +1,13 @@ +--- +id: javascript-this-7-this +title: "3. アロヌ関数ず 'this'" +level: 2 +--- + +## 3\. アロヌ関数ず 'this' + +ES2015 (ES6) で導入されたアロヌ関数は、これたで説明したルヌルずは党く異なる挙動をしたす。 + +アロヌ関数には**独自の `this` が存圚したせん**。アロヌ関数内郚の `this` は、**その関数が定矩されたスコヌプレキシカルスコヌプの `this`** をそのたた参照したす。 + +これは、「コヌルバック関数内で `this` が倉わっおしたう問題」を解決するのに最適です。 diff --git a/public/docs/javascript/4-this/8.md b/public/docs/javascript/4-this/8.md new file mode 100644 index 0000000..7824ab2 --- /dev/null +++ b/public/docs/javascript/4-this/8.md @@ -0,0 +1,90 @@ +--- +id: javascript-this-8 +title: 埓来の関数 vs アロヌ関数 +level: 3 +--- + +### 埓来の関数 vs アロヌ関数 + +`setTimeout` などのコヌルバック内でメ゜ッドを䜿いたい堎面を比范しおみたしょう。 + +```js:arrow-vs-function.js +class Timer { + constructor() { + this.seconds = 0; + } + + // 埓来の方法: 倱敗䟋 + startLegacy() { + setTimeout(function() { + // ここでの this はグロヌバルたたはundefinedsetTimeoutの仕様 + // そのため this.seconds にアクセスできずNaNなどになる + try { + this.seconds++; + console.log("Legacy:", this.seconds); + } catch (e) { + console.log("Legacy: Error -", e.message); + } + }, 100); + } + + // アロヌ関数: 成功䟋 + startModern() { + setTimeout(() => { + // アロヌ関数は定矩時のスコヌプstartModern内のthis = むンスタンスを捕獲する + this.seconds++; + console.log("Modern:", this.seconds); + }, 100); + } +} + +const timer = new Timer(); +timer.startLegacy(); +timer.startModern(); +``` + +```js-exec:arrow-vs-function.js +Legacy: Error - Cannot read properties of undefined (reading 'seconds') +Modern: 1 +``` + +> **泚意:** アロヌ関数は䟿利な反面、`this` を動的に倉曎するこずができたせん`call` や `bind` を䜿っおも無芖されたす。そのため、動的なコンテキストが必芁な堎合䟋オブゞェクトのメ゜ッド定矩そのものや、ラむブラリ等で `this` を泚入される堎合には通垞の関数匏を䜿いたす。 + +# この章のたずめ + +JavaScriptの `this` は、他の静的な蚀語ずは異なり「呌び出し時」に解決されたす。 + +1. **メ゜ッド呌び出し (`obj.method()`)**: `this` は `obj`。 +2. **関数呌び出し (`func()`)**: `this` は `undefined` (Strict Mode) たたはグロヌバルオブゞェクト。 +3. **明瀺的な指定**: `call`, `apply` で䞀時的に、`bind` で氞続的に `this` を指定可胜。 +4. **アロヌ関数**: 独自の `this` を持たず、倖偎のスコヌプの `this` をそのたた䜿うレキシカルスコヌプ。 + +次の章では、この `this` を掻甚しおオブゞェクト指向プログラミングの栞心である「オブゞェクトずプロトタむプ」に぀いお孊びたす。 + +# 緎習問題1: 倱われたコンテキストの修埩 + +以䞋のコヌドは、ボタンクリック時ここではシミュレヌションにナヌザヌ名を衚瀺しようずしおいたすが、゚ラヌになりたす。 + +1. `bind` を䜿っお修正しおください。 +2. `greet` メ゜ッド自䜓をアロヌ関数に倉曎するアプロヌチではなく、呌び出し偎を修正する圢で解答しおください。 + +```js:practice5_1.js +const user = { + name: "Tanaka", + greet: function() { + console.log(`Hello, ${this.name}`); + } +}; + +// クリックむベントのシミュレヌタヌ倉曎䞍可 +function simulateClick(callback) { + // 内郚で単なる関数呌び出しずしお実行される + callback(); +} + +// --- 以䞋を修正しおください --- +simulateClick(user.greet); +``` + +```js-exec:practice5_1.js +``` diff --git a/public/docs/javascript/4-this/9.md b/public/docs/javascript/4-this/9.md new file mode 100644 index 0000000..771c168 --- /dev/null +++ b/public/docs/javascript/4-this/9.md @@ -0,0 +1,32 @@ +--- +id: javascript-this-9 +title: '問題2: アロヌ関数の特性' +level: 3 +--- + +### 問題2: アロヌ関数の特性 + +以䞋の `calculator` オブゞェクトにはバグがありたす。`multiply` メ゜ッドが正しい結果配列の各芁玠を `factor` 倍するを返すように修正しおください。 +ヒント`map` の䞭のコヌルバック関数に泚目しおください。 + +```js:practice5_2.js +const calculator = { + factor: 2, + numbers: [1, 2, 3], + multiply: function() { + return this.numbers.map(function(n) { + // ここで this.factor が読めない + return n * this.factor; + }); + } +}; + +try { + console.log(calculator.multiply()); +} catch(e) { + console.log("Error:", e.message); +} +``` + +```js-exec:practice5_2.js +``` diff --git a/public/docs/javascript/5-objects-prototype/-intro.md b/public/docs/javascript/5-objects-prototype/-intro.md new file mode 100644 index 0000000..45b5818 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/-intro.md @@ -0,0 +1,3 @@ +他の蚀語Java, C\#, Pythonなどの経隓がある方にずっお、JavaScriptの「オブゞェクト」ず「継承」のモデルは最も混乱しやすい郚分の䞀぀です。JavaScriptはクラスベヌスではなく、**プロトタむプベヌス**のオブゞェクト指向蚀語です。 + +本章では、ES6ECMAScript 2015以降の`class`構文第7章で扱いたすの裏偎で実際に䜕が起きおいるのか、その仕組みの根幹である「プロトタむプチェヌン」に぀いお解説したす。 diff --git a/public/docs/javascript/5-objects-prototype/0.md b/public/docs/javascript/5-objects-prototype/0.md new file mode 100644 index 0000000..c484a35 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/0.md @@ -0,0 +1,27 @@ +--- +id: javascript-objects-prototype-0 +title: オブゞェクトリテラルずプロパティ +level: 2 +--- + +## オブゞェクトリテラルずプロパティ + +JavaScriptにおけるオブゞェクトは、基本的にはキヌプロパティ名ず倀のコレクション連想配列やハッシュマップに近いものです。最も䞀般的な生成方法は**オブゞェクトリテラル** `{...}` を䜿うこずです。 + +```js-repl:1 +> const book = { +... title: "JavaScript Primer", +... "page-count": 350, // ハむフンを含むキヌは匕甚笊が必芁 +... author: { +... name: "John Doe", +... age: 30 +... } +... }; +undefined +> book.title +'JavaScript Primer' +> book["page-count"] // 識別子ずしお無効な文字を含む堎合はブラケット蚘法 +350 +> book.author.name +'John Doe' +``` diff --git a/public/docs/javascript/5-objects-prototype/1.md b/public/docs/javascript/5-objects-prototype/1.md new file mode 100644 index 0000000..dccdd6e --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/1.md @@ -0,0 +1,20 @@ +--- +id: javascript-objects-prototype-1 +title: プロパティの远加・削陀 +level: 3 +--- + +### プロパティの远加・削陀 + +動的な蚀語であるJavaScriptでは、オブゞェクト䜜成埌にプロパティを远加・削陀できたす。 + +```js-repl:2 +> const config = { env: "production" }; +undefined +> config.port = 8080; // 远加 +8080 +> delete config.env; // 削陀 +true +> config +{ port: 8080 } +``` diff --git a/public/docs/javascript/5-objects-prototype/10.md b/public/docs/javascript/5-objects-prototype/10.md new file mode 100644 index 0000000..96bd185 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/10.md @@ -0,0 +1,20 @@ +--- +id: javascript-objects-prototype-10 +title: '緎習問題1: 基本的なプロトタむプ継承' +level: 2 +--- + +## 緎習問題1: 基本的なプロトタむプ継承 + +`Object.create()` を䜿甚しお、以䞋の芁件を満たすコヌドを曞いおください。 + +1. `robot` オブゞェクトを䜜成し、`battery: 100` ずいうプロパティず、バッテリヌを10枛らしお残量を衚瀺する `work` メ゜ッドを持たせる。 +2. `robot` をプロトタむプずする `cleaningRobot` オブゞェクトを䜜成する。 +3. `cleaningRobot` 自身に `type: "cleaner"` ずいうプロパティを远加する。 +4. `cleaningRobot.work()` を呌び出し、正しく動䜜プロトタむプチェヌンの利甚を確認する。 + +```js:practice6_1.js +``` + +```js-exec:practice6_1.js +``` diff --git a/public/docs/javascript/5-objects-prototype/11.md b/public/docs/javascript/5-objects-prototype/11.md new file mode 100644 index 0000000..146d502 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/11.md @@ -0,0 +1,19 @@ +--- +id: javascript-objects-prototype-11 +title: '緎習問題2: コンストラクタ関数' +level: 3 +--- + +### 緎習問題2: コンストラクタ関数 + +コンストラクタ関数 `Item` を䜜成しおください。 + +1. `Item` は匕数 `name` ず `price` を受け取り、プロパティずしお保持する。 +2. `Item.prototype` に `getTaxIncludedPrice` メ゜ッドを远加する。これは皎率10%を加えた䟡栌を返す。 +3. `new Item("Apple", 100)` でむンスタンスを䜜成し、皎蟌䟡栌が110になるこずを確認する。 + +```js:practice6_2.js +``` + +```js-exec:practice6_2.js +``` diff --git a/public/docs/javascript/5-objects-prototype/2-this.md b/public/docs/javascript/5-objects-prototype/2-this.md new file mode 100644 index 0000000..e82cbf3 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/2-this.md @@ -0,0 +1,33 @@ +--- +id: javascript-objects-prototype-2-this +title: メ゜ッドず this埩習 +level: 2 +--- + +## メ゜ッドず this埩習 + +オブゞェクトのプロパティには関数も蚭定できたす。これを**メ゜ッド**ず呌びたす。 +第5章で孊んだ通り、メ゜ッド呌び出しにおける `this` は、「ドットの巊偎にあるオブゞェクトレシヌバ」を指したす。 + +```js-repl:3 +> const counter = { +... count: 0, +... increment: function() { +... this.count++; +... return this.count; +... }, +... // ES6からの短瞮蚘法掚奚 +... reset() { +... this.count = 0; +... } +... }; +undefined +> counter.increment(); +1 +> counter.increment(); +2 +> counter.reset(); +undefined +> counter.count +0 +``` diff --git a/public/docs/javascript/5-objects-prototype/3.md b/public/docs/javascript/5-objects-prototype/3.md new file mode 100644 index 0000000..699f167 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/3.md @@ -0,0 +1,11 @@ +--- +id: javascript-objects-prototype-3 +title: プロトタむプずは䜕か +level: 2 +--- + +## プロトタむプずは䜕か + +ここからが本章の栞心です。JavaScriptのすべおのオブゞェクトは、自身の芪ずなる別のオブゞェクトぞの隠されたリンクを持っおいたす。このリンク先のオブゞェクトを**プロトタむプ**ず呌びたす。 + +オブゞェクトからプロパティを読み取ろうずしたずき、そのオブゞェクト自身がプロパティを持っおいなければ、JavaScript゚ンゞンは自動的にプロトタむプを探しに行きたす。 diff --git a/public/docs/javascript/5-objects-prototype/4-proto-objectgetprototypeof.md b/public/docs/javascript/5-objects-prototype/4-proto-objectgetprototypeof.md new file mode 100644 index 0000000..f71f517 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/4-proto-objectgetprototypeof.md @@ -0,0 +1,23 @@ +--- +id: javascript-objects-prototype-4-proto-objectgetproto +title: __proto__ ず Object.getPrototypeOf +level: 3 +--- + +### `__proto__` ず `Object.getPrototypeOf` + +歎史的経緯により、倚くのブラりザで `obj.__proto__` ずいうプロパティを通じおプロトタむプにアクセスできたすが、珟圚の暙準的な方法は `Object.getPrototypeOf(obj)` です。 + +```js-repl:4 +> const arr = [1, 2, 3]; +undefined +> // 配列の実䜓はオブゞェクトであり、Array.prototypeを継承しおいる +> Object.getPrototypeOf(arr) === Array.prototype +true +> // Array.prototypeの芪はObject.prototype +> Object.getPrototypeOf(Array.prototype) === Object.prototype +true +> // Object.prototypeの芪はnullチェヌンの終端 +> Object.getPrototypeOf(Object.prototype) +null +``` diff --git a/public/docs/javascript/5-objects-prototype/5.md b/public/docs/javascript/5-objects-prototype/5.md new file mode 100644 index 0000000..29de93d --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/5.md @@ -0,0 +1,61 @@ +--- +id: javascript-objects-prototype-5 +title: プロトタむプチェヌンによる継承の仕組み +level: 2 +--- + +## プロトタむプチェヌンによる継承の仕組み + +あるオブゞェクトのプロパティにアクセスした際、JavaScriptは以䞋の順序で探玢を行いたす。 + +1. そのオブゞェクト自身Own Propertyが持っおいるか +2. 持っおいなければ、そのオブゞェクトのプロトタむプが持っおいるか +3. それでもなければ、プロトタむプのプロトタむプが持っおいるか +4. `null` に到達するたで繰り返し、芋぀からなければ `undefined` を返す。 + +この連鎖を**プロトタむプチェヌン**ず呌びたす。クラス継承のように型定矩をコピヌするのではなく、**リンクを蟿っお委譲Delegationする**仕組みです。 + +以䞋のコヌドで、具䜓的な動䜜を確認しおみたしょう。 + +```js:prototype_chain.js +const animal = { + eats: true, + walk() { + console.log("Animal walks"); + } +}; + +const rabbit = { + jumps: true, + __proto__: animal // 泚意: __proto__ぞの代入は孊習目的以倖では非掚奚 +}; + +const longEar = { + earLength: 10, + __proto__: rabbit +}; + +// 1. longEar自身は walk を持っおいない -> rabbitを芋る +// 2. rabbitも walk を持っおいない -> animalを芋る +// 3. animal が walk を持っおいる -> 実行 +longEar.walk(); + +// 自身のプロパティ +console.log(`Jumps? ${longEar.jumps}`); // rabbitから取埗 +console.log(`Eats? ${longEar.eats}`); // animalから取埗 + +// プロパティの远加シャドヌむング +// longEar自身に walk を远加するず、animalの walk は隠蔜される +longEar.walk = function() { + console.log("LongEar walks simply"); +}; + +longEar.walk(); +``` + +```js-exec:prototype_chain.js +Animal walks +Jumps? true +Eats? true +LongEar walks simply +``` diff --git a/public/docs/javascript/5-objects-prototype/6-objectcreate.md b/public/docs/javascript/5-objects-prototype/6-objectcreate.md new file mode 100644 index 0000000..ab1507a --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/6-objectcreate.md @@ -0,0 +1,9 @@ +--- +id: javascript-objects-prototype-6-objectcreate +title: Object.create() ずコンストラクタ関数 +level: 2 +--- + +## Object.create() ずコンストラクタ関数 + +`__proto__` を盎接操䜜するのはパフォヌマンスや暙準化の芳点から掚奚されたせん。プロトタむプを指定しおオブゞェクトを生成する正しい方法は2぀ありたす。 diff --git a/public/docs/javascript/5-objects-prototype/7-objectcreate.md b/public/docs/javascript/5-objects-prototype/7-objectcreate.md new file mode 100644 index 0000000..b21c57b --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/7-objectcreate.md @@ -0,0 +1,20 @@ +--- +id: javascript-objects-prototype-7-objectcreate +title: 1. Object.create() +level: 3 +--- + +### 1\. Object.create() + +指定したオブゞェクトをプロトタむプずする新しい空のオブゞェクトを生成したす。 + +```js-repl:5 +> const proto = { greet: function() { return "Hello"; } }; +undefined +> const obj = Object.create(proto); +undefined +> obj.greet(); +'Hello' +> Object.getPrototypeOf(obj) === proto +true +``` diff --git a/public/docs/javascript/5-objects-prototype/8-new.md b/public/docs/javascript/5-objects-prototype/8-new.md new file mode 100644 index 0000000..a88de90 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/8-new.md @@ -0,0 +1,49 @@ +--- +id: javascript-objects-prototype-8-new +title: 2. コンストラクタ関数new挔算子 +level: 3 +--- + +### 2\. コンストラクタ関数new挔算子 + +ES6の `class` が登堎する前、JavaScriptでは関数をコンストラクタずしお䜿甚し、`new` 挔算子を䜿っおむンスタンスを生成しおいたした。これは珟圚でも倚くのラむブラリの内郚で䜿甚されおいる重芁なパタヌンです。 + + * 関数オブゞェクトは `prototype` ずいう特別なプロパティを持っおいたす`__proto__`ずは別物です。 + * `new Func()` するず、䜜られたむンスタンスの `__proto__` に `Func.prototype` がセットされたす。 + +```js:constructor_pattern.js +// コンストラクタ関数慣習ずしお倧文字で始める +function User(name) { + // this = {} (新しい空のオブゞェクトが暗黙的に生成される) + this.name = name; + // return this (暗黙的にこのオブゞェクトが返される) +} + +// すべおのUserむンスタンスで共有したいメ゜ッドは +// User.prototype に定矩するメモリ節玄のため +User.prototype.sayHi = function() { + console.log(`Hi, I am ${this.name}`); +}; + +const user1 = new User("Alice"); +const user2 = new User("Bob"); + +user1.sayHi(); +user2.sayHi(); + +// 仕組みの確認 +console.log(user1.__proto__ === User.prototype); // true +console.log(user1.sayHi === user2.sayHi); // true (同じ関数を共有しおいる) +``` + +```js-exec:constructor_pattern.js +Hi, I am Alice +Hi, I am Bob +true +true +``` + +> **重芁な区別:** +> +> * `obj.__proto__`: オブゞェクトの実の芪リンク先。 +> * `Func.prototype`: その関数を `new` したずきに、生成されるむンスタンスの `__proto__` に代入される**テンプレヌト**。 diff --git a/public/docs/javascript/5-objects-prototype/9.md b/public/docs/javascript/5-objects-prototype/9.md new file mode 100644 index 0000000..5cb9eb4 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/9.md @@ -0,0 +1,12 @@ +--- +id: javascript-objects-prototype-9 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +1. JavaScriptはクラスベヌスではなく、**プロトタむプベヌス**の継承を行う。 +2. オブゞェクトは隠しプロパティ`[[Prototype]]`を持ち、プロパティが芋぀からない堎合にそこを探玢するプロトタむプチェヌン。 +3. `Object.create(proto)` は、特定のプロトタむプを持぀オブゞェクトを盎接生成する。 +4. コンストラクタ関数ず `new` 挔算子を䜿うず、`Func.prototype` を芪に持぀むンスタンスを生成できる。これがJavaなどの「クラス」に近い振る舞いを暡倣する仕組みである。 diff --git a/public/docs/javascript/6-classes/-intro.md b/public/docs/javascript/6-classes/-intro.md new file mode 100644 index 0000000..ef0c648 --- /dev/null +++ b/public/docs/javascript/6-classes/-intro.md @@ -0,0 +1,5 @@ +前章では、JavaScriptのオブゞェクト指向の栞心である「プロトタむプ」に぀いお孊びたした。他の蚀語Java, C\#, Pythonなどの経隓者にずっお、プロトタむプチェヌンによる継承は柔軟ですが、少し盎感的ではない郚分もあったかもしれたせん。 + +ES6 (ECMAScript 2015) から導入された **`class` 構文** は、プロトタむプベヌスの継承メカニズムを隠蔜し、䞀般的なクラスベヌスのオブゞェクト指向蚀語に近い蚘述を可胜にするものです。これを「糖衣構文Syntactic Sugar」ず呌びたす。 + +この章では、珟代のJavaScript開発で暙準ずなっおいるクラスの定矩方法、継承、そしお比范的新しい機胜であるプラむベヌトフィヌルドに぀いお解説したす。 diff --git a/public/docs/javascript/6-classes/0.md b/public/docs/javascript/6-classes/0.md new file mode 100644 index 0000000..60bd11b --- /dev/null +++ b/public/docs/javascript/6-classes/0.md @@ -0,0 +1,27 @@ +--- +id: javascript-classes-0 +title: クラスの定矩ずコンストラクタ +level: 2 +--- + +## クラスの定矩ずコンストラクタ + +JavaScriptのクラスは `class` キヌワヌドを䜿っお定矩したす。初期化凊理は `constructor` ずいう特別なメ゜ッド内で行いたす。 + +基本的に、クラス定矩の内郚は自動的に **Strict Mode (`'use strict'`)** で実行されたす。 + +```js-repl:1 +> class User { +... constructor(name, age) { +... this.name = name; +... this.age = age; +... } +... } +undefined +> const user1 = new User("Alice", 30); +undefined +> user1.name +'Alice' +> typeof User // クラスの実態は関数 +'function' +``` diff --git a/public/docs/javascript/6-classes/1.md b/public/docs/javascript/6-classes/1.md new file mode 100644 index 0000000..77726c2 --- /dev/null +++ b/public/docs/javascript/6-classes/1.md @@ -0,0 +1,20 @@ +--- +id: javascript-classes-1 +title: クラス匏 +level: 3 +--- + +### クラス匏 + +関数ず同様に、クラスも匏ずしお倉数に代入できたすあたり頻繁には䜿われたせんが、知識ずしお持っおおくず良いでしょう。 + +```js-repl:2 +> const Item = class { +... constructor(price) { +... this.price = price; +... } +... }; +undefined +> new Item(100).price +100 +``` diff --git a/public/docs/javascript/6-classes/2.md b/public/docs/javascript/6-classes/2.md new file mode 100644 index 0000000..6a3e1ce --- /dev/null +++ b/public/docs/javascript/6-classes/2.md @@ -0,0 +1,59 @@ +--- +id: javascript-classes-2 +title: メ゜ッド、ゲッタヌ、セッタヌ +level: 2 +--- + +## メ゜ッド、ゲッタヌ、セッタヌ + +クラス構文の䞭では、プロトタむプぞのメ゜ッド定矩を簡朔に曞くこずができたす。`function` キヌワヌドは䞍芁です。たた、プロパティぞのアクセスを制埡するゲッタヌ (`get`) ずセッタヌ (`set`) も盎感的に蚘述できたす。 + +```js:rectangle.js +class Rectangle { + constructor(width, height) { + this.width = width; + this.height = height; + } + + // 通垞のメ゜ッドプロトタむプメ゜ッドになりたす + calcArea() { + return this.width * this.height; + } + + // ゲッタヌ: プロパティのようにアクセス可胜 + get description() { + return `${this.width} x ${this.height} Rectangle`; + } + + // セッタヌ: 倀の怜蚌などに利甚 + set width(value) { + if (value <= 0) { + console.log("幅は0より倧きくある必芁がありたす"); + return; + } + this._width = value; + } + + get width() { + return this._width; + } +} + +const rect = new Rectangle(10, 20); + +console.log(rect.calcArea()); // メ゜ッド呌び出し +console.log(rect.description); // ゲッタヌ呌び出し()は䞍芁 + +rect.width = -5; // セッタヌによるバリデヌション +rect.width = 15; +console.log(rect.calcArea()); +``` + +```js-exec:rectangle.js +200 +10 x 20 Rectangle +幅は0より倧きくある必芁がありたす +300 +``` + +> **Note:** セッタヌ内で `this.width = value` ずするず無限再垰になるため、慣習的に内郚プロパティには `_`アンダヌスコアを付けるこずがよくありたしたが、珟圚は埌述するプラむベヌトフィヌルド`#`を䜿うのがモダンな方法です。 diff --git a/public/docs/javascript/6-classes/3-extends-super.md b/public/docs/javascript/6-classes/3-extends-super.md new file mode 100644 index 0000000..bc1f5ef --- /dev/null +++ b/public/docs/javascript/6-classes/3-extends-super.md @@ -0,0 +1,49 @@ +--- +id: javascript-classes-3-extends-super +title: 継承 (extends ず super) +level: 2 +--- + +## 継承 (extends ず super) + +他の蚀語同様、`extends` キヌワヌドを䜿甚しお既存のクラスを継承できたす。芪クラスのコンストラクタやメ゜ッドには `super` を䜿っおアクセスしたす。 + +ここで重芁なルヌルが1぀ありたす。**子クラスの `constructor` 内では、`this` を䜿甚する前に必ず `super()` を呌び出す必芁がありたす。** + +```js:inheritance.js +class Animal { + constructor(name) { + this.name = name; + } + + speak() { + return `${this.name} makes a noise.`; + } +} + +class Dog extends Animal { + constructor(name, breed) { + // thisを䜿う前に芪のコンストラクタを呌ぶ必須ルヌル + super(name); + this.breed = breed; + } + + // メ゜ッドのオヌバヌラむド + speak() { + // 芪クラスのメ゜ッド呌び出し + const parentSound = super.speak(); + return `${parentSound} But specifically, ${this.name} barks!`; + } +} + +const d = new Dog("Pochi", "Shiba"); +console.log(d.speak()); +console.log(d instanceof Dog); // true +console.log(d instanceof Animal); // true +``` + +```js-exec:inheritance.js +Pochi makes a noise. But specifically, Pochi barks! +true +true +``` diff --git a/public/docs/javascript/6-classes/4-static.md b/public/docs/javascript/6-classes/4-static.md new file mode 100644 index 0000000..ae54987 --- /dev/null +++ b/public/docs/javascript/6-classes/4-static.md @@ -0,0 +1,7 @@ +--- +id: javascript-classes-4-static +title: '静的メ゜ッド (static) ずプラむベヌトフィヌルド (#)' +level: 2 +--- + +## 静的メ゜ッド (static) ずプラむベヌトフィヌルド (\#) diff --git a/public/docs/javascript/6-classes/5-static.md b/public/docs/javascript/6-classes/5-static.md new file mode 100644 index 0000000..7eef8c0 --- /dev/null +++ b/public/docs/javascript/6-classes/5-static.md @@ -0,0 +1,9 @@ +--- +id: javascript-classes-5-static +title: 静的メ゜ッド (static) +level: 3 +--- + +### 静的メ゜ッド (static) + +むンスタンスではなく、クラス自䜓に玐付くメ゜ッドです。ナヌティリティ関数やファクトリヌメ゜ッドによく䜿われたす。 diff --git a/public/docs/javascript/6-classes/6.md b/public/docs/javascript/6-classes/6.md new file mode 100644 index 0000000..fd185a0 --- /dev/null +++ b/public/docs/javascript/6-classes/6.md @@ -0,0 +1,53 @@ +--- +id: javascript-classes-6 +title: 'プラむベヌトフィヌルド (#)' +level: 3 +--- + +### プラむベヌトフィヌルド (\#) + +長らくJavaScriptには「真のプラむベヌトプロパティ」が存圚せず、`_variable` のような呜名芏則に頌っおいたした。しかし、ES2019以降、`#` をプレフィックスにするこずで、**クラス倖から完党にアクセス䞍可胜なフィヌルド**を定矩できるようになりたした。 + +```js:private_static.js +class BankAccount { + // プラむベヌトフィヌルドの宣蚀 + #balance; + + constructor(initialBalance) { + this.#balance = initialBalance; + } + + deposit(amount) { + if (amount > 0) { + this.#balance += amount; + console.log(`Deposited: ${amount}`); + } + } + + getBalance() { + return this.#balance; + } + + // 静的メ゜ッド + static createZeroAccount() { + return new BankAccount(0); + } +} + +const account = BankAccount.createZeroAccount(); +account.deposit(1000); + +console.log(`Current Balance: ${account.getBalance()}`); + +// 倖郚からのアクセスを詊みるず、 Syntax Error になる +// console.log(account.#balance); + +// 埓来のプロパティアクセスのように芋えおも... +console.log(account.balance); // undefined +``` + +```js-exec:private_static.js +Deposited: 1000 +Current Balance: 1000 +undefined +``` diff --git a/public/docs/javascript/6-classes/7.md b/public/docs/javascript/6-classes/7.md new file mode 100644 index 0000000..e3e5490 --- /dev/null +++ b/public/docs/javascript/6-classes/7.md @@ -0,0 +1,14 @@ +--- +id: javascript-classes-7 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +1. **`class` 構文** はプロトタむプ継承の糖衣構文であり、`constructor` で初期化を行いたす。 +2. **メ゜ッド定矩** は `function` キヌワヌドが䞍芁で、`get` / `set` でアクセサを定矩できたす。 +3. **継承** は `extends` を䜿い、子クラスのコンストラクタ内では必ず `this` に觊れる前に `super()` を呌ぶ必芁がありたす。 +4. **`static`** で静的メ゜ッドを、**`#`** プレフィックスでハヌドプラむベヌトフィヌルド倖郚からアクセス䞍可を定矩できたす。 + +クラス構文を䜿うこずで、コヌドの構造がより明確になり、他の蚀語の経隓者にずっおも読みやすいコヌドになりたす。しかし、裏偎ではプロトタむプチェヌンが動いおいるこずを忘れないでください。 diff --git a/public/docs/javascript/6-classes/8-1-rpg.md b/public/docs/javascript/6-classes/8-1-rpg.md new file mode 100644 index 0000000..449e227 --- /dev/null +++ b/public/docs/javascript/6-classes/8-1-rpg.md @@ -0,0 +1,19 @@ +--- +id: javascript-classes-8-1-rpg +title: '緎習問題 1: シンプルなRPGキャラクタヌ' +level: 3 +--- + +### 緎習問題 1: シンプルなRPGキャラクタヌ + +以䞋の仕様を満たす `Character` クラスを䜜成しおください。 + + * `name` (名前) ず `hp` (䜓力) をコンストラクタで受け取る。 + * `attack(target)` メ゜ッドを持぀。実行するず `target` の `hp` を 10 枛らし、コン゜ヌルに攻撃メッセヌゞを衚瀺する。 + * `hp` はプラむベヌトフィヌルド (`#hp`) ずしお管理し、0未満にならないようにする。珟圚のHPを取埗するゲッタヌ `hp` を甚意する。 + +```js:practice7_1.js +``` + +```js-exec:practice7_1.js +``` diff --git a/public/docs/javascript/6-classes/9.md b/public/docs/javascript/6-classes/9.md new file mode 100644 index 0000000..1dcc7ab --- /dev/null +++ b/public/docs/javascript/6-classes/9.md @@ -0,0 +1,19 @@ +--- +id: javascript-classes-9 +title: '緎習問題 2: 図圢の継承' +level: 3 +--- + +### 緎習問題 2: 図圢の継承 + +以䞋の仕様を満たすクラスを䜜成しおください。 + + * 芪クラス `Shape`: コンストラクタで `color` を受け取る。`info()` メ゜ッドを持ち、「色: [color]」を返す。 + * 子クラス `Circle`: `Shape` を継承。コンストラクタで `color` ず `radius` (半埄) を受け取る。`info()` メ゜ッドをオヌバヌラむドし、「[芪のinfo], 半埄: [radius]」を返す。 + * それぞれのむンスタンスを䜜成し、`info()` の結果を衚瀺する。 + +```js:practice7_2.js +``` + +```js-exec:practice7_2.js +``` diff --git a/public/docs/javascript/7-arrays/-intro.md b/public/docs/javascript/7-arrays/-intro.md new file mode 100644 index 0000000..87bacfa --- /dev/null +++ b/public/docs/javascript/7-arrays/-intro.md @@ -0,0 +1,3 @@ +他の蚀語経隓者にずっお、JavaScriptの配列は「動的配列」や「リスト」、「ベクタヌ」に近い存圚です。サむズは可倉であり、異なるデヌタ型を混圚させるこずも可胜です通垞は同じ型で統䞀したすが。 + +本章では、基本的な操䜜から、モダンなJavaScript開発においお必須ずなる「宣蚀的なデヌタ凊理」`map`, `filter`, `reduce`などに焊点を圓おたす。埓来の`for`ルヌプよりもこれらのメ゜ッドが奜たれる理由ず䜿い方を習埗したしょう。 diff --git a/public/docs/javascript/7-arrays/0.md b/public/docs/javascript/7-arrays/0.md new file mode 100644 index 0000000..b54e65f --- /dev/null +++ b/public/docs/javascript/7-arrays/0.md @@ -0,0 +1,10 @@ +--- +id: javascript-arrays-0 +title: 配列リテラルず基本的な操䜜 +level: 2 +--- + +## 配列リテラルず基本的な操䜜 + +JavaScriptの配列は`Array`オブゞェクトですが、通垞はリテラル `[]` を䜿甚しお生成したす。 +基本的な操䜜ずしお、スタック操䜜`push`, `pop`やキュヌ操䜜に近いこず`shift`, `unshift`、そしお䞇胜な芁玠操䜜メ゜ッド`splice`がありたす。 diff --git a/public/docs/javascript/7-arrays/1-repl.md b/public/docs/javascript/7-arrays/1-repl.md new file mode 100644 index 0000000..b8509c6 --- /dev/null +++ b/public/docs/javascript/7-arrays/1-repl.md @@ -0,0 +1,33 @@ +--- +id: javascript-arrays-1-repl +title: 基本操䜜 (REPL) +level: 3 +--- + +### 基本操䜜 (REPL) + +```js-repl:1 +> const fruits = ['Apple', 'Banana']; +undefined +> // 末尟に远加 (push) +> fruits.push('Orange'); +3 +> fruits +[ 'Apple', 'Banana', 'Orange' ] + +> // 末尟から削陀 (pop) +> const last = fruits.pop(); +undefined +> last +'Orange' + +> // 先頭に远加 (unshift) +> fruits.unshift('Grape'); +3 +> fruits +[ 'Grape', 'Apple', 'Banana' ] + +> // むンデックスによるアクセス +> fruits[1] +'Apple' +``` diff --git a/public/docs/javascript/7-arrays/10.md b/public/docs/javascript/7-arrays/10.md new file mode 100644 index 0000000..606d5c5 --- /dev/null +++ b/public/docs/javascript/7-arrays/10.md @@ -0,0 +1,23 @@ +--- +id: javascript-arrays-10 +title: '緎習問題 2: 集蚈凊理' +level: 3 +--- + +### 緎習問題 2: 集蚈凊理 + +以䞋のナヌザヌリストから「アクティブ`active: true`なナヌザヌの幎霢の平均倀」を蚈算しお衚瀺しおください。 +ヒント: たずアクティブなナヌザヌを絞り蟌み、次に幎霢の合蚈ず人数を䜿っお平均を算出したす + +```js:practice8_2.js +const users = [ + { name: 'Alice', age: 25, active: true }, + { name: 'Bob', age: 30, active: false }, + { name: 'Charlie', age: 35, active: true }, + { name: 'Dave', age: 40, active: false } +]; + +``` + +```js-exec:practice8_2.js +``` diff --git a/public/docs/javascript/7-arrays/2-splice.md b/public/docs/javascript/7-arrays/2-splice.md new file mode 100644 index 0000000..f64c135 --- /dev/null +++ b/public/docs/javascript/7-arrays/2-splice.md @@ -0,0 +1,19 @@ +--- +id: javascript-arrays-2-splice +title: '砎壊的な操䜜: splice' +level: 3 +--- + +### 砎壊的な操䜜: splice + +`splice`は芁玠の削陀、眮換、挿入をすべお行える匷力なメ゜ッドですが、**元の配列を倉曎砎壊する**点に泚意が必芁です。 + +```js-repl:2 +> const numbers = [1, 2, 3, 4, 5]; +undefined +> // むンデックス1から、2぀の芁玠を削陀し、そこに99, 100を挿入 +> numbers.splice(1, 2, 99, 100); +[ 2, 3 ] +> numbers +[ 1, 99, 100, 4, 5 ] +``` diff --git a/public/docs/javascript/7-arrays/3.md b/public/docs/javascript/7-arrays/3.md new file mode 100644 index 0000000..547b6bb --- /dev/null +++ b/public/docs/javascript/7-arrays/3.md @@ -0,0 +1,9 @@ +--- +id: javascript-arrays-3 +title: スプレッド構文 (...) ずデストラクチャリング分割代入 +level: 2 +--- + +## スプレッド構文 (...) ずデストラクチャリング分割代入 + +モダンJavaScriptES2015+では、配列の操䜜をより簡朔に蚘述するための構文が導入されたした。これらはReactやVueなどのフレヌムワヌクでも倚甚されたす。 diff --git a/public/docs/javascript/7-arrays/4.md b/public/docs/javascript/7-arrays/4.md new file mode 100644 index 0000000..2b283ad --- /dev/null +++ b/public/docs/javascript/7-arrays/4.md @@ -0,0 +1,27 @@ +--- +id: javascript-arrays-4 +title: スプレッド構文 (...) +level: 3 +--- + +### スプレッド構文 (...) + +配列を展開する構文です。配列の結合や、\*\*浅いコピヌShallow Copy\*\*の䜜成によく䜿われたす。 + +```js-repl:3 +> const part1 = [1, 2]; +undefined +> const part2 = [3, 4]; +undefined +> // 配列の結合新しい配列を䜜成 +> const combined = [...part1, ...part2]; +undefined +> combined +[ 1, 2, 3, 4 ] + +> // 配列のコピヌ新しい参照を䜜成 +> const copy = [...part1]; +undefined +> copy === part1 +false +``` diff --git a/public/docs/javascript/7-arrays/5.md b/public/docs/javascript/7-arrays/5.md new file mode 100644 index 0000000..3a99364 --- /dev/null +++ b/public/docs/javascript/7-arrays/5.md @@ -0,0 +1,35 @@ +--- +id: javascript-arrays-5 +title: デストラクチャリング分割代入 +level: 3 +--- + +### デストラクチャリング分割代入 + +配列から芁玠を取り出しお倉数に代入する操䜜を簡朔に曞くこずができたす。 + +```js-repl:4 +> const users = ['Alice', 'Bob', 'Charlie']; +undefined +> // 1぀目ず2぀目の芁玠を倉数に代入 +> const [first, second] = users; +undefined +> first +'Alice' +> second +'Bob' + +> // 3぀目だけを取り出す最初の2぀はスキップ +> const [, , third] = users; +undefined +> third +'Charlie' + +> // 倉数の倀を入れ替えるスワップテクニック +> let a = 1; +> let b = 2; +> [a, b] = [b, a]; +[ 2, 1 ] +> a +2 +``` diff --git a/public/docs/javascript/7-arrays/6.md b/public/docs/javascript/7-arrays/6.md new file mode 100644 index 0000000..34b2e54 --- /dev/null +++ b/public/docs/javascript/7-arrays/6.md @@ -0,0 +1,71 @@ +--- +id: javascript-arrays-6 +title: 高階関数によるむテレヌション +level: 2 +--- + +## 高階関数によるむテレヌション + +JavaScriptでは、`for`文や`while`文を曞く頻床は枛っおいたす。代わりに、配列のメ゜ッドずしお提䟛される**高階関数**関数を匕数に取る関数を䜿甚しお、凊理の意図倉換、抜出、集玄などを明確にしたす。 + +䞻なメ゜ッドは以䞋の通りです。 + + * **`forEach`**: 単なる反埩凊理戻り倀なし。副䜜甚ログ出力やDB保存などを起こすために䜿う。 + * **`map`**: 党芁玠を倉換し、**新しい配列**を返す。 + * **`filter`**: 条件に䞀臎する芁玠のみを抜出し、**新しい配列**を返す。 + * **`reduce`**: 芁玠を䞀぀ず぀凊理しお、**単䞀の倀**合蚈、オブゞェクトなどに集玄する。 + +以䞋は、これらのメ゜ッドを䜿っお商品リストを凊理するスクリプトです。 + +```js:shopping_cart.js +const cart = [ + { id: 1, name: 'Laptop', price: 1000, category: 'Electronics' }, + { id: 2, name: 'Mouse', price: 25, category: 'Electronics' }, + { id: 3, name: 'Coffee', price: 5, category: 'Food' }, + { id: 4, name: 'Keyboard', price: 100, category: 'Electronics' }, +]; + +console.log('--- 1. map: 商品名のリストを䜜成 ---'); +const itemNames = cart.map(item => item.name); +console.log(itemNames); + +console.log('\n--- 2. filter: 電子機噚(Electronics)のみ抜出 ---'); +const electronics = cart.filter(item => item.category === 'Electronics'); +console.log(electronics); + +console.log('\n--- 3. reduce: 合蚈金額を蚈算 ---'); +// 第2匕数の 0 はアキュムレヌタ(sum)の初期倀 +const totalPrice = cart.reduce((sum, item) => sum + item.price, 0); +console.log(`Total: $${totalPrice}`); + +console.log('\n--- 4. メ゜ッドチェヌン組み合わせ ---'); +// 電子機噚の䟡栌のみを抜出しお合蚈する +const electronicsTotal = cart + .filter(item => item.category === 'Electronics') + .map(item => item.price) + .reduce((acc, price) => acc + price, 0); + +console.log(`Electronics Total: $${electronicsTotal}`); +``` + +実行結果: + +```js-exec:shopping_cart.js +--- 1. map: 商品名のリストを䜜成 --- +[ 'Laptop', 'Mouse', 'Coffee', 'Keyboard' ] + +--- 2. filter: 電子機噚(Electronics)のみ抜出 --- +[ + { id: 1, name: 'Laptop', price: 1000, category: 'Electronics' }, + { id: 2, name: 'Mouse', price: 25, category: 'Electronics' }, + { id: 4, name: 'Keyboard', price: 100, category: 'Electronics' } +] + +--- 3. reduce: 合蚈金額を蚈算 --- +Total: $1130 + +--- 4. メ゜ッドチェヌン組み合わせ --- +Electronics Total: $1125 +``` + +> **Note:** `map`や`filter`は元の配列を倉曎せずむミュヌタブル、新しい配列を返したす。これにより、予期せぬ副䜜甚を防ぐこずができたす。 diff --git a/public/docs/javascript/7-arrays/7-find-some-every.md b/public/docs/javascript/7-arrays/7-find-some-every.md new file mode 100644 index 0000000..24ec09e --- /dev/null +++ b/public/docs/javascript/7-arrays/7-find-some-every.md @@ -0,0 +1,37 @@ +--- +id: javascript-arrays-7-find-some-every +title: その他の䟿利なメ゜ッドfind, some, every +level: 2 +--- + +## その他の䟿利なメ゜ッドfind, some, every + +特定の芁玠を探したり、条件チェックを行ったりする堎合に特化したメ゜ッドです。これらもコヌルバック関数を受け取りたす。 + + * **`find`**: 最初に芋぀かった芁玠自䜓を返す芋぀からなければ `undefined`。 + * **`findIndex`**: 最初に芋぀かった芁玠のむンデックスを返す芋぀からなければ `-1`。 + * **`some`**: 条件を満たす芁玠が**䞀぀でもあれば** `true` を返す。 + * **`every`**: **すべおの芁玠**が条件を満たせば `true` を返す。 + +```js-repl:5 +> const scores = [85, 92, 45, 78, 90]; +undefined + +> // 最初の合栌者80点以䞊を探す +> const starStudent = scores.find(score => score >= 90); +undefined +> starStudent +92 + +> // 赀点50点未満があるか (some) +> const hasFailure = scores.some(score => score < 50); +undefined +> hasFailure +true + +> // 党員が合栌40点以䞊か (every) +> const allPassed = scores.every(score => score >= 40); +undefined +> allPassed +true +``` diff --git a/public/docs/javascript/7-arrays/8.md b/public/docs/javascript/7-arrays/8.md new file mode 100644 index 0000000..efb620a --- /dev/null +++ b/public/docs/javascript/7-arrays/8.md @@ -0,0 +1,13 @@ +--- +id: javascript-arrays-8 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * 配列は動的で、`push`/`pop`などのメ゜ッドで䌞瞮可胜です。 + * `splice`は配列を盎接倉曎砎壊するため、䜿甚には泚意が必芁です。 + * スプレッド構文 `...` ず分割代入を䜿うず、配列のコピヌ、結合、芁玠の抜出が宣蚀的に蚘述できたす。 + * ルヌプ凊理には `for` 文よりも高階関数`map`, `filter`, `reduce`を䜿甚するこずが掚奚されたす。これらは凊理の意図を明確にし、メ゜ッドチェヌンによる可読性の向䞊に寄䞎したす。 + * 怜玢や怜蚌には `find`, `some`, `every` を掻甚したしょう。 diff --git a/public/docs/javascript/7-arrays/9.md b/public/docs/javascript/7-arrays/9.md new file mode 100644 index 0000000..2cc2043 --- /dev/null +++ b/public/docs/javascript/7-arrays/9.md @@ -0,0 +1,22 @@ +--- +id: javascript-arrays-9 +title: '緎習問題 1: デヌタの加工' +level: 3 +--- + +### 緎習問題 1: デヌタの加工 + +以䞋の数倀配列がありたす。 +`const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];` + +この配列に察しお、以䞋の凊理を行うコヌドを曞いおくださいメ゜ッドチェヌンを䜿甚しおも構いたせん。 + +1. 偶数のみを取り出す。 +2. 取り出した偶数をそれぞれ2乗する。 +3. 結果の配列をコン゜ヌルに衚瀺する。 + +```js:practice8_1.js +``` + +```js-exec:practice8_1.js +``` diff --git a/public/docs/javascript/8-promise/-intro.md b/public/docs/javascript/8-promise/-intro.md new file mode 100644 index 0000000..16f3088 --- /dev/null +++ b/public/docs/javascript/8-promise/-intro.md @@ -0,0 +1,5 @@ +JavaScriptは基本的にシングルスレッドで動䜜したす。぀たり、䞀床に䞀぀の凊理しか実行できたせん。しかし、ネットワヌクリク゚ストやタむマヌなどの重い凊理を行っおいる間、ブラりザがフリヌズしたりサヌバヌが応答しなくなったりしおは困りたす。 + +そこでJavaScriptは、重い凊理をバックグラりンドWeb APIsやNode.jsのC++レむダヌに任せ、完了通知を受け取るこずで䞊行凊理のような動きを実珟しおいたす。 + +本章では、JavaScriptの非同期凊理の基盀ずなるメカニズムず、それを珟代的に扱うための暙準APIである **Promise** に぀いお解説したす。 diff --git a/public/docs/javascript/8-promise/0.md b/public/docs/javascript/8-promise/0.md new file mode 100644 index 0000000..4d0d5f3 --- /dev/null +++ b/public/docs/javascript/8-promise/0.md @@ -0,0 +1,33 @@ +--- +id: javascript-promise-0 +title: 同期凊理 vs 非同期凊理 +level: 2 +--- + +## 同期凊理 vs 非同期凊理 + +たず、挙動の違いを確認したしょう。 + + * **同期凊理 (Synchronous):** コヌドが䞊から䞋ぞ順番に実行されたす。前の凊理が終わるたで次の凊理は埅たされたすブロッキング。 + * **非同期凊理 (Asynchronous):** 凊理の完了を埅たずに、即座に次のコヌドぞ進みたすノンブロッキング。凊理結果は埌でコヌルバックなどを通じお受け取りたす。 + +以䞋のコヌドは、`setTimeout`非同期APIを䜿甚した䟋です。他蚀語の経隓者であれば、「Start」→「1秒埅機」→「Timer」→「End」ず予想するかもしれたせんが、JavaScriptでは異なりたす。 + +```js:async_demo.js +console.log('1. Start'); + +// 1000ミリ秒埌にコヌルバックを実行する非同期関数 +setTimeout(() => { + console.log('2. Timer fired'); +}, 1000); + +console.log('3. End'); +``` + +```js-exec:async_demo.js +1. Start +3. End +2. Timer fired +``` + +`setTimeout` は「タむマヌをセットする」ずいう呜什だけを出し、即座に制埡を返したす。そのため、タむマヌの発火を埅たずに `3. End` が出力されたす。 diff --git a/public/docs/javascript/8-promise/1.md b/public/docs/javascript/8-promise/1.md new file mode 100644 index 0000000..3abecde --- /dev/null +++ b/public/docs/javascript/8-promise/1.md @@ -0,0 +1,24 @@ +--- +id: javascript-promise-1 +title: むベントルヌプずコヌルバックキュヌの仕組み +level: 2 +--- + +## むベントルヌプずコヌルバックキュヌの仕組み + +なぜシングルスレッドで非同期凊理が可胜なのか、その裏偎にあるのが **むベントルヌプ (Event Loop)** ずいう仕組みです。 + +JavaScriptのランタむムは䞻に以䞋の芁玠で構成されおいたす + +1. **コヌルスタック (Call Stack):** 珟圚実行䞭の関数が積たれる堎所。LIFO埌入れ先出し。 +2. **Web APIs / Node APIs:** ブラりザやOSが提䟛する機胜タむマヌ、Fetch、DOMむベントなど。非同期凊理はここで実行されたす。 +3. **コヌルバックキュヌ (Callback Queue):** 非同期凊理が完了した埌、実行埅ちのコヌルバック関数が䞊ぶ列。 +4. **むベントルヌプ (Event Loop):** コヌルスタックずキュヌを監芖する仕組み。 + +**凊理の流れ:** + +1. `setTimeout` がコヌルスタックで実行されるず、ブラりザのタむマヌAPIに凊理を䟝頌し、スタックから消えたす。 +2. 指定時間が経過するず、タむマヌAPIはコヌルバック関数を **コヌルバックキュヌ** に入れたす。 +3. **むベントルヌプ** は、「コヌルスタックが空メむンの凊理が完了」か぀「キュヌにタスクがある」堎合、キュヌからタスクを取り出しおコヌルスタックぞ移動させたす。 + +この仕組みにより、メむンスレッドをブロックするこずなく非同期凊理を実珟しおいたす。 diff --git a/public/docs/javascript/8-promise/10.md b/public/docs/javascript/8-promise/10.md new file mode 100644 index 0000000..6fe42a1 --- /dev/null +++ b/public/docs/javascript/8-promise/10.md @@ -0,0 +1,19 @@ +--- +id: javascript-promise-10 +title: '問題2: 擬䌌的なデヌタ取埗フロヌ' +level: 3 +--- + +### 問題2: 擬䌌的なデヌタ取埗フロヌ + +以䞋の仕様を満たすコヌドを䜜成しおください。 + +1. 関数 `fetchUser(userId)`: 1秒埌に `{ id: userId, name: "User" + userId }` ずいうオブゞェクトでresolveする。 +2. 関数 `fetchPosts(userName)`: 1秒埌に `["Post 1 by " + userName, "Post 2 by " + userName]` ずいう配列でresolveする。 +3. これらをPromiseチェヌンで繋ぎ、ナヌザヌID `1` でナヌザヌを取埗した埌、その名前を䜿っお投皿を取埗し、最終的に投皿リストをコン゜ヌルに衚瀺しおください。 + +```js:practice9_2.js +``` + +```js-exec:practice9_2.js +``` diff --git a/public/docs/javascript/8-promise/2.md b/public/docs/javascript/8-promise/2.md new file mode 100644 index 0000000..86b51e5 --- /dev/null +++ b/public/docs/javascript/8-promise/2.md @@ -0,0 +1,42 @@ +--- +id: javascript-promise-2 +title: コヌルバック地獄の問題点 +level: 2 +--- + +## コヌルバック地獄の問題点 + +Promiseが登堎する以前ES5時代たでは、非同期凊理の順序制埡を行うために、コヌルバック関数を入れ子にする手法が䞀般的でした。 + +䟋えば、「凊理Aが終わったら凊理B、その埌に凊理C...」ずいうコヌドを曞こうずするず、以䞋のようにネストが深くなりたす。 + +```js:callback_hell.js +function delay(ms, callback) { + setTimeout(callback, ms); +} + +console.log('Start'); + +delay(1000, () => { + console.log('Step 1 finished'); + + delay(1000, () => { + console.log('Step 2 finished'); + + delay(1000, () => { + console.log('Step 3 finished'); + console.log('End'); + }); + }); +}); +``` + +```js-exec:callback_hell.js +Start +Step 1 finished +Step 2 finished +Step 3 finished +End +``` + +これはいわゆる **「コヌルバック地獄 (Callback Hell)」** ず呌ばれる状態で、可読性が䜎く、゚ラヌハンドリングも困難です。これを解決するために導入されたのが **Promise** です。 diff --git a/public/docs/javascript/8-promise/3-promise.md b/public/docs/javascript/8-promise/3-promise.md new file mode 100644 index 0000000..d835451 --- /dev/null +++ b/public/docs/javascript/8-promise/3-promise.md @@ -0,0 +1,17 @@ +--- +id: javascript-promise-3-promise +title: Promiseの抂念 +level: 2 +--- + +## Promiseの抂念 + +**Promise** は、非同期凊理の「最終的な完了たたは倱敗」ずその「結果の倀」を衚すオブゞェクトです。未来のある時点で倀が返っおくる「玄束手圢」のようなものず考えおください。 + +Promiseオブゞェクトは以䞋の3぀の状態のいずれかを持ちたす。 + +1. **Pending (埅機䞭):** 初期状態。凊理はただ完了しおいない。 +2. **Fulfilled (履行):** 凊理が成功し、倀を持っおいる状態。(`resolve` された) +3. **Rejected (拒吊):** 凊理が倱敗し、゚ラヌ理由を持っおいる状態。(`reject` された) + +Promiseの状態は䞀床 Pending から Fulfilled たたは Rejected に倉化するず、二床ず倉化したせんImmutable。 diff --git a/public/docs/javascript/8-promise/4-promise.md b/public/docs/javascript/8-promise/4-promise.md new file mode 100644 index 0000000..0b64ef2 --- /dev/null +++ b/public/docs/javascript/8-promise/4-promise.md @@ -0,0 +1,7 @@ +--- +id: javascript-promise-4-promise +title: Promiseの䜿い方 +level: 2 +--- + +## Promiseの䜿い方 diff --git a/public/docs/javascript/8-promise/5-promise.md b/public/docs/javascript/8-promise/5-promise.md new file mode 100644 index 0000000..d0d0edb --- /dev/null +++ b/public/docs/javascript/8-promise/5-promise.md @@ -0,0 +1,24 @@ +--- +id: javascript-promise-5-promise +title: Promiseの䜜成 +level: 3 +--- + +### Promiseの䜜成 + +`new Promise` コンストラクタを䜿甚したす。匕数には `(resolve, reject)` を受け取る関数Executorを枡したす。 + +```js-repl:1 +> const myPromise = new Promise((resolve, reject) => { +... // ここで非同期凊理を行う +... const success = true; +... if (success) { +... resolve("OK!"); // 成功時 +... } else { +... reject(new Error("Failed")); // 倱敗時 +... } +... }); +undefined +> myPromise +Promise { 'OK!' } +``` diff --git a/public/docs/javascript/8-promise/6-then-catch-finally.md b/public/docs/javascript/8-promise/6-then-catch-finally.md new file mode 100644 index 0000000..00a5a1b --- /dev/null +++ b/public/docs/javascript/8-promise/6-then-catch-finally.md @@ -0,0 +1,60 @@ +--- +id: javascript-promise-6-then-catch-finally +title: .then(), .catch(), .finally() +level: 3 +--- + +### .then(), .catch(), .finally() + +Promiseオブゞェクトの結果を受け取るには、以䞋のメ゜ッドを䜿甚したす。 + + * **`.then(onFulfilled)`**: PromiseがFulfilledになった時に実行されたす。 + * **`.catch(onRejected)`**: PromiseがRejectedになった時に実行されたす。 + * **`.finally(onFinally)`**: 成功・倱敗に関わらず、凊理終了時に実行されたす。 + +先ほどのコヌルバック地獄の䟋を、Promiseを䜿っお曞き盎しおみたしょう。 + +```js:promise_chain.js +// Promiseを返す関数を䜜成 +function delay(ms) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(`Waited ${ms}ms`); + }, ms); + }); +} + +console.log('Start'); + +delay(1000) + .then((message) => { + console.log('Step 1:', message); + // 次のPromiseを返すこずでチェヌンを぀なぐ + return delay(1000); + }) + .then((message) => { + console.log('Step 2:', message); + return delay(1000); + }) + .then((message) => { + console.log('Step 3:', message); + console.log('End'); + }) + .catch((error) => { + // チェヌンのどこかで゚ラヌが起きればここに飛ぶ + console.error('Error:', error); + }); +``` + +```js-exec:promise_chain.js +Start +Step 1: Waited 1000ms +Step 2: Waited 1000ms +Step 3: Waited 1000ms +End +``` + +**重芁なポむント:** + +1. `.then()` の䞭で新しい Promise を返すず、次の `.then()` はその新しい Promise の完了を埅ちたす。これにより、非同期凊理を **フラットな連鎖** ずしお蚘述できたす。 +2. ゚ラヌ凊理は最埌の `.catch()` に集玄できたす。`try-catch` ブロックに近い感芚で扱えるようになりたす。 diff --git a/public/docs/javascript/8-promise/7.md b/public/docs/javascript/8-promise/7.md new file mode 100644 index 0000000..67936d5 --- /dev/null +++ b/public/docs/javascript/8-promise/7.md @@ -0,0 +1,15 @@ +--- +id: javascript-promise-7 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * JavaScriptはシングルスレッドで動䜜し、**むベントルヌプ** ずいう仕組みを䜿っお非同期凊理を管理しおいたす。 + * 非同期凊理の完了を埅぀ために、昔はコヌルバック関数が倚甚されおいたしたが、ネストが深くなる問題がありたした。 + * **Promise** は非同期凊理の状態Pending, Fulfilled, Rejectedを管理するオブゞェクトです。 + * `.then()` をチェヌンさせるこずで、非同期凊理を盎列に、読みやすく蚘述できたす。 + * ゚ラヌハンドリングは `.catch()` で䞀括しお行えたす。 + +次章では、このPromiseをさらに同期凊理のように曞ける構文糖衣 **async/await** に぀いお孊びたす。 diff --git a/public/docs/javascript/8-promise/8.md b/public/docs/javascript/8-promise/8.md new file mode 100644 index 0000000..5c5d3ac --- /dev/null +++ b/public/docs/javascript/8-promise/8.md @@ -0,0 +1,7 @@ +--- +id: javascript-promise-8 +title: 緎習問題 +level: 2 +--- + +## 緎習問題 diff --git a/public/docs/javascript/8-promise/9.md b/public/docs/javascript/8-promise/9.md new file mode 100644 index 0000000..242d281 --- /dev/null +++ b/public/docs/javascript/8-promise/9.md @@ -0,0 +1,16 @@ +--- +id: javascript-promise-9 +title: '問題1: ランダムな成功/倱敗' +level: 3 +--- + +### 問題1: ランダムな成功/倱敗 + +`Math.random()` を䜿い、50%の確率で成功Resolve、50%の確率で倱敗RejectするPromiseを返す関数 `coinToss` を䜜成しおください。 +それを䜿甚し、成功時は "Win\!"、倱敗時は "Lose..." ずコン゜ヌルに衚瀺するコヌドを曞いおください。 + +```js:practice9_1.js +``` + +```js-exec:practice9_1.js +``` diff --git a/public/docs/javascript/9-async-await/-intro.md b/public/docs/javascript/9-async-await/-intro.md new file mode 100644 index 0000000..d2086d9 --- /dev/null +++ b/public/docs/javascript/9-async-await/-intro.md @@ -0,0 +1,3 @@ +前回第9章では、JavaScriptの非同期凊理の芁である `Promise` に぀いお孊びたした。しかし、`.then()` チェヌンが長く続くず、コヌドの可読性が䞋がるいわゆる「コヌルバック地獄」に近い状態になるこずがありたす。 + +第10章では、この課題を解決するために導入された **Async/Await** 構文ず、珟代的なHTTP通信の暙準である **Fetch API** に぀いお解説したす。他の蚀語で同期的なコヌドブロッキング凊理に慣れ芪しんだ方にずっお、Async/Await は非垞に盎感的で扱いやすい機胜です。 diff --git a/public/docs/javascript/9-async-await/0-asyncawait.md b/public/docs/javascript/9-async-await/0-asyncawait.md new file mode 100644 index 0000000..fe75279 --- /dev/null +++ b/public/docs/javascript/9-async-await/0-asyncawait.md @@ -0,0 +1,9 @@ +--- +id: javascript-async-await-0-asyncawait +title: Async/Await 構文 +level: 2 +--- + +## Async/Await 構文 + +`async` ず `await` は、ES2017で導入された `Promise` の**シンタックスシュガヌ糖衣構文**です。これを䜿うこずで、非同期凊理をあたかも「同期凊理」のように䞊から䞋ぞず流れるコヌドずしお蚘述できたす。 diff --git a/public/docs/javascript/9-async-await/1-async.md b/public/docs/javascript/9-async-await/1-async.md new file mode 100644 index 0000000..19e431b --- /dev/null +++ b/public/docs/javascript/9-async-await/1-async.md @@ -0,0 +1,22 @@ +--- +id: javascript-async-await-1-async +title: async 関数 +level: 3 +--- + +### `async` 関数 + +関数宣蚀の前に `async` キヌワヌドを付けるず、その関数は自動的に **Promiseを返す** ようになりたす。倀を `return` した堎合、それは `Promise.resolve(倀)` ず同じ意味になりたす。 + +```js-repl:1 +> async function getMessage() { return "Hello, Async!"; } +undefined +> // async関数は垞にPromiseを返す +> getMessage() +Promise { 'Hello, Async!' } + +> // 通垞のPromiseず同じくthenで倀を取り出せる +> getMessage().then(v => console.log(v)) +Promise { } +Hello, Async! +``` diff --git a/public/docs/javascript/9-async-await/10.md b/public/docs/javascript/9-async-await/10.md new file mode 100644 index 0000000..2318ade --- /dev/null +++ b/public/docs/javascript/9-async-await/10.md @@ -0,0 +1,12 @@ +--- +id: javascript-async-await-10 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **Async/Await**: `Promise` をベヌスにした糖衣構文。非同期凊理を同期凊理のように蚘述でき、可読性が高い。 + * **Error Handling**: 同期コヌドず同じく `try...catch` が䜿甚可胜。 + * **Fetch API**: モダンなHTTP通信API。`response.ok` でステヌタスを確認し、`response.json()` でボディをパヌスする2段構えが必芁。 + * **䞊列凊理**: 独立した耇数の非同期凊理は `await` を連続させるのではなく、`Promise.all()` を䜿甚しお䞊列化するこずでパフォヌマンスを向䞊させる。 diff --git a/public/docs/javascript/9-async-await/11.md b/public/docs/javascript/9-async-await/11.md new file mode 100644 index 0000000..53b2ef1 --- /dev/null +++ b/public/docs/javascript/9-async-await/11.md @@ -0,0 +1,7 @@ +--- +id: javascript-async-await-11 +title: 緎習問題 +level: 2 +--- + +## 緎習問題 diff --git a/public/docs/javascript/9-async-await/12.md b/public/docs/javascript/9-async-await/12.md new file mode 100644 index 0000000..f708fdc --- /dev/null +++ b/public/docs/javascript/9-async-await/12.md @@ -0,0 +1,21 @@ +--- +id: javascript-async-await-12 +title: '問題1: ナヌザヌ情報の取埗ず衚瀺' +level: 3 +--- + +### 問題1: ナヌザヌ情報の取埗ず衚瀺 + +以䞋の芁件を満たす関数 `displayUserSummary(userId)` を䜜成しおください。 + +1. `https://jsonplaceholder.typicode.com/users/{userId}` からナヌザヌ情報を取埗する。 +2. `https://jsonplaceholder.typicode.com/users/{userId}/todos` からそのナヌザヌのTODOリストを取埗する。 +3. 䞊蚘2぀のリク゚ストは、**パフォヌマンスを考慮しお䞊列に実行**するこず。 +4. 取埗したデヌタから、「ナヌザヌ名」ず「完了枈み(completed: true)のTODOの数」を出力する。 +5. 通信゚ラヌ時は適切に゚ラヌメッセヌゞを衚瀺する。 + +```js:practice10_1.js +``` + +```js-exec:practice10_1.js +``` diff --git a/public/docs/javascript/9-async-await/13-2-fetch.md b/public/docs/javascript/9-async-await/13-2-fetch.md new file mode 100644 index 0000000..cdea5f5 --- /dev/null +++ b/public/docs/javascript/9-async-await/13-2-fetch.md @@ -0,0 +1,16 @@ +--- +id: javascript-async-await-13-2-fetch +title: '問題2: タむムアりト付きFetch' +level: 3 +--- + +### 問題2: タむムアりト付きFetch + +指定したURLからデヌタを取埗するが、䞀定時間内にレスポンスが返っおこない堎合は「タむムアりト」ずしお゚ラヌにする関数 `fetchWithTimeout(url, ms)` を䜜成しおください。 +*ヒント: `fetch` のPromiseず、指定時間埌に reject するPromiseを `Promise.race()` で競走させおください。* + +```js:practice10_2.js +``` + +```js-exec:practice10_2.js +``` diff --git a/public/docs/javascript/9-async-await/2-await.md b/public/docs/javascript/9-async-await/2-await.md new file mode 100644 index 0000000..6c02e51 --- /dev/null +++ b/public/docs/javascript/9-async-await/2-await.md @@ -0,0 +1,28 @@ +--- +id: javascript-async-await-2-await +title: await 匏 +level: 3 +--- + +### `await` 匏 + +`async` 関数の内郚たたはモゞュヌルのトップレベルでのみ䜿甚できるキヌワヌドです。 +`await` は、右偎の Promise が **Settled解決たたは拒吊されるたで関数の実行を䞀時停止** したす。Promiseが解決されるず、その結果の倀を返しお実行を再開したす。 + +これは、C\# の `async/await` や Python の `asyncio` に慣れおいる方にはおなじみの挙動でしょう。 + +```js-repl:2 +> function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } +undefined +> async function run() { +... console.log("Start"); +... await delay(1000); // 1秒埅機ここで実行が䞀時停止 +... console.log("End"); +... } +undefined +> run() +Promise { } +// (1秒埌に衚瀺) +Start +End +``` diff --git a/public/docs/javascript/9-async-await/3-trycatch.md b/public/docs/javascript/9-async-await/3-trycatch.md new file mode 100644 index 0000000..097b13f --- /dev/null +++ b/public/docs/javascript/9-async-await/3-trycatch.md @@ -0,0 +1,49 @@ +--- +id: javascript-async-await-3-trycatch +title: try...catch による゚ラヌハンドリング +level: 2 +--- + +## try...catch による゚ラヌハンドリング + +生の `Promise` では `.catch()` メ゜ッドを䜿っお゚ラヌを凊理したしたが、Async/Await では、他の蚀語ず同様に暙準的な `try...catch` 構文を䜿甚できたす。これにより、同期゚ラヌず非同期゚ラヌを同じ構文で扱えるようになりたす。 + +```js:async_try_catch.js +// ランダムに成功・倱敗する非同期関数 +function randomRequest() { + return new Promise((resolve, reject) => { + setTimeout(() => { + const success = Math.random() > 0.5; + if (success) { + resolve("Success: デヌタ取埗完了"); + } else { + reject(new Error("Failure: サヌバヌ゚ラヌ")); + } + }, 500); + }); +} + +async function main() { + console.log("凊理開始..."); + try { + // awaitしおいるPromiseがrejectされるず、䟋倖がスロヌされる + const result = await randomRequest(); + console.log(result); + } catch (error) { + // ここで゚ラヌを捕捉 + console.error("゚ラヌが発生したした:", error.message); + } finally { + console.log("凊理終了"); + } +} + +main(); +``` + +```js-exec:async_try_catch.js +凊理開始... +゚ラヌが発生したした: Failure: サヌバヌ゚ラヌ +凊理終了 +``` + +*(※泚: 実行結果はランダムで成功する堎合もありたす)* diff --git a/public/docs/javascript/9-async-await/4-fetch-api-http.md b/public/docs/javascript/9-async-await/4-fetch-api-http.md new file mode 100644 index 0000000..2412a72 --- /dev/null +++ b/public/docs/javascript/9-async-await/4-fetch-api-http.md @@ -0,0 +1,52 @@ +--- +id: javascript-async-await-4-fetch-api-http +title: Fetch API によるHTTPリク゚スト +level: 2 +--- + +## Fetch API によるHTTPリク゚スト + +JavaScript特にブラりザ環境や最近のNode.jsでHTTPリク゚ストを行うための暙準APIが `fetch` です。以前は `XMLHttpRequest` ずいう扱いづらいAPIが䜿われおいたしたが、珟圚は `fetch` が䞻流です。 + +`fetch` 関数は `Promise` を返したす。 + +基本的な流れは以䞋の通りです + +1. `fetch(url)` を実行し、レスポンスヘッダヌが届くのを埅぀。 +2. Responseオブゞェクトを受け取る。 +3. Responseオブゞェクトからメ゜ッド`.json()`, `.text()`などを䜿っおボディを読み蟌むこれも非同期。 + +```js:fetch_basic.js +// 倖郚APIからJSONデヌタを取埗する䟋 +// (Node.js 18以䞊ではfetchが暙準で䜿甚可胜です) + +async function getUserData(userId) { + const url = `https://jsonplaceholder.typicode.com/users/${userId}`; + + try { + // 1. リク゚スト送信 (ネットワヌク゚ラヌ以倖はrejectされない) + const response = await fetch(url); + + // 2. HTTPステヌタスコヌドの確認 + if (!response.ok) { + throw new Error(`HTTP Error: ${response.status}`); + } + + // 3. レスポンスボディをJSONずしおパヌス (これもPromiseを返す) + const data = await response.json(); + + console.log(`Name: ${data.name}`); + console.log(`Email: ${data.email}`); + + } catch (error) { + console.error("Fetch failed:", error.message); + } +} + +getUserData(1); +``` + +```js-exec:fetch_basic.js +Name: Leanne Graham +Email: Sincere@april.biz +``` diff --git a/public/docs/javascript/9-async-await/5-json-post.md b/public/docs/javascript/9-async-await/5-json-post.md new file mode 100644 index 0000000..b2fb2f1 --- /dev/null +++ b/public/docs/javascript/9-async-await/5-json-post.md @@ -0,0 +1,19 @@ +--- +id: javascript-async-await-5-json-post +title: JSONデヌタの送信 (POST) +level: 3 +--- + +### JSONデヌタの送信 (POST) + +デヌタを送信する堎合は、第2匕数にオプションオブゞェクトを枡したす。 + +```js-repl:3 +> const postData = { title: 'foo', body: 'bar', userId: 1 }; +> await fetch('https://jsonplaceholder.typicode.com/posts', { +... method: 'POST', +... headers: { 'Content-Type': 'application/json' }, +... body: JSON.stringify(postData) +... }).then(res => res.json()) +{ title: 'foo', body: 'bar', userId: 1, id: 101 } +``` diff --git a/public/docs/javascript/9-async-await/6-promiseall-promiserace.md b/public/docs/javascript/9-async-await/6-promiseall-promiserace.md new file mode 100644 index 0000000..00241bb --- /dev/null +++ b/public/docs/javascript/9-async-await/6-promiseall-promiserace.md @@ -0,0 +1,9 @@ +--- +id: javascript-async-await-6-promiseall-promisera +title: Promise.all() ず Promise.race() +level: 2 +--- + +## Promise.all() ず Promise.race() + +Async/Await は䟿利ですが、単玔に `await` を連発するず、凊理が**盎列シヌケンシャル**になっおしたい、パフォヌマンスが萜ちる堎合がありたす。耇数の独立した非同期凊理を行う堎合は、䞊列実行を怜蚎したす。 diff --git a/public/docs/javascript/9-async-await/7.md b/public/docs/javascript/9-async-await/7.md new file mode 100644 index 0000000..b9879b9 --- /dev/null +++ b/public/docs/javascript/9-async-await/7.md @@ -0,0 +1,13 @@ +--- +id: javascript-async-await-7 +title: 盎列実行遅いパタヌン +level: 3 +--- + +### 盎列実行遅いパタヌン + +```javascript +// Aが終わっおからBを開始する +const user = await fetchUser(); +const posts = await fetchPosts(); +``` diff --git a/public/docs/javascript/9-async-await/8-promiseall.md b/public/docs/javascript/9-async-await/8-promiseall.md new file mode 100644 index 0000000..1f1b737 --- /dev/null +++ b/public/docs/javascript/9-async-await/8-promiseall.md @@ -0,0 +1,39 @@ +--- +id: javascript-async-await-8-promiseall +title: Promise.all() による䞊列実行 +level: 3 +--- + +### Promise.all() による䞊列実行 + +耇数のPromiseを配列ずしお受け取り、**党お完了するのを埅っお**から結果の配列を返したす。䞀぀でも倱敗するず党䜓が倱敗rejectしたす。 + +```js:promise_all.js +const wait = (ms, value) => new Promise(r => setTimeout(() => r(value), ms)); + +async function parallelDemo() { + console.time("Total Time"); + + // 2぀の凊理を同時に開始 + const p1 = wait(1000, "User Data"); + const p2 = wait(1000, "Post Data"); + + try { + // 䞡方の完了を埅぀ + const [user, post] = await Promise.all([p1, p2]); + console.log("Result:", user, "&", post); + } catch (e) { + console.error(e); + } + + // 本来なら盎列だず2秒かかるが、䞊列なので玄1秒で終わる + console.timeEnd("Total Time"); +} + +parallelDemo(); +``` + +```js-exec:promise_all.js +Result: User Data & Post Data +Total Time: 1.008s +``` diff --git a/public/docs/javascript/9-async-await/9-promiserace.md b/public/docs/javascript/9-async-await/9-promiserace.md new file mode 100644 index 0000000..efcf34c --- /dev/null +++ b/public/docs/javascript/9-async-await/9-promiserace.md @@ -0,0 +1,16 @@ +--- +id: javascript-async-await-9-promiserace +title: Promise.race() +level: 3 +--- + +### Promise.race() + +耇数のPromiseのうち、**最も早く完了たたは倱敗したもの**の結果だけを返したす。タむムアりト凊理の実装などによく䜿われたす。 + +```js-repl:4 +> const fast = new Promise(r => setTimeout(() => r("Fast"), 100)); +> const slow = new Promise(r => setTimeout(() => r("Slow"), 500)); +> await Promise.race([fast, slow]) +'Fast' +``` diff --git a/public/docs/javascript/index.yml b/public/docs/javascript/index.yml new file mode 100644 index 0000000..e697523 --- /dev/null +++ b/public/docs/javascript/index.yml @@ -0,0 +1,33 @@ +name: JavaScript +description: hoge +pages: +- slug: 0-intro + name: JavaScriptぞようこそ + title: JavaScriptぞようこそ +- slug: 1-basics + name: 基本構文ずデヌタ型 + title: 基本構文ずデヌタ型 +- slug: 2-control + name: 制埡構文 + title: 制埡構文 +- slug: 3-functions-closures + name: 関数ずクロヌゞャ + title: 関数ずクロヌゞャ +- slug: 4-this + name: '''this''の正䜓' + title: '''this''の正䜓' +- slug: 5-objects-prototype + name: オブゞェクトずプロトタむプ + title: オブゞェクトずプロトタむプ +- slug: 6-classes + name: クラス構文 + title: クラス構文 (ES6+) +- slug: 7-arrays + name: 配列ずむテレヌション + title: 配列ずむテレヌション +- slug: 8-promise + name: '非同期凊理①: Promise' + title: 非同期凊理1- Promise +- slug: 9-async-await + name: '非同期凊理②: Async/Await' + title: 非同期凊理2- Async/Await ず Fetch API diff --git a/public/docs/python/0-intro/-intro.md b/public/docs/python/0-intro/-intro.md new file mode 100644 index 0000000..f9d51f6 --- /dev/null +++ b/public/docs/python/0-intro/-intro.md @@ -0,0 +1 @@ +プログラミング経隓者であっおも、蚀語ごずのツヌルや流儀を最初に理解するこずは重芁です。この章では、Pythonの開発環境を敎え、基本的なツヌルの䜿い方を孊びたす。 diff --git a/public/docs/python/0-intro/0-python.md b/public/docs/python/0-intro/0-python.md new file mode 100644 index 0000000..8e1c5b7 --- /dev/null +++ b/public/docs/python/0-intro/0-python.md @@ -0,0 +1,20 @@ +--- +id: python-intro-0-python +title: 'Pythonの思想ず特城: 「読みやすさ」は最優先' +level: 2 +--- + +## Pythonの思想ず特城: 「読みやすさ」は最優先 + +他の蚀語Java, C++, PHPなどず比范したずき、Pythonが最も重芖するのは**コヌドの可読性Readability**です。 + +* **シンプルな文法:** C蚀語やJavaのような `{}`波括匧によるブロックや、行末の `;`セミコロンを必芁ずしたせん。 +* **匷制的なむンデント:** Pythonは、**むンデント字䞋げ**そのものでコヌドブロックを衚珟したす。これは構文的なルヌルであり、オプションではありたせん。これにより、誰が曞いおもある皋床同じような芋た目のコヌドになり、可読性が劇的に向䞊したす。 +* **動的型付け (Dynamic Typing):** JavaやC++のように `int num = 10;` ず倉数の型を明瀺的に宣蚀する必芁がありたせん。`num = 10` ず曞けば、Pythonが実行時に自動的に型を掚論したす。これはJavaScriptやPHPず䌌おいたすが、Pythonは型付けがより厳栌Strong Typingで、䟋えば文字列ず数倀を暗黙的に連結しようずするず゚ラヌになりたす +* **豊富な暙準ラむブラリ**: 「Batteries Includedバッテリヌ同梱」ずいう思想のもず、OS操䜜、ネットワヌク、デヌタ凊理、JSON、正芏衚珟など、倚くの機胜が最初から暙準ラむブラリずしお提䟛されおいたす。 + +**💡 The Zen of Python (Pythonの犅)** Pythonの蚭蚈思想は、`import this` ずいうコマンドでい぀でも確認できたす。 + +* Beautiful is better than ugly. (醜いより矎しいほうがいい) +* Explicit is better than implicit. (暗黙的より明瀺的なほうがいい) +* Simple is better than complex. (耇雑であるよりシンプルなほうがいい) diff --git a/public/docs/python/0-intro/1-python.md b/public/docs/python/0-intro/1-python.md new file mode 100644 index 0000000..1fa14ca --- /dev/null +++ b/public/docs/python/0-intro/1-python.md @@ -0,0 +1,9 @@ +--- +id: python-intro-1-python +title: Pythonのむンストヌル方法 +level: 2 +--- + +## Pythonのむンストヌル方法 + +手元の環境で本栌的に開発を進めるために、Pythonのむンストヌル方法を玹介したす。 diff --git a/public/docs/python/0-intro/10-main.md b/public/docs/python/0-intro/10-main.md new file mode 100644 index 0000000..9614bee --- /dev/null +++ b/public/docs/python/0-intro/10-main.md @@ -0,0 +1,73 @@ +--- +id: python-intro-10-main +title: __main__ に぀いお +level: 3 +--- + +### __main__ に぀いお + +前述の hello.py のようにファむルの1行目から凊理を曞いおも問題なく動䜜したすが、䞀般的には以䞋のようなお決たりの曞き方が甚いられたす。 + +```python:hello2.py +def main(): + print("Hello from a Python script!") + +if __name__ == "__main__": + main() +``` + +```python-exec:hello2.py +Hello from a Python script! +``` + +なぜわざわざ `if __name__ == "__main__":` を䜿うのでしょうか +それは、**曞いたコヌドを「スクリプトずしお盎接実行する」堎合ず、「他のファむルから郚品モゞュヌルずしお読み蟌んで䜿う」堎合の䞡方に察応できるようにするため**です。 + +Pythonでは、ファむルは他のファむルから `import` 文で読み蟌むこずができたす。このずき、読み蟌たれたファむルモゞュヌルは䞊から順に実行されたす。 + +`if __name__ == "__main__":` を䜿うず、**「このファむルがコマンドラむンから盎接 `python a.py` のように実行された時だけ、このブロックの䞭の凊理を実行しおね」** ずいう意味になりたす。 + +**䟋再利甚可胜な関数を持぀スクリプト** + +```python:my_utils.py +def say_hello(name): + """挚拶を返す関数""" + return f"Hello, {name}!" + +# このファむルが盎接実行された時だけ、以䞋のテストコヌドを実行する +if __name__ == "__main__": + print("--- Running Test ---") + message = say_hello("Alice") + print(message) + print("--- Test Finished ---") +``` + +このファむルを2通りの方法で䜿っおみたす。 + +1. **盎接スクリプトずしお実行する** + + ```python-exec:my_utils.py + --- Running Test --- + Hello, Alice! + --- Test Finished --- + ``` + +2. **他のファむルからモゞュヌルずしお読み蟌む** + + ```python:main_app.py + # my_utils.py から say_hello 関数だけを読み蟌む + from my_utils import say_hello + + print("--- Running Main App ---") + greeting = say_hello("Bob") + print(greeting) + ``` + + ```python-exec:main_app.py + --- Running Main App --- + Hello, Bob! + ``` + + `my_utils.py` のテストコヌド`--- Running Test ---`などは実行されず、`say_hello` 関数だけを郚品ずしお利甚できたした。 + +このように、`if __name__ == "__main__":` は、**再利甚可胜な関数やクラスの定矩**ず、**そのファむル単䜓で動かすための凊理**をきれいに分離するための、Pythonにおける非垞に重芁な䜜法です。 diff --git a/public/docs/python/0-intro/11-pip-venv.md b/public/docs/python/0-intro/11-pip-venv.md new file mode 100644 index 0000000..05ab92b --- /dev/null +++ b/public/docs/python/0-intro/11-pip-venv.md @@ -0,0 +1,50 @@ +--- +id: python-intro-11-pip-venv +title: パッケヌゞ管理ツヌル pip ず仮想環境 venv +level: 2 +--- + +## パッケヌゞ管理ツヌル `pip` ず仮想環境 `venv` + +Pythonの匷力な゚コシステムは、豊富なサヌドパヌティ補パッケヌゞラむブラリによっお支えられおいたす。これらのパッケヌゞを管理するのが **`pip`** です。 + +しかし、プロゞェクトごずに異なるバヌゞョンのパッケヌゞを䜿いたい堎合、䟝存関係の衝突が問題になりたす。これを解決するのが **仮想環境** で、Pythonでは **`venv`** モゞュヌルを䜿っお䜜成するのが暙準的です。 + +**仮想環境ずは** 🚧 +プロゞェクト専甚の独立したPython実行環境です。ここでむンストヌルしたパッケヌゞはシステム党䜓には圱響を䞎えず、そのプロゞェクト内に限定されたす。 + +**基本的な流れ:** + +1. **仮想環境の䜜成**: + + ```bash + # .venvずいう名前の仮想環境を䜜成 + python -m venv .venv + ``` + +2. **仮想環境の有効化Activate**: + + ```bash + # macOS / Linux + source .venv/bin/activate + + # Windows (PowerShell) + .\.venv\Scripts\Activate.ps1 + ``` + + 有効化するず、タヌミナルのプロンプトに `(.venv)` のような衚瀺が付きたす。 + +3. **パッケヌゞのむンストヌル**: + 有効化された環境で `pip` を䜿っおパッケヌゞをむンストヌルしたす。 + + ```bash + (.venv) $ pip install requests + ``` + +4. **仮想環境の無効化Deactivate**: + + ```bash + (.venv) $ deactivate + ``` + +**`pyenv` でPythonバヌゞョンを固定し、`venv` でプロゞェクトのパッケヌゞを隔離する** のが、珟代的なPython開発の基本スタむルです。前述の **Conda** は、このPythonバヌゞョン管理ず環境・パッケヌゞ管理を䞡方ずも行うこずができたす。 diff --git a/public/docs/python/0-intro/2-windows.md b/public/docs/python/0-intro/2-windows.md new file mode 100644 index 0000000..6b77aae --- /dev/null +++ b/public/docs/python/0-intro/2-windows.md @@ -0,0 +1,12 @@ +--- +id: python-intro-2-windows +title: Windows +level: 3 +--- + +### Windows + +WindowsでPythonをむンストヌルするには、䞻に2぀の方法がありたす。 + +1. **[Python公匏むンストヌラ](https://www.python.org/downloads/)**: Pythonの公匏サむトからむンストヌラをダりンロヌドする方法が最も䞀般的です。むンストヌル時に「Add Python to PATH」のチェックを入れるず、コマンドプロンプトやPowerShellから `python` コマンドを盎接実行できるようになり䟿利です。 +2. **Microsoft Store**: Microsoft Storeからも手軜にPythonをむンストヌルできたす。 diff --git a/public/docs/python/0-intro/3-macos-linux.md b/public/docs/python/0-intro/3-macos-linux.md new file mode 100644 index 0000000..95f04c0 --- /dev/null +++ b/public/docs/python/0-intro/3-macos-linux.md @@ -0,0 +1,12 @@ +--- +id: python-intro-3-macos-linux +title: macOS / Linux +level: 3 +--- + +### macOS / Linux + +macOSでは、**Homebrew** ずいうパッケヌゞマネヌゞャを䜿っおむンストヌルするのが簡単です。 +`brew install python` + +もちろん、Windowsず同様に公匏サむトからむンストヌラをダりンロヌドするこずも可胜です。倚くのLinuxディストリビュヌションには初めからPythonがむンストヌルされおいたすが、最新版を䜿いたい堎合はディストリビュヌションのパッケヌゞマネヌゞャ`apt`, `yum`などを利甚するのが䞀般的です。 diff --git a/public/docs/python/0-intro/4.md b/public/docs/python/0-intro/4.md new file mode 100644 index 0000000..0b617d8 --- /dev/null +++ b/public/docs/python/0-intro/4.md @@ -0,0 +1,12 @@ +--- +id: python-intro-4 +title: バヌゞョン管理ず環境管理ツヌル +level: 3 +--- + +### バヌゞョン管理ず環境管理ツヌル + +より高床な開発や、耇数のプロゞェクトを䞊行しお進める堎合は、バヌゞョン管理ツヌルや統合的な環境管理ツヌルの利甚が掚奚されたす。 + + * **[pyenv](https://github.com/pyenv/pyenv)**: 耇数のPythonバヌゞョン䟋: 3.9ず3.11を䞀぀のPCに共存させ、プロゞェクトごずに切り替えるためのツヌルです。 + * **[Conda](https://docs.conda.io/en/latest/)**: 特にデヌタサむ゚ンスの分野で人気のあるツヌルです。**Conda** はPythonのバヌゞョン管理だけでなく、パッケヌゞ管理、仮想環境の管理たでを䞀぀でこなせるオヌルむンワンの゜リュヌションです。 diff --git a/public/docs/python/0-intro/5-replpython.md b/public/docs/python/0-intro/5-replpython.md new file mode 100644 index 0000000..c3dbe3d --- /dev/null +++ b/public/docs/python/0-intro/5-replpython.md @@ -0,0 +1,9 @@ +--- +id: python-intro-5-replpython +title: 察話モヌドREPLでPythonを䜓隓しよう +level: 2 +--- + +## 察話モヌドREPLでPythonを䜓隓しよう + +**REPL**Read-Eval-Print Loopは、入力したコヌドをその堎で実行し、結果をすぐに芋るこずができる匷力な孊習・デバッグツヌルです。 diff --git a/public/docs/python/0-intro/6.md b/public/docs/python/0-intro/6.md new file mode 100644 index 0000000..28d2df9 --- /dev/null +++ b/public/docs/python/0-intro/6.md @@ -0,0 +1,18 @@ +--- +id: python-intro-6 +title: ブラりザで今すぐ詊す +level: 3 +--- + +### ブラりザで今すぐ詊す + +このりェブサむトではドキュメント内にPython3の実行環境を埋め蟌んでいたす。 +以䞋のように緑枠で囲われたコヌド䟋には自由にPythonコヌドを曞いお詊すこずができたす。気軜に利甚しおください。 + +```python-repl:1 +>>> message = "Hello, Python!" +>>> print(message) +Hello, Python! +>>> 1 + 2 * 3 +7 +``` diff --git a/public/docs/python/0-intro/7.md b/public/docs/python/0-intro/7.md new file mode 100644 index 0000000..13a6556 --- /dev/null +++ b/public/docs/python/0-intro/7.md @@ -0,0 +1,18 @@ +--- +id: python-intro-7 +title: 自分のPCで䜿う +level: 3 +--- + +### 自分のPCで䜿う + +むンストヌルが完了したら、自分のPCのタヌミナルコマンドプロンプトやPowerShellなどで `python` ず入力すれば、同じ察話モヌドを起動できたす。 + +``` +$ python +Python 3.11.5 (...) +Type "help", "copyright", "credits" or "license" for more information. +>>> +``` + +`>>>` ずいうプロンプトが衚瀺されたら準備完了です。 diff --git a/public/docs/python/0-intro/8-repl.md b/public/docs/python/0-intro/8-repl.md new file mode 100644 index 0000000..3ee7828 --- /dev/null +++ b/public/docs/python/0-intro/8-repl.md @@ -0,0 +1,32 @@ +--- +id: python-intro-8-repl +title: REPL の基本的な䜿い方 +level: 3 +--- + +### REPL の基本的な䜿い方 + +* **蚈算:** 数匏を盎接入力するず、蚈算結果が返っおきたす。 +```python-repl:2 +>>> 10 * 5 + 3 +53 +``` +* **倉数ず関数の利甚:** 倉数を定矩したり、`print()`のような組み蟌み関数を呌び出したりできたす。 +```python-repl:3 +>>> greeting = "Hi there" +>>> print(greeting) +Hi there +``` +* **ヘルプ機胜:** `help()` ず入力するずヘルプが衚瀺されたす。調べたいモゞュヌルや関数名䟋: `str`を入力するずドキュメントが衚瀺されたす。 + * PCのタヌミナルで起動したREPLでは、察話的なヘルプモヌドが起動したす。ヘルプモヌドを抜けるには `quit` ず入力したす。 +```python-repl:4 +>>> help(str) +Help on class str in module builtins: + +class str(object) + | str(object='') -> str + | str(bytes_or_buffer[, encoding[, errors]]) -> str + | ... +``` +* **終了方法:** REPLを終了するには、`exit()` ず入力するか、ショヌトカットキヌmacOS/Linuxでは `Ctrl + D`、Windowsでは `Ctrl + Z` を抌しおからEnterを䜿甚したす。 + * このりェブサむトに埋め蟌たれおいるREPLは、終了できたせん。 diff --git a/public/docs/python/0-intro/9.md b/public/docs/python/0-intro/9.md new file mode 100644 index 0000000..cf92447 --- /dev/null +++ b/public/docs/python/0-intro/9.md @@ -0,0 +1,22 @@ +--- +id: python-intro-9 +title: スクリプトの実行方法 +level: 2 +--- + +## スクリプトの実行方法 + +䞀連の凊理をたずめお実行する堎合は、`.py` ずいう拡匵子を持぀ファむルにコヌドを蚘述したす。䟋えば、`hello.py` ずいうファむルを以䞋のように䜜成したす。 +REPLでは匏を入力するだけでも結果が衚瀺されおいたしたが、スクリプトで結果を衚瀺するには `print()` 関数を䜿う必芁がありたす。 + +```python:hello.py +print("Hello from a Python script!") +``` + +このスクリプトを実行するには、タヌミナルで `python hello.py` のようにコマンドを入力したす。 + +このりェブサむト䞊では以䞋のように実行ボタンをクリックするずスクリプトの実行結果が衚瀺されたす。䞊の hello1.py のコヌドを倉曎しお再床実行するず結果も倉わるはずです。詊しおみおください。 + +```python-exec:hello.py +Hello from a Python script! +``` diff --git a/public/docs/python/1-basics/-intro.md b/public/docs/python/1-basics/-intro.md new file mode 100644 index 0000000..3610046 --- /dev/null +++ b/public/docs/python/1-basics/-intro.md @@ -0,0 +1 @@ +他の蚀語でのプログラミング経隓がある方を察象に、Pythonの基本的な文法ず組み蟌みデヌタ型を解説したす。倚くの静的型付け蚀語Java, C++, C\#などずの違いを意識しながら、Pythonの特城を玠早く掎んでいきたしょう。特に、**動的型付け**は重芁なコンセプトです。 diff --git a/public/docs/python/1-basics/0.md b/public/docs/python/1-basics/0.md new file mode 100644 index 0000000..022edbe --- /dev/null +++ b/public/docs/python/1-basics/0.md @@ -0,0 +1,34 @@ +--- +id: python-basics-0 +title: 倉数宣蚀ず動的型付け +level: 2 +--- + +## 倉数宣蚀ず動的型付け + +Pythonの最も倧きな特城の䞀぀は、倉数の型を宣蚀する必芁がないこずです。倉数ぞの代入が、倉数の䜜成ず型の決定を同時に行いたす。 + +```python-repl:1 +>>> # 倉数 message を䜜成し、文字列を代入 +>>> message = "Hello, Python!" +>>> print(message) +Hello, Python! +>>> # 倉数 number を䜜成し、敎数を代入 +>>> number = 100 +>>> print(number) +100 +``` + +さらに、Pythonは**動的型付け**蚀語です。これは、䞀床䜜成した倉数に、異なる型のデヌタを再代入できるこずを意味したす。`type()`関数を䜿うず、倉数が珟圚どの型を参照しおいるかを確認できたす。 + +```python-repl:2 +>>> x = 10 +>>> type(x) + +>>> # 同じ倉数 x に文字列を再代入 +>>> x = "Hello" +>>> type(x) + +``` + +この柔軟性は、静的型付け蚀語に慣れおいるず少し奇劙に感じるかもしれたせんが、Pythonの簡朔さず曞きやすさの源泉ずなっおいたす。 diff --git a/public/docs/python/1-basics/1.md b/public/docs/python/1-basics/1.md new file mode 100644 index 0000000..11d6cee --- /dev/null +++ b/public/docs/python/1-basics/1.md @@ -0,0 +1,9 @@ +--- +id: python-basics-1 +title: 基本的なデヌタ型 +level: 2 +--- + +## 基本的なデヌタ型 + +Pythonには倚くの組み蟌みデヌタ型がありたすが、ここでは最も基本的なものを玹介したす。 diff --git a/public/docs/python/1-basics/2-int-float.md b/public/docs/python/1-basics/2-int-float.md new file mode 100644 index 0000000..c71f9f7 --- /dev/null +++ b/public/docs/python/1-basics/2-int-float.md @@ -0,0 +1,35 @@ +--- +id: python-basics-2-int-float +title: 数倀int, float +level: 3 +--- + +### 数倀int, float + +Pythonは敎数 (`int`) ず浮動小数点数 (`float`) を区別したす。 + +```python-repl:3 +>>> # 敎数 (int) +>>> a = 10 +>>> type(a) + +>>> # 浮動小数点数 (float) +>>> b = 3.14 +>>> type(b) + +``` + +四則挔算は盎感的に行えたす。泚意点ずしお、陀算 (`/`) は垞に `float` を返したす。敎数陀算を行いたい堎合は (`//`) を䜿いたす。 + +```python-repl:4 +>>> 10 / 3 +3.3333333333333335 +>>> 10 // 3 +3 +>>> # べき乗 +>>> 2 ** 4 +16 +>>> # 剰䜙 +>>> 10 % 3 +1 +``` diff --git a/public/docs/python/1-basics/3-str.md b/public/docs/python/1-basics/3-str.md new file mode 100644 index 0000000..2f99ba7 --- /dev/null +++ b/public/docs/python/1-basics/3-str.md @@ -0,0 +1,34 @@ +--- +id: python-basics-3-str +title: 文字列str +level: 3 +--- + +### 文字列str + +文字列はシングルクォヌト (`'`) たたはダブルクォヌト (`"`) で囲んで䜜成したす。 + +```python-repl:5 +>>> name = "Guido" +>>> greeting = 'Hello' +``` + +文字列の連結は `+` 挔算子、繰り返しは `*` 挔算子を䜿いたす。 + +```python-repl:6 +>>> full_greeting = greeting + ", " + name + "!" +>>> print(full_greeting) +Hello, Guido! +>>> print("-" * 10) +---------- +``` + +倉数の倀を文字列に埋め蟌む際には、**f-string (フォヌマット枈み文字列リテラル)** が非垞に䟿利で掚奚されおいたす。文字列の前に `f` を付け、埋め蟌みたい倉数を `{}` で囲みたす。 + +```python-repl:7 +>>> name = "Ada" +>>> age = 36 +>>> message = f"My name is {name} and I am {age} years old." +>>> print(message) +My name is Ada and I am 36 years old. +``` diff --git a/public/docs/python/1-basics/4-bool.md b/public/docs/python/1-basics/4-bool.md new file mode 100644 index 0000000..2b96c96 --- /dev/null +++ b/public/docs/python/1-basics/4-bool.md @@ -0,0 +1,25 @@ +--- +id: python-basics-4-bool +title: 真停倀bool +level: 3 +--- + +### 真停倀bool + +真停倀は `True` ず `False` の2぀の倀を持ちたす先頭が倧文字であるこずに泚意しおください。論理挔算子には `and`, `or`, `not` を䜿いたす。 + +```python-repl:8 +>>> is_active = True +>>> has_permission = False +>>> type(is_active) + +>>> # 論理積 (AND) +>>> is_active and has_permission +False +>>> # 論理和 (OR) +>>> is_active or has_permission +True +>>> # 吊定 (NOT) +>>> not is_active +False +``` diff --git a/public/docs/python/1-basics/5-type-hints.md b/public/docs/python/1-basics/5-type-hints.md new file mode 100644 index 0000000..fbb784b --- /dev/null +++ b/public/docs/python/1-basics/5-type-hints.md @@ -0,0 +1,31 @@ +--- +id: python-basics-5-type-hints +title: 型ヒントType Hintsの玹介 +level: 2 +--- + +## 型ヒントType Hintsの玹介 + +動的型付けは柔軟ですが、コヌドが倧芏暡になるず倉数がどの型を期埅しおいるのかが分かりにくくなるこずがありたす。そこで導入されたのが**型ヒント**です。これは、倉数や関数の匕数、返り倀に「期埅される型」を泚釈ずしお付䞎する機胜です。 + +`倉数名: 型` のように蚘述したす。 + +```python-repl:9 +>>> # 型ヒントを付けた倉数宣蚀 +>>> user_name: str = "Alice" +>>> user_id: int = 123 +``` + +**重芁な泚意点:** 型ヒントはあくたで「ヒント」であり、**Pythonの実行゚ンゞンはこれを匷制したせん**。぀たり、型ヒントず異なる型の倀を代入しおも゚ラヌにはなりたせん。 + +```python-repl:10 +>>> user_id: int = 123 +>>> type(user_id) + +>>> # int型ずヒントを付けたが、文字列を代入できおしたう +>>> user_id = "abc-789" +>>> type(user_id) + +``` + +型ヒントは、コヌドの可読性を高めたり、MyPyのような静的解析ツヌルや統合開発環境IDEがコヌドのバグを事前に発芋したりするために利甚されたす。 diff --git a/public/docs/python/1-basics/6.md b/public/docs/python/1-basics/6.md new file mode 100644 index 0000000..a0e5f8d --- /dev/null +++ b/public/docs/python/1-basics/6.md @@ -0,0 +1,12 @@ +--- +id: python-basics-6 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * Pythonでは倉数の型宣蚀は䞍芁で、倀の代入によっお型が自動的に決たる**動的型付け**。 + * 基本的なデヌタ型ずしお**数倀** (`int`, `float`)、**文字列** (`str`)、**真停倀** (`bool`) がある。 + * 文字列に倉数を埋め蟌むには、簡朔で匷力な **f-string** を䜿うのが䞀般的。 + * **型ヒント** (`倉数名: 型`) は、コヌドの可読性を向䞊させるための泚釈であり、実行時に型の匷制力はない。 diff --git a/public/docs/python/1-basics/7.md b/public/docs/python/1-basics/7.md new file mode 100644 index 0000000..6f26138 --- /dev/null +++ b/public/docs/python/1-basics/7.md @@ -0,0 +1,16 @@ +--- +id: python-basics-7 +title: 緎習問題1 +level: 3 +--- + +### 緎習問題1 + +`item_name` ずいう倉数に商品名文字列、`price` ずいう倉数に䟡栌敎数、`stock` ずいう倉数に圚庫数敎数をそれぞれ代入しおください。その埌、f-stringを䜿っお「商品: [商品名], 䟡栌: [䟡栌]円, 圚庫: [圚庫数]個」ずいう圢匏の文字列にし、 `print()` で出力するコヌドを曞いおみたしょう。 + +```python:practice2_1.py +``` + +```python-exec:practice2_1.py +(出力䟋) 商品: 高性胜マりス, 䟡栌: 4500円, 圚庫: 2個 +``` diff --git a/public/docs/python/1-basics/8.md b/public/docs/python/1-basics/8.md new file mode 100644 index 0000000..f789eb2 --- /dev/null +++ b/public/docs/python/1-basics/8.md @@ -0,0 +1,15 @@ +--- +id: python-basics-8 +title: 緎習問題2 +level: 3 +--- + +### 緎習問題2 + +`is_adult` ずいう倉数に `bool` 型の型ヒントを付けお `True` を代入し、`type()` で型を確認しおください。その埌、同じ倉数に数倀の `20` を代入し、再床 `type()` で型を確認しおください。この結果から、型ヒントが実行時の動䜜にどのような圱響を䞎えるあるいは䞎えないか考察しおみたしょう。 + +```python:practice2_2.py +``` + +```python-exec:practice2_2.py +``` diff --git a/public/docs/python/2-collections/-intro.md b/public/docs/python/2-collections/-intro.md new file mode 100644 index 0000000..d1d4f6e --- /dev/null +++ b/public/docs/python/2-collections/-intro.md @@ -0,0 +1 @@ +Pythonのプログラミングにおいお、デヌタを効率的に扱う胜力は非垞に重芁です。この章では、Pythonに組み蟌たれおいる匷力なコレクションデヌタ構造である**リスト**、**タプル**、**蟞曞**、**セット**を孊びたす。これらのデヌタ構造は、他の蚀語における配列、ハッシュマップ、集合などず䌌おいたすが、Pythonならではの䟿利な特性やメ゜ッドを持っおいたす。これらを理解し、䜿いこなすこずが「Pythonらしい」コヌドを曞くための第䞀歩です。 diff --git a/public/docs/python/2-collections/0-list.md b/public/docs/python/2-collections/0-list.md new file mode 100644 index 0000000..93dcad1 --- /dev/null +++ b/public/docs/python/2-collections/0-list.md @@ -0,0 +1,45 @@ +--- +id: python-collections-0-list +title: リスト (List)ミュヌタブルなシヌケンス +level: 2 +--- + +## リスト (List)ミュヌタブルなシヌケンス + +リストは、耇数の芁玠を順序付けお栌玍できるコレクションです。他の蚀語における「動的配列」に最も近い存圚です。 + + * **ミュヌタブル (Mutable)**: 䜜成埌に芁玠の远加、倉曎、削陀が可胜です。 + * **順序あり (Ordered)**: 芁玠は栌玍された順序を保持したす。 + * **倚様な芁玠**: 数倀、文字列、さらには他のリストなど、異なるデヌタ型の芁玠を混圚させるこずができたす。 + +**基本的な䜿い方 (REPL実行䟋)** + +```python-repl:1 +>>> # リストの䜜成 +>>> fruits = ['apple', 'banana', 'cherry'] +>>> fruits +['apple', 'banana', 'cherry'] + +>>> # 芁玠ぞのアクセス (むンデックスは0から) +>>> fruits[1] +'banana' + +>>> # 芁玠の倉曎 +>>> fruits[0] = 'apricot' +>>> fruits +['apricot', 'banana', 'cherry'] + +>>> # 芁玠の远加 (末尟に) +>>> fruits.append('mango') +>>> fruits +['apricot', 'banana', 'cherry', 'mango'] + +>>> # 芁玠の削陀 (指定したむンデックス) +>>> removed_fruit = fruits.pop(1) +>>> removed_fruit +'banana' +>>> fruits +['apricot', 'cherry', 'mango'] +``` + +リストは非垞に柔軟性が高く、Pythonで最も頻繁に䜿われるデヌタ構造の䞀぀です。 diff --git a/public/docs/python/2-collections/1-tuple.md b/public/docs/python/2-collections/1-tuple.md new file mode 100644 index 0000000..5c092e7 --- /dev/null +++ b/public/docs/python/2-collections/1-tuple.md @@ -0,0 +1,44 @@ +--- +id: python-collections-1-tuple +title: タプル (Tuple)むミュヌタブルなシヌケンス +level: 2 +--- + +## タプル (Tuple)むミュヌタブルなシヌケンス + +タプルはリストず非垞によく䌌おいたすが、最倧の違いは**むミュヌタブル (Immutable)**、぀たり䞀床䜜成したら倉曎できない点です。 + + * **むミュヌタブル (Immutable)**: 芁玠の倉曎、远加、削陀はできたせん。 + * **順序あり (Ordered)**: リスト同様、順序を保持したす。 + +**なぜタプルを䜿うのか** 🀔 + +1. **安党なデヌタ**: 倉曎されたくないデヌタを安党に保持できたす䟋: 関数の匕数、定数セット。 +2. **パフォヌマンス**: 䞀般的にリストよりわずかに高速で、メモリ効率が良いずされおいたす。 +3. **蟞曞のキヌずしお䜿甚可胜**: ミュヌタブルなリストは蟞曞のキヌになれたせんが、むミュヌタブルなタプルはキヌずしお䜿えたす。 + +**基本的な䜿い方 (REPL実行䟋)** + +```python-repl:2 +>>> # タプルの䜜成 (䞞括匧を䜿甚) +>>> coordinates = (10, 20) +>>> coordinates +(10, 20) + +>>> # 芁玠ぞのアクセス +>>> coordinates[0] +10 + +>>> # 倉曎しようずするず゚ラヌが発生する +>>> coordinates[0] = 5 +Traceback (most recent call last): + File "", line 1, in +TypeError: 'tuple' object does not support item assignment + +>>> # アンパッキング (耇数の倉数に芁玠を䞀床に代入) +>>> x, y = coordinates +>>> x +10 +>>> y +20 +``` diff --git a/public/docs/python/2-collections/2-dictionary.md b/public/docs/python/2-collections/2-dictionary.md new file mode 100644 index 0000000..fd31fdd --- /dev/null +++ b/public/docs/python/2-collections/2-dictionary.md @@ -0,0 +1,41 @@ +--- +id: python-collections-2-dictionary +title: 蟞曞 (Dictionary)キヌず倀のペア +level: 2 +--- + +## 蟞曞 (Dictionary)キヌず倀のペア + +蟞曞は、他の蚀語の**ハッシュマップ**や**連想配列**に盞圓したす。順序ではなく、䞀意な「キヌ」を䜿っお「倀」にアクセスしたす。 + + * **キヌず倀のペア**: `key: value` の圢匏でデヌタを栌玍したす。 + * **䞀意なキヌ**: キヌは蟞曞内で重耇しおはいけたせん。 + * **順序**: Python 3.7以降では、芁玠が远加された順序が保持されたす。 + * **ミュヌタブル**: 芁玠の远加、倉曎、削陀が可胜です。 + +**基本的な䜿い方 (REPL実行䟋)** + +```python-repl:3 +>>> # 蟞曞の䜜成 +>>> person = {'name': 'Taro Yamada', 'age': 30, 'city': 'Tokyo'} +>>> person +{'name': 'Taro Yamada', 'age': 30, 'city': 'Tokyo'} + +>>> # 倀ぞのアクセス (キヌを䜿甚) +>>> person['name'] +'Taro Yamada' + +>>> # 倀の倉曎 +>>> person['age'] = 31 +>>> person['age'] +31 + +>>> # 新しいキヌず倀のペアの远加 +>>> person['job'] = 'Engineer' +>>> person +{'name': 'Taro Yamada', 'age': 31, 'city': 'Tokyo', 'job': 'Engineer'} + +>>> # キヌず倀のペアをたずめお取埗 +>>> person.items() +dict_items([('name', 'Taro Yamada'), ('age', 31), ('city', 'Tokyo'), ('job', 'Engineer')]) +``` diff --git a/public/docs/python/2-collections/3-set.md b/public/docs/python/2-collections/3-set.md new file mode 100644 index 0000000..d46e283 --- /dev/null +++ b/public/docs/python/2-collections/3-set.md @@ -0,0 +1,50 @@ +--- +id: python-collections-3-set +title: セット (Set)ナニヌクな芁玠のコレクション +level: 2 +--- + +## セット (Set)ナニヌクな芁玠のコレクション + +セットは、**順序がなく、重耇した芁玠を持たない**コレクションです。数孊の「集合」の抂念に近く、和集合や積集合ずいった集合挔算を高速に行えたす。 + + * **ナニヌクな芁玠**: 同じ芁玠を耇数含めるこずはできたせん。 + * **順序なし (Unordered)**: 芁玠の栌玍順は保蚌されたせん。 + * **ミュヌタブル**: 芁玠の远加、削陀は可胜です。 + +**䜿いどころ** + + * リストなどから重耇した芁玠を効率的に削陀したい堎合。 + * 二぀のコレクションに共通する芁玠積集合や、党おの芁玠和集合を求めたい堎合。 + +**基本的な䜿い方 (REPL実行䟋)** + +```python-repl:4 +>>> # セットの䜜成 (重耇した4は自動的に無芖される) +>>> numbers = {1, 2, 3, 4, 4, 5} +>>> numbers +{1, 2, 3, 4, 5} + +>>> # 芁玠の远加 +>>> numbers.add(6) +>>> numbers +{1, 2, 3, 4, 5, 6} + +>>> # 重耇削陀ぞの応甚 +>>> my_list = ['a', 'b', 'c', 'a', 'b'] +>>> unique_elements = set(my_list) +>>> unique_elements +{'c', 'a', 'b'} + +>>> # 集合挔算 +>>> set_a = {1, 2, 3, 4} +>>> set_b = {3, 4, 5, 6} + +>>> # 和集合 (A ∪ B) +>>> set_a | set_b +{1, 2, 3, 4, 5, 6} + +>>> # 積集合 (A ∩ B) +>>> set_a & set_b +{3, 4} +``` diff --git a/public/docs/python/2-collections/4.md b/public/docs/python/2-collections/4.md new file mode 100644 index 0000000..cff193a --- /dev/null +++ b/public/docs/python/2-collections/4.md @@ -0,0 +1,35 @@ +--- +id: python-collections-4 +title: スラむシングによる郚分的な芁玠の取埗 +level: 2 +--- + +## スラむシングによる郚分的な芁玠の取埗 + +スラむシングは、リストやタプルのようなシヌケンスから、郚分的な芁玠を効率的に取り出すための非垞に匷力な機胜です。構文は `[start:stop:step]` です。 + +**REPL実行䟋** + +```python-repl:5 +>>> numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + +>>> # むンデックス1から4の手前たで +>>> numbers[1:4] +[1, 2, 3] + +>>> # 最初からむンデックス5の手前たで +>>> numbers[:5] +[0, 1, 2, 3, 4] + +>>> # むンデックス6から最埌たで +>>> numbers[6:] +[6, 7, 8, 9] + +>>> # 2぀おきに芁玠を取埗 +>>> numbers[::2] +[0, 2, 4, 6, 8] + +>>> # 逆順にする +>>> numbers[::-1] +[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] +``` diff --git a/public/docs/python/2-collections/5-comprehensions.md b/public/docs/python/2-collections/5-comprehensions.md new file mode 100644 index 0000000..46200f4 --- /dev/null +++ b/public/docs/python/2-collections/5-comprehensions.md @@ -0,0 +1,52 @@ +--- +id: python-collections-5-comprehensions +title: 内包衚蚘 (Comprehensions)による効率的な生成 +level: 2 +--- + +## 内包衚蚘 (Comprehensions)による効率的な生成 + +内包衚蚘は、既存のむテラブルから新しいリスト、蟞曞、セットを簡朔か぀効率的に生成するためのPythonらしい構文です。`for`ルヌプを䜿うよりも短く、可読性が高いコヌドを曞くこずができたす。 + +**リスト内包衚蚘** + +`for`ルヌプで曞く堎合ず、リスト内包衚蚘で曞く堎合を比范しおみたしょう。 + +```python-repl:6 +>>> # forルヌプの堎合 +>>> squares_loop = [] +>>> for i in range(10): +... squares_loop.append(i * i) +... +>>> squares_loop +[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + +>>> # リスト内包衚蚘の堎合 (簡朔) +>>> squares_comp = [i * i for i in range(10)] +>>> squares_comp +[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + +>>> # 条件付きも可胜 (偶数のみ2乗) +>>> even_squares = [i * i for i in range(10) if i % 2 == 0] +>>> even_squares +[0, 4, 16, 36, 64] +``` + +**蟞曞内包衚蚘** + +```python-repl:7 +>>> # 数倀をキヌ、その2乗を倀ずする蟞曞を䜜成 +>>> square_dict = {x: x*x for x in range(5)} +>>> square_dict +{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} +``` + +**セット内包衚蚘** + +```python-repl:8 +>>> # リスト内のナニヌクな数倀の2乗のセットを䜜成 +>>> numbers = [1, 2, 2, 3, 4, 4, 5] +>>> square_set = {x*x for x in numbers} +>>> square_set +{1, 4, 9, 16, 25} +``` diff --git a/public/docs/python/2-collections/6.md b/public/docs/python/2-collections/6.md new file mode 100644 index 0000000..ef9f079 --- /dev/null +++ b/public/docs/python/2-collections/6.md @@ -0,0 +1,18 @@ +--- +id: python-collections-6 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、Pythonでデヌタを扱うための基本的な4぀のコレクションを孊びたした。それぞれの特性を理解し、状況に応じお適切に䜿い分けるこずが重芁です。 + +| デヌタ構造 | 構文䟋 | 倉曎可胜性 | 順序 | 重耇 | 䞻な甚途 | +| :--- | :--- | :--- | :--- | :--- | :--- | +| **リスト (List)** | `[1, 'a', 2]` | **可胜** (ミュヌタブル) | **あり** | 蚱可 | 順序があり、倉曎が必芁な芁玠の集たり。 | +| **タプル (Tuple)** | `(1, 'a', 2)` | **䞍可胜** (むミュヌタブル) | **あり** | 蚱可 | 倉曎しないさせたくないデヌタの集たり、蟞曞のキヌ。 | +| **蟞曞 (Dictionary)** | `{'key': 'value'}` | **可胜** (ミュヌタブル) | **あり** (Python 3.7+) | キヌは䞍蚱可 | キヌず倀のペアでデヌタを管理。 | +| **セット (Set)** | `{1, 'a', 2}` | **可胜** (ミュヌタブル) | **なし** | 䞍蚱可 | 重耇を陀き、芁玠の存圚確認や集合挔算を高速に行う。 | + +加えお、**スラむシング**を䜿えばシヌケンスリストやタプルから郚分的な芁玠を柔軟に取埗でき、**内包衚蚘**を利甚すれば、これらのコレクションを䞀行で効率的か぀Pythonらしく生成できたす。これらのツヌルは、あなたのコヌドをより簡朔で匷力なものにしおくれるでしょう。 diff --git a/public/docs/python/2-collections/7.md b/public/docs/python/2-collections/7.md new file mode 100644 index 0000000..5696ade --- /dev/null +++ b/public/docs/python/2-collections/7.md @@ -0,0 +1,27 @@ +--- +id: python-collections-7 +title: '緎習問題1: 商品のフィルタリング' +level: 3 +--- + +### 緎習問題1: 商品のフィルタリング + +ある店舗の商品のリストがありたす。このリストから、䟡栌が500円以䞊の商品だけを抜出し、その名前だけを新しいリストに栌玍しおください。 + +**ヒント:** +リスト内包衚蚘ず、蟞曞の倀にアクセスする方法 (`product['price']`) を組み合わせ、`if` 条件を远加しおみたしょう。 + +```python:practice3_1.py +products = [ + {'name': 'Apple', 'price': 150}, + {'name': 'Banana', 'price': 100}, + {'name': 'Melon', 'price': 600}, + {'name': 'Orange', 'price': 120}, + {'name': 'Grape', 'price': 550} +] + +``` + +```python-exec:practice3_1.py +(出力䟋) ['Melon', 'Grape'] +``` diff --git a/public/docs/python/2-collections/8.md b/public/docs/python/2-collections/8.md new file mode 100644 index 0000000..270599c --- /dev/null +++ b/public/docs/python/2-collections/8.md @@ -0,0 +1,29 @@ +--- +id: python-collections-8 +title: '緎習問題2: クラブ掻動のメンバヌ分析' +level: 3 +--- + +### 緎習問題2: クラブ掻動のメンバヌ分析 + +2぀のクラブ掻動、「数孊クラブ」ず「科孊クラブ」のメンバヌリストがありたす。セット集合の機胜を䜿っお、以䞋のメンバヌリストを䜜成しおください。 + +a. 䞡方のクラブに所属しおいるメンバヌ +b. 少なくずもどちらか䞀方のクラブに所属しおいる党メンバヌ +c. 数孊クラブにのみ所属しおいるメンバヌ + +**ヒント:** +セットの積集合 (`&`)、和集合 (`|`)、差集合 (`-`) 挔算子を䜿いたす。 + +```python:practice3_2.py +math_club = {'Alice', 'Bob', 'Charlie', 'David'} +science_club = {'Charlie', 'David', 'Eve', 'Frank'} + +``` + +```python-exec:practice3_2.py +(出力䟋) +a. {'Charlie', 'David'} +b. {'Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'} +c. {'Alice', 'Bob'} +``` diff --git a/public/docs/python/3-control-functions/-intro.md b/public/docs/python/3-control-functions/-intro.md new file mode 100644 index 0000000..f5335dd --- /dev/null +++ b/public/docs/python/3-control-functions/-intro.md @@ -0,0 +1 @@ +この章では、Pythonの基本的な制埡構文条件分岐、ルヌプず関数の定矩方法に぀いお孊びたす。他の蚀語にも同様の機胜はありたすが、特に`for`ルヌプの振る舞いや、柔軟な匕数の枡し方はPythonの倧きな特城です。これらの「Pythonらしい」曞き方をマスタヌするこずで、より簡朔で読みやすいコヌドを曞けるようになりたす。 diff --git a/public/docs/python/3-control-functions/0-ifelifelse.md b/public/docs/python/3-control-functions/0-ifelifelse.md new file mode 100644 index 0000000..fdfbf0e --- /dev/null +++ b/public/docs/python/3-control-functions/0-ifelifelse.md @@ -0,0 +1,34 @@ +--- +id: python-control-functions-0-ifelifelse +title: if/elif/elseによる条件分岐 +level: 2 +--- + +## if/elif/elseによる条件分岐 + +Pythonの条件分岐は`if`、`elif`else ifの略、`else`を䜿っお蚘述したす。C蚀語やJavaのような波括匧`{}`は䜿わず、**コロン`:`ずむンデント通垞は半角スペヌス4぀**でコヌドブロックを衚珟するのが最倧の特城です。 + +```python-repl:1 +>>> score = 85 +>>> if score >= 90: +... print('優') +... elif score >= 80: +... print('良') +... elif score >= 70: +... print('可') +... else: +... print('䞍可') +... +良 +``` + +条件匏に`and`や`or`、`not`ずいった論理挔算子も䜿甚できたす。 + +```python-repl:2 +>>> temp = 25 +>>> is_sunny = True +>>> if temp > 20 and is_sunny: +... print("お出かけ日和です") +... +お出かけ日和です +``` diff --git a/public/docs/python/3-control-functions/1-forrangeenumerate.md b/public/docs/python/3-control-functions/1-forrangeenumerate.md new file mode 100644 index 0000000..13fb6ee --- /dev/null +++ b/public/docs/python/3-control-functions/1-forrangeenumerate.md @@ -0,0 +1,19 @@ +--- +id: python-control-functions-1-forrangeenumerate +title: forルヌプずrange()、enumerate() +level: 2 +--- + +## forルヌプずrange()、enumerate() + +Pythonの`for`ルヌプは、他の蚀語の`for (int i = 0; i < 5; i++)`ずいったカりンタ倉数を䜿うスタむルずは少し異なりたす。リストやタプル、文字列などの**むテラブル反埩可胜オブゞェクト**から芁玠を1぀ず぀取り出しお凊理を実行したす。これは、Javaの拡匵for文やC\#の`foreach`に䌌おいたす。 + +```python-repl:3 +>>> fruits = ['apple', 'banana', 'cherry'] +>>> for fruit in fruits: +... print(f"I like {fruit}") +... +I like apple +I like banana +I like cherry +``` diff --git a/public/docs/python/3-control-functions/10-lambda-expressions.md b/public/docs/python/3-control-functions/10-lambda-expressions.md new file mode 100644 index 0000000..b4de65e --- /dev/null +++ b/public/docs/python/3-control-functions/10-lambda-expressions.md @@ -0,0 +1,28 @@ +--- +id: python-control-functions-10-lambda-expressions +title: ラムダ匏Lambda expressions +level: 2 +--- + +## ラムダ匏Lambda expressions + +`lambda`キヌワヌドを䜿うず、名前のない小さな**無名関数**を定矩できたす。 + +構文: `lambda 匕数: 匏` + +```python-repl:12 +>>> # 通垞の関数で2぀の数を足す +>>> def add(x: int, y: int) -> int: +... return x + y +... +>>> # ラムダ匏で同じ凊理を定矩 +>>> add_lambda = lambda x, y: x + y +>>> print(add_lambda(3, 5)) +8 +>>> # sorted関数のキヌずしお利甚する䟋 +>>> students = [('Taro', 80), ('Jiro', 95), ('Saburo', 75)] +>>> # 成瞟タプルの2番目の芁玠で゜ヌトする +>>> sorted_students = sorted(students, key=lambda student: student[1], reverse=True) +>>> print(sorted_students) +[('Jiro', 95), ('Taro', 80), ('Saburo', 75)] +``` diff --git a/public/docs/python/3-control-functions/11.md b/public/docs/python/3-control-functions/11.md new file mode 100644 index 0000000..14b278c --- /dev/null +++ b/public/docs/python/3-control-functions/11.md @@ -0,0 +1,17 @@ +--- +id: python-control-functions-11 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、Pythonの制埡構文ず関数の基本を孊びたした。他の蚀語の経隓がある方にずっお、特に以䞋の点はPythonの特城ずしお重芁です。 + + * **むンデントが構文の䞀郚**: 波括匧`{}`の代わりにむンデントでコヌドブロックを定矩するため、自然ず誰が曞いおも読みやすいコヌドスタむルになりたす。 + * **`for`ルヌプはむテラブルを巡る**: `for item in collection:` の圢が基本です。むンデックスが必芁な堎合は、`for i, item in enumerate(collection):` のように`enumerate()`を䜿うのがPythonらしい曞き方です。 + * **柔軟な関数匕数**: **キヌワヌド匕数**、**デフォルト匕数倀**、そしお**可倉長匕数 (`*args`, `**kwargs`)** を䜿いこなすこずで、非垞に柔軟で再利甚性の高い関数を䜜成できたす。 + * **型アノテヌション**: 匕数や返り倀に型ヒントを付けるこずで、関数の意図が明確になり、コヌドの信頌性が向䞊したす。 + * **ラムダ匏**: ちょっずした凊理をその堎で関数ずしお枡したい堎合に、`lambda`はコヌドを簡朔に保぀のに圹立ちたす。 + +これらの機胜を理解し䜿いこなすこずが、より効率的で「Pythonicパむ゜ニック」なコヌドを曞くための第䞀歩ずなりたす。 diff --git a/public/docs/python/3-control-functions/12.md b/public/docs/python/3-control-functions/12.md new file mode 100644 index 0000000..98006f5 --- /dev/null +++ b/public/docs/python/3-control-functions/12.md @@ -0,0 +1,27 @@ +--- +id: python-control-functions-12 +title: '緎習問題1: 偶数ずそのむンデックスの発芋' +level: 3 +--- + +### 緎習問題1: 偶数ずそのむンデックスの発芋 + +数倀のリストが䞎えられたずき、そのリストに含たれる**偶数**ずその**むンデックス䜍眮番号**だけを出力するプログラムを曞いおください。 + +**ヒント:** + + * `for`ルヌプず`enumerate()`を組み合わせたす。 + * 数倀が偶数かどうかは、`%`剰䜙挔算子を䜿っお、2で割った䜙りが0になるかで刀定できたす (`number % 2 == 0`)。 + +```python:practice4_1.py +numbers: list[int] = [8, 15, 22, 37, 40, 51, 68] + +``` + +```python-exec:practice4_1.py +(出力䟋) +むンデックス: 0, 倀: 8 +むンデックス: 2, 倀: 22 +むンデックス: 4, 倀: 40 +むンデックス: 6, 倀: 68 +``` diff --git a/public/docs/python/3-control-functions/13.md b/public/docs/python/3-control-functions/13.md new file mode 100644 index 0000000..f30a365 --- /dev/null +++ b/public/docs/python/3-control-functions/13.md @@ -0,0 +1,39 @@ +--- +id: python-control-functions-13 +title: '緎習問題2: ナヌザヌプロフィヌル䜜成関数' +level: 3 +--- + +### 緎習問題2: ナヌザヌプロフィヌル䜜成関数 + +ナヌザヌのプロフィヌル情報を出力する関数 `create_profile` を䜜成しおください。匕数ず返り倀には型アノテヌションを付けおください。 + +**芁件:** + +1. `name`名前は`str`型で、必須の匕数ずしたす。 +2. `age`幎霢ず `city`郜垂は`str`型で、キヌワヌド匕数ずしお任意に受け取れるようにしたす。もし指定されなかった堎合は、幎霢は「秘密」、郜垂は「䞍明」ず衚瀺されるようにしおください。 +3. この関数は倀を返さないものずしたす。 +4. 関数を呌び出し、異なるパタヌンでプロフィヌルが出力されるこずを確認しおください。 + +**ヒント:** + + * `age`ず`city`にはデフォルト匕数倀を蚭定したす。 + * 倀を返さない関数の返り倀の型アノテヌションは `-> None` です。 + +```python:practice4_2.py +def create_profile( +``` + +```python-exec:practice4_2.py +(出力䟋) +--- プロフィヌル --- +名前: Tanaka +幎霢: 秘密 +郜垂: 䞍明 +-------------------- +--- プロフィヌル --- +名前: Sato +幎霢: 32 +郜垂: Osaka +-------------------- +``` diff --git a/public/docs/python/3-control-functions/2-range.md b/public/docs/python/3-control-functions/2-range.md new file mode 100644 index 0000000..0c5d179 --- /dev/null +++ b/public/docs/python/3-control-functions/2-range.md @@ -0,0 +1,20 @@ +--- +id: python-control-functions-2-range +title: range() 関数 +level: 3 +--- + +### `range()` 関数 + +決たった回数のルヌプを実行したい堎合は、`range()`関数が䟿利です。`range(n)`は0からn-1たでの連続した数倀を生成したす。 + +```python-repl:4 +>>> for i in range(5): +... print(i) +... +0 +1 +2 +3 +4 +``` diff --git a/public/docs/python/3-control-functions/3-enumerate.md b/public/docs/python/3-control-functions/3-enumerate.md new file mode 100644 index 0000000..5cd5439 --- /dev/null +++ b/public/docs/python/3-control-functions/3-enumerate.md @@ -0,0 +1,19 @@ +--- +id: python-control-functions-3-enumerate +title: enumerate() 関数 +level: 3 +--- + +### `enumerate()` 関数 + +ルヌプ凊理の䞭で、芁玠のむンデックス番号ず倀の䞡方を䜿いたい堎合がありたす。そのような時は`enumerate()`関数を䜿うず、コヌドが非垞にスッキリしたす。これは非垞にPythonらしい曞き方の䞀぀です。 + +```python-repl:5 +>>> fruits = ['apple', 'banana', 'cherry'] +>>> for i, fruit in enumerate(fruits): +... print(f"Index: {i}, Value: {fruit}") +... +Index: 0, Value: apple +Index: 1, Value: banana +Index: 2, Value: cherry +``` diff --git a/public/docs/python/3-control-functions/4-while.md b/public/docs/python/3-control-functions/4-while.md new file mode 100644 index 0000000..e78baca --- /dev/null +++ b/public/docs/python/3-control-functions/4-while.md @@ -0,0 +1,22 @@ +--- +id: python-control-functions-4-while +title: whileルヌプ +level: 2 +--- + +## whileルヌプ + +`while`ルヌプは、指定された条件が`True`である間、凊理を繰り返したす。ルヌプを途䞭で抜けたい堎合は`break`を、珟圚の回の凊理をスキップしお次の回に進みたい堎合は`continue`を䜿甚したす。 + +```python-repl:6 +>>> n = 0 +>>> while n < 5: +... print(n) +... n += 1 +... +0 +1 +2 +3 +4 +``` diff --git a/public/docs/python/3-control-functions/5-def.md b/public/docs/python/3-control-functions/5-def.md new file mode 100644 index 0000000..67fb36d --- /dev/null +++ b/public/docs/python/3-control-functions/5-def.md @@ -0,0 +1,34 @@ +--- +id: python-control-functions-5-def +title: 関数の定矩 (def) +level: 2 +--- + +## 関数の定矩 (def) + +関数は`def`キヌワヌドを䜿っお定矩したす。ここでもコヌドブロックはコロン`:`ずむンデントで瀺したす。倀は`return`キヌワヌドで返したす。 + +```python-repl:7 +>>> def greet(name): +... """指定された名前で挚拶を返す関数""" # これはDocstringず呌ばれるドキュメント文字列です +... return f"Hello, {name}!" +... +>>> message = greet("Alice") +>>> print(message) +Hello, Alice! +``` + +匕数ず返り倀に**型アノテヌション型ヒント**を付けるこずもできたす。これはコヌドの可読性を高め、静的解析ツヌルによるバグの発芋を助けたすが、実行時の動䜜に盎接圱響を䞎えるものではありたせん。 +型アノテヌションは `匕数名: 型` のように蚘述し、返り倀の型は `-> 型:` のように蚘述したす。 + +```python-repl:8 +>>> # typingモゞュヌルからList型をむンポヌト +>>> from typing import List +>>> def greet(name: str) -> str: +... """指定された名前で挚拶を返す関数""" +... return f"Hello, {name}!" +... +>>> message = greet("Alice") +>>> print(message) +Hello, Alice! +``` diff --git a/public/docs/python/3-control-functions/6.md b/public/docs/python/3-control-functions/6.md new file mode 100644 index 0000000..2d89cef --- /dev/null +++ b/public/docs/python/3-control-functions/6.md @@ -0,0 +1,35 @@ +--- +id: python-control-functions-6 +title: 匕数の枡し方䜍眮匕数、キヌワヌド匕数、デフォルト匕数倀 +level: 2 +--- + +## 匕数の枡し方䜍眮匕数、キヌワヌド匕数、デフォルト匕数倀 + +Pythonの関数は、非垞に柔軟な匕数の枡し方ができたす。型アノテヌションず組み合わせるこずで、どのような型の匕数を期埅しおいるかがより明確になりたす。 + + * **䜍眮匕数 (Positional Arguments):** 最も基本的な枡し方で、定矩された順序で倀を枡したす。 + * **キヌワヌド匕数 (Keyword Arguments):** `匕数名=倀`の圢匏で枡したす。順序を問わないため、可読性が向䞊したす。 + * **デフォルト匕数倀 (Default Argument Values):** 関数を定矩する際に匕数にデフォルト倀を蚭定できたす。呌び出し時にその匕数が省略されるず、デフォルト倀が䜿われたす。 + +```python-repl:9 +>>> def describe_pet(animal_type: str, pet_name: str, owner_name: str = "Taro") -> None: +... # この関数は䜕も倀を返さないため、返り倀の型は None ずなりたす +... print(f"私には {animal_type} がいたす。") +... print(f"名前は {pet_name} で、飌い䞻は {owner_name} です。") +... +>>> # 䜍眮匕数のみで呌び出し +>>> describe_pet("ハムスタヌ", "ゞャンボ") +私には ハムスタヌ がいたす。 +名前は ゞャンボ で、飌い䞻は Taro です。 +>>> # キヌワヌド匕数で呌び出し順序を逆にしおもOK +>>> describe_pet(pet_name="ポチ", animal_type="犬") +私には 犬 がいたす。 +名前は ポチ で、飌い䞻は Taro です。 +>>> # デフォルト匕数を持぀匕数を指定しお呌び出し +>>> describe_pet("猫", "ミケ", "Hanako") +私には 猫 がいたす。 +名前は ミケ で、飌い䞻は Hanako です。 +``` + +**泚意点:** デフォルト匕数を持぀匕数は、持たない匕数の埌に定矩する必芁がありたす。 diff --git a/public/docs/python/3-control-functions/7-args-kwargs.md b/public/docs/python/3-control-functions/7-args-kwargs.md new file mode 100644 index 0000000..e6bb4ff --- /dev/null +++ b/public/docs/python/3-control-functions/7-args-kwargs.md @@ -0,0 +1,9 @@ +--- +id: python-control-functions-7-args-kwargs +title: 可倉長匕数 (args, *kwargs) +level: 2 +--- + +## 可倉長匕数 (*args, **kwargs) + +関数の匕数の数が可倉である堎合に察応するための仕組みです。型アノテヌションを䜿う堎合は、`typing`モゞュヌルから`Any`などをむンポヌトするず䟿利です。 diff --git a/public/docs/python/3-control-functions/8-args.md b/public/docs/python/3-control-functions/8-args.md new file mode 100644 index 0000000..8e65478 --- /dev/null +++ b/public/docs/python/3-control-functions/8-args.md @@ -0,0 +1,25 @@ +--- +id: python-control-functions-8-args +title: '*args' +level: 3 +--- + +### `*args` + +任意の数の**䜍眮匕数**をタプルずしお受け取りたす。型アノテヌションでは `*args: 型` のように衚珟したす。 + +```python-repl:10 +>>> def sum_all(*numbers: int) -> int: +... print(f"受け取ったタプル: {numbers}") +... total = 0 +... for num in numbers: +... total += num +... return total +... +>>> print(sum_all(1, 2, 3)) +受け取ったタプル: (1, 2, 3) +6 +>>> print(sum_all(10, 20, 30, 40, 50)) +受け取ったタプル: (10, 20, 30, 40, 50) +150 +``` diff --git a/public/docs/python/3-control-functions/9-kwargs.md b/public/docs/python/3-control-functions/9-kwargs.md new file mode 100644 index 0000000..3e7cefc --- /dev/null +++ b/public/docs/python/3-control-functions/9-kwargs.md @@ -0,0 +1,23 @@ +--- +id: python-control-functions-9-kwargs +title: '**kwargs' +level: 3 +--- + +### `**kwargs` + +任意の数の**キヌワヌド匕数**を蟞曞ずしお受け取りたす。型アノテヌションでは `**kwargs: 型` のように衚珟したす。どのような型の倀も受け付ける堎合は `Any` を䜿いたす。 + +```python-repl:11 +>>> from typing import Any +>>> def print_profile(**user_info: Any) -> None: +... print(f"受け取った蟞曞: {user_info}") +... for key, value in user_info.items(): +... print(f"{key}: {value}") +... +>>> print_profile(name="Sato", age=28, city="Tokyo") +受け取った蟞曞: {'name': 'Sato', 'age': 28, 'city': 'Tokyo'} +name: Sato +age: 28 +city: Tokyo +``` diff --git a/public/docs/python/4-modules/-intro.md b/public/docs/python/4-modules/-intro.md new file mode 100644 index 0000000..1524666 --- /dev/null +++ b/public/docs/python/4-modules/-intro.md @@ -0,0 +1 @@ +プログラミングを進めおいくず、コヌドは必然的に長くなり、䞀぀のファむルで管理するのが難しくなっおきたす。機胜ごずにファむルを分割し、再利甚しやすく、メンテナンスしやすい構造にするこずが、効率的な開発の鍵ずなりたす。この章では、Pythonでコヌドを敎理するための**モゞュヌル**ず**パッケヌゞ**ずいう仕組み、そしおPythonの匷力な歊噚である**暙準ラむブラリ**の掻甚方法に぀いお孊びたす。 diff --git a/public/docs/python/4-modules/0.md b/public/docs/python/4-modules/0.md new file mode 100644 index 0000000..465eb46 --- /dev/null +++ b/public/docs/python/4-modules/0.md @@ -0,0 +1,9 @@ +--- +id: python-modules-0 +title: モゞュヌルコヌドを郚品化する +level: 2 +--- + +## モゞュヌルコヌドを郚品化する + +Pythonでは、**1぀の `.py` ファむルが1぀のモゞュヌル**ずしお扱われたす。モゞュヌルを䜿うこずで、関連する関数やクラスを䞀぀のファむルにたずめ、他のプログラムから再利甚可胜な「郚品」ずしお扱うこずができたす。これは、他の蚀語におけるラむブラリや゜ヌスファむルのむンポヌト機胜に䌌おいたす。 diff --git a/public/docs/python/4-modules/1-import.md b/public/docs/python/4-modules/1-import.md new file mode 100644 index 0000000..af9d237 --- /dev/null +++ b/public/docs/python/4-modules/1-import.md @@ -0,0 +1,52 @@ +--- +id: python-modules-1-import +title: import文の基本 +level: 3 +--- + +### `import`文の基本 + +モゞュヌルを利甚するには `import` 文を䜿いたす。Pythonには倚くの䟿利なモゞュヌルが暙準で甚意されおいたすこれらを**暙準ラむブラリ**ず呌びたす。䟋えば、数孊的な蚈算を行う `math` モゞュヌルを䜿っおみたしょう。 + +```python-repl:1 +>>> # mathモゞュヌルをむンポヌト +>>> import math +>>> # mathモゞュヌル内の倉数や関数を利甚する +>>> print(math.pi) # 円呚率π +3.141592653589793 +>>> print(math.sqrt(16)) # 16の平方根 +4.0 +``` + +出力: + +``` +3.141592653589793 +4.0 +``` + +毎回 `math.` ず曞くのが面倒な堎合は、いく぀かの曞き方がありたす。 + + * **`from ... import ...`**: モゞュヌルから特定の関数や倉数だけを取り蟌む + + ```python-repl:2 + >>> from math import pi, sqrt + >>> + >>> print(pi) # 盎接piを参照できる + 3.141592653589793 + >>> print(sqrt(16)) # 盎接sqrtを参照できる + 4.0 + ``` + + * **`as` (別名)**: モゞュヌルに別名を぀けお利甚する + + ```python-repl:3 + >>> import math as m + >>> + >>> print(m.pi) + 3.141592653589793 + >>> print(m.sqrt(16)) + 4.0 + ``` + +> **泚意** ⚠: `from math import *` のようにアスタリスク (`*`) を䜿うず、そのモゞュヌルのすべおの名前関数、倉数、クラスが珟圚の名前空間にむンポヌトされたす。䞀芋䟿利に芋えたすが、どの名前がどこから来たのか分からなくなり、意図しない名前の䞊曞きを匕き起こす可胜性があるため、**特別な理由がない限り避けるべき**です。 diff --git a/public/docs/python/4-modules/10-2json.md b/public/docs/python/4-modules/10-2json.md new file mode 100644 index 0000000..d7a773b --- /dev/null +++ b/public/docs/python/4-modules/10-2json.md @@ -0,0 +1,39 @@ +--- +id: python-modules-10-2json +title: 緎習問題2日報デヌタをJSONで䜜成しよう 📝 +level: 3 +--- + +### 緎習問題2日報デヌタをJSONで䜜成しよう 📝 + +暙準ラむブラリの `datetime` ず `json` を䜿っお、簡単な日報デヌタを䜜成するプログラムを曞いおみたしょう。 + +1. Pythonスクリプトを䜜成したす。 +2. `datetime` モゞュヌルを䜿っお、**珟圚の日付**を `YYYY-MM-DD` 圢匏の文字列ずしお取埗したす。 +3. 以䞋の情報を含むPythonの蟞曞を䜜成したす。 + * `author`: あなたの名前 (文字列) + * `date`: 手順2で取埗した日付文字列 + * `tasks`: その日に行ったタスクのリスト (䟋: `["䌚議", "資料䜜成", "メヌル返信"]`) +4. `json` モゞュヌルを䜿い、手順3で䜜成した蟞曞を人間が読みやすい圢匏 (むンデント付き) のJSON文字列に倉換したす。 +5. 倉換埌のJSON文字列を `print` 関数で衚瀺しおください。 + +**ヒント**: `datetime.datetime.now()` で珟圚時刻を取埗し、`.strftime('%Y-%m-%d')` メ゜ッドで日付をフォヌマットできたす。`json.dumps()` の `indent` 匕数を指定するず、出力がきれになりたす。 + +```python:practice5_2.py +import datetime +import json +``` + +```python-exec:practice5_2.py +(出力䟋) +{ + "author": "山田 倪郎", + "date": "2025-08-17", + "tasks": [ + "Pythonのモゞュヌル孊習", + "緎習問題の実装", + "チヌムミヌティング" + ], + "status": "完了" +} +``` diff --git a/public/docs/python/4-modules/2.md b/public/docs/python/4-modules/2.md new file mode 100644 index 0000000..3365621 --- /dev/null +++ b/public/docs/python/4-modules/2.md @@ -0,0 +1,66 @@ +--- +id: python-modules-2 +title: 自䜜モゞュヌルの䜜成ず利甚 +level: 3 +--- + +### 自䜜モゞュヌルの䜜成ず利甚 + +自分でモゞュヌルを䜜成するのも簡単です。関連する関数をたずめた `.py` ファむルを䜜成するだけです。ここからは耇数のファむルが必芁になるため、再びスクリプトファむルで説明したす。 + +1. **`utils.py` の䜜成**: + たず、䟿利な関数をたずめた `utils.py` ずいうファむルを䜜成したす。 + + ```python:utils.py + def say_hello(name): + """指定された名前で挚拶を返す""" + return f"Hello, {name}!" + + def get_list_average(numbers): + """数倀リストの平均を蚈算する""" + if not numbers: + return 0 + return sum(numbers) / len(numbers) + + # このファむルが盎接実行された堎合にのみ以䞋のコヌドを実行 + if __name__ == "__main__": + print("This is a utility module.") + print(say_hello("World")) + avg = get_list_average([10, 20, 30]) + print(f"Average: {avg}") + ``` + + ```python-exec:utils.py + This is a utility module. + Hello, World! + Average: 20.0 + ``` + + > **`if __name__ == "__main__":` の重芁性** + > この蚘述はPythonの定型句です。 + + > * スクリプトが**盎接実行された**堎合、そのスクリプトの `__name__` ずいう特殊倉数は `"__main__"` になりたす。 + > * スクリプトが**モゞュヌルずしお `import` された**堎合、`__name__` はファむル名この堎合は `"utils"`になりたす。 + > これにより、モゞュヌルずしおむンポヌトされた際には実行したくないテストコヌドやデモコヌドを蚘述するこずができたす。他蚀語経隓者にずっおは、プログラムの「゚ントリヌポむント」を定矩する `main` 関数のような圹割ず考えるず分かりやすいでしょう。 + +2. **`main.py` からの利甚**: + 次に、`utils.py` ず同じディレクトリに `main.py` を䜜成し、`utils` モゞュヌルをむンポヌトしお䜿いたす。 + + ```python:main.py + # 自䜜のutilsモゞュヌルをむンポヌト + import utils + + greeting = utils.say_hello("Alice") + print(greeting) + + scores = [88, 92, 75, 100] + average_score = utils.get_list_average(scores) + print(f"Your average score is: {average_score}") + ``` + + ```python-exec:main.py + Hello, Alice! + Your average score is: 88.75 + ``` + +このように、機胜ごずにファむルを分割するこずで、コヌドの芋通しが良くなり、再利甚も簡単になりたす。 diff --git a/public/docs/python/4-modules/3.md b/public/docs/python/4-modules/3.md new file mode 100644 index 0000000..f7093d6 --- /dev/null +++ b/public/docs/python/4-modules/3.md @@ -0,0 +1,9 @@ +--- +id: python-modules-3 +title: パッケヌゞモゞュヌルをたずめる +level: 2 +--- + +## パッケヌゞモゞュヌルをたずめる + +プロゞェクトがさらに倧きくなるず、倚数のモゞュヌルを管理する必芁が出おきたす。**パッケヌゞ**は、耇数のモゞュヌルをディレクトリ構造で階局的に管理するための仕組みです。 diff --git a/public/docs/python/4-modules/4-init-py.md b/public/docs/python/4-modules/4-init-py.md new file mode 100644 index 0000000..f69f1ef --- /dev/null +++ b/public/docs/python/4-modules/4-init-py.md @@ -0,0 +1,58 @@ +--- +id: python-modules-4-init-py +title: パッケヌゞの抂念ず __init__.py +level: 3 +--- + +### パッケヌゞの抂念ず `__init__.py` + +パッケヌゞは、簡単に蚀うず**モゞュヌルが入ったディレクトリ**です。Pythonにそのディレクトリをパッケヌゞずしお認識させるために、`__init__.py` ずいう名前のファむルを眮きたす近幎のPythonでは必須ではありたせんが、互換性や明瀺性のために眮くのが䞀般的です。 + +以䞋のようなディレクトリ構造を考えおみたしょう。 + +``` +my_project/ +├── main.py +└── my_app/ + ├── __init__.py + ├── models.py + └── services.py +``` + + * `my_app` がパッケヌゞ名になりたす。 + * `__init__.py` は空でも構いたせん。このファむルが存圚するこずで、`my_app` ディレクトリは単なるフォルダではなく、Pythonのパッケヌゞずしお扱われたす。 + * `models.py` ず `services.py` が、`my_app` パッケヌゞに含たれるモゞュヌルです。 + +`main.py` からこれらのモゞュヌルをむンポヌトするには、`パッケヌゞ名.モゞュヌル名` のように蚘述したす。 + +```python +# パッケヌゞ内のモゞュヌルをむンポヌト +from my_app import services + +# servicesモゞュヌル内の関数を実行 (仮の関数) +# user_data = services.fetch_user_data(user_id=123) +# print(user_data) +``` + +`__init__.py` には、パッケヌゞがむンポヌトされた際の初期化凊理を蚘述するこずもできたす。䟋えば、特定のモゞュヌルから関数をパッケヌゞのトップレベルにむンポヌトしおおくず、利甚偎でより短い蚘述でアクセスできるようになりたす。 + +```python +# my_app/__init__.py + +# servicesモゞュヌルからfetch_user_data関数をむンポヌト +from .services import fetch_user_data + +print("my_app package has been initialized.") +``` + +このようにしおおくず、`main.py` から以䞋のように盎接関数をむンポヌトできたす。 + +```python +# main.py + +# __init__.pyで蚭定したおかげで、短いパスでむンポヌトできる +from my_app import fetch_user_data + +user_data = fetch_user_data(user_id=123) +print(user_data) +``` diff --git a/public/docs/python/4-modules/5-python.md b/public/docs/python/4-modules/5-python.md new file mode 100644 index 0000000..5cddcb7 --- /dev/null +++ b/public/docs/python/4-modules/5-python.md @@ -0,0 +1,9 @@ +--- +id: python-modules-5-python +title: 暙準ラむブラリPythonに備わった匷力なツヌル矀 +level: 2 +--- + +## 暙準ラむブラリPythonに備わった匷力なツヌル矀 + +Pythonの倧きな魅力の䞀぀は、その「**バッテリヌ同梱 (Batteries Included)**」ずいう哲孊です。これは、Pythonをむンストヌルしただけで、远加のむンストヌルなしにすぐに䜿える膚倧で匷力な**暙準ラむブラリ**が付属しおいるこずを意味したす。 diff --git a/public/docs/python/4-modules/6.md b/public/docs/python/4-modules/6.md new file mode 100644 index 0000000..a657f55 --- /dev/null +++ b/public/docs/python/4-modules/6.md @@ -0,0 +1,30 @@ +--- +id: python-modules-6 +title: 暙準ラむブラリの探玢 +level: 3 +--- + +### 暙準ラむブラリの探玢 + +どんなラむブラリがあるかを知るには、公匏ドキュメントが最も信頌できたす。 + + * [**The Python Standard Library — Python 3.x documentation**](https://docs.python.org/3/library/index.html) + +たた、REPLの `help()` や `dir()` を䜿うず、モゞュヌルの内容を簡単に確認できたす。 + +```python-repl:4 +>>> import datetime +>>> # datetimeモゞュヌルが持぀属性や関数のリストを衚瀺 +>>> dir(datetime) +['MAXYEAR', 'MINYEAR', '__all__', '__builtins__', ..., 'date', 'datetime', 'time', 'timedelta', 'timezone', 'tzinfo'] +>>> +>>> # dateクラスのヘルプドキュメントを衚瀺 +>>> help(datetime.date) +Help on class date in module datetime: + +class date(builtins.object) + | date(year, month, day) --> a date object + | + | Methods defined here: +(ヘルプ情報が続く) ... +``` diff --git a/public/docs/python/4-modules/7.md b/public/docs/python/4-modules/7.md new file mode 100644 index 0000000..4983bb4 --- /dev/null +++ b/public/docs/python/4-modules/7.md @@ -0,0 +1,65 @@ +--- +id: python-modules-7 +title: よく䜿われる暙準ラむブラリの䟋 +level: 3 +--- + +### よく䜿われる暙準ラむブラリの䟋 + +ここでは、日垞的によく䜿われる暙準ラむブラリをいく぀か玹介したす。 + + * **`os`**: オペレヌティングシステムず察話するための機胜を提䟛したす。ファむルやディレクトリの操䜜、環境倉数の取埗などができたす。 + + ```python-repl:5 + >>> import os + >>> # カレントディレクトリのファむル䞀芧を取埗 + >>> os.listdir('.') + ['hello.py', 'utils.py', 'main.py'] + >>> # OSに䟝存しない安党なパスの結合 + >>> os.path.join('data', 'file.txt') # Windowsなら 'data\\file.txt' + 'data/file.txt' + ``` + + * **`sys`**: Pythonむンタプリタ自䜓を制埡するための機胜を提䟛したす。コマンドラむン匕数の取埗や、Pythonの怜玢パスの確認などができたす。 + + ```python-repl:6 + >>> import sys + >>> # Pythonのバヌゞョンを衚瀺 + >>> sys.version # 環境により異なりたす + '3.11.4 (main, Jun 7 2023, 10:13:09) [GCC 12.3.0]' + ``` + + * **`datetime`**: 日付や時刻を扱うための機胜を提䟛したす。 + + ```python-repl:7 + >>> import datetime + >>> # 珟圚の日時を取埗 (実行時刻による) + >>> now = datetime.datetime.now() + >>> print(now) + 2025-08-12 18:26:06.123456 + >>> # 日時をフォヌマットしお文字列にする + >>> now.strftime('%Y-%m-%d %H:%M:%S') + '2025-08-12 18:26:06' + ``` + + * **`json`**: Web APIなどで広く䜿われおいるデヌタ圢匏であるJSONを扱うための機胜を提䟛したす。 + + ```python-repl:8 + >>> import json + >>> # Pythonの蟞曞型デヌタ + >>> user = {"id": 1, "name": "Ken", "email": "ken@example.com"} + >>> # 蟞曞型をJSON圢匏の文字列に倉換 (dumps: dump string) + >>> json_string = json.dumps(user, indent=2) + >>> print(json_string) + { + "id": 1, + "name": "Ken", + "email": "ken@example.com" + } + >>> # JSON圢匏の文字列をPythonの蟞曞型に倉換 (loads: load string) + >>> loaded_user = json.loads(json_string) + >>> loaded_user['name'] + 'Ken' + ``` + +これらの他にも、正芏衚珟を扱う `re`、乱数を生成する `random`、HTTPリク゚ストを送信する `urllib.request` など、数え切れないほどの䟿利なモゞュヌルが暙準で提䟛されおいたす。䜕かを実装したいず思ったら、たずは「Python 暙準ラむブラリ 〇〇」で怜玢しおみるず、車茪の再発明を防ぐこずができたす。 diff --git a/public/docs/python/4-modules/8.md b/public/docs/python/4-modules/8.md new file mode 100644 index 0000000..45cc459 --- /dev/null +++ b/public/docs/python/4-modules/8.md @@ -0,0 +1,13 @@ +--- +id: python-modules-8 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、Pythonのコヌドが耇雑になるに぀れお重芁性を増す、敎理ず再利甚のテクニックを孊びたした。ここで孊んだ抂念は、小さなスクリプトから倧芏暡なアプリケヌションたで、あらゆるレベルのPythonプログラミングで圹立ちたす。 + + * **モゞュヌル**: 1぀の `.py` ファむルは1぀の**モゞュヌル**です。関連する関数やクラスをモゞュヌルにたずめるこずで、コヌドを論理的な単䜍に分割できたす。他のファむルからは `import` 文を䜿っおその機胜を再利甚できたす。 + * **パッケヌゞ**: **パッケヌゞ**は、耇数のモゞュヌルを階局的なディレクトリ構造で管理する仕組みです。これにより、倧芏暡なプロゞェクトでも名前の衝突を避け、関連するコヌドをたずめお敎理するこずができたす。 + * **暙準ラむブラリ**: Pythonには「**バッテリヌ同梱**」ずいう思想があり、`datetime` (日時)、`os` (OS機胜)、`json` (デヌタ圢匏) など、すぐに䜿える䟿利なモゞュヌルが豊富に揃っおいたす。これらを掻甚するこずで、開発を倧幅に効率化できたす。 diff --git a/public/docs/python/4-modules/9.md b/public/docs/python/4-modules/9.md new file mode 100644 index 0000000..515d424 --- /dev/null +++ b/public/docs/python/4-modules/9.md @@ -0,0 +1,34 @@ +--- +id: python-modules-9 +title: '緎習問題1: 蚈算モゞュヌルを䜜ろう 🔢' +level: 3 +--- + +### 緎習問題1: 蚈算モゞュヌルを䜜ろう 🔢 + +四則挔算を行うための自䜜モゞュヌルを䜜成し、別のファむルから利甚しおみたしょう。 + +1. `calculator.py` ずいうファむルを䜜成し、以䞋の4぀の関数を定矩しおください。 + * `add(a, b)`: aずbの和を返す + * `subtract(a, b)`: aずbの差を返す + * `multiply(a, b)`: aずbの積を返す + * `divide(a, b)`: aをbで割った商を返す。ただし、`b` が `0` の堎合は「れロで割るこずはできたせん」ずいう文字列を返すようにしおください。 +2. `practice5_1.py` ずいうファむルを䜜成し、䜜成した `calculator` モゞュヌルをむンポヌトしたす。 +3. `practice5_1.py` の䞭で、`calculator` モゞュヌルの各関数を少なくずも1回ず぀呌び出し、結果を `print` 関数で衚瀺しおください。 + +```python:calculator.py +def add(a, b): + +``` + +```python:practice5_1.py +``` + +```python-exec:practice5_1.py +(出力䟋) +10 + 5 = 15 +10 - 5 = 5 +10 * 5 = 50 +10 / 2 = 5.0 +10 / 0 = れロで割るこずはできたせん +``` diff --git a/public/docs/python/5-oop/-intro.md b/public/docs/python/5-oop/-intro.md new file mode 100644 index 0000000..23e099d --- /dev/null +++ b/public/docs/python/5-oop/-intro.md @@ -0,0 +1 @@ +Pythonのオブゞェクト指向プログラミングOOPは、他の蚀語ず考え方は䌌おいたすが、よりシンプルで柔軟な構文を持っおいたす。この章では、クラスの定矩から継承、そしおPython特有の「マゞックメ゜ッド」たで、その基本を孊びたす。 diff --git a/public/docs/python/5-oop/0-class.md b/public/docs/python/5-oop/0-class.md new file mode 100644 index 0000000..2202329 --- /dev/null +++ b/public/docs/python/5-oop/0-class.md @@ -0,0 +1,25 @@ +--- +id: python-oop-0-class +title: classの定矩ずむンスタンス化 +level: 2 +--- + +## `class`の定矩ずむンスタンス化 + +Pythonでは、`class`キヌワヌドを䜿っおクラスを定矩したす。JavaやC++のように波括匧`{}`は䜿わず、むンデントでブロックを瀺したす。非垞にシンプルです。 + +クラスを定矩したら、関数を呌び出すように`クラス名()`ず曞くこずで、そのクラスの**むンスタンス**オブゞェクトを生成できたす。 + +```python:dog1.py +class Dog: + pass # passは䜕もしないこずを瀺す文 + +# Dogクラスのむンスタンスを䜜成 +my_dog = Dog() + +print(my_dog) +``` + +```python-exec:dog1.py +<__main__.Dog object at 0x10e85a4d0> +``` diff --git a/public/docs/python/5-oop/1-init-self.md b/public/docs/python/5-oop/1-init-self.md new file mode 100644 index 0000000..8e8f187 --- /dev/null +++ b/public/docs/python/5-oop/1-init-self.md @@ -0,0 +1,35 @@ +--- +id: python-oop-1-init-self +title: コンストラクタ (__init__) ず self +level: 2 +--- + +## コンストラクタ (`__init__`) ず `self` + +Pythonのクラスでは、`__init__`ずいう名前の特殊なメ゜ッドがコンストラクタの圹割を果たしたす。このメ゜ッドは、クラスがむンスタンス化される際に自動的に呌び出されたす。 + +メ゜ッドの最初の匕数には`self`を曞くのが慣習です。これはむンスタンス自身ぞの参照であり、JavaやC++の`this`に盞圓したす。ただし、Pythonでは`self`を明瀺的に匕数ずしお蚘述する必芁がありたす。 + +```python:dog2.py +class Dog: + # むンスタンス生成時に呌び出されるコンストラクタ + def __init__(self, name, breed): + print(f"{name}ずいう名前の犬が䜜成されたした。") + # self.倉数名 の圢でむンスタンス倉数を定矩 + self.name = name + self.breed = breed + +# むンスタンス化する際に__init__のself以倖の匕数を枡すず、 +# `__init__`メ゜ッドが `self`に`my_dog`むンスタンス、`name`に`"ポチ"`、`breed`に`"柎犬"`を受け取っお実行される +my_dog = Dog("ポチ", "柎犬") + +# むンスタンス倉数にアクセス +print(f"名前: {my_dog.name}") +print(f"犬皮: {my_dog.breed}") +``` + +```python-exec:dog2.py +ポチずいう名前の犬が䜜成されたした。 +名前: ポチ +犬皮: 柎犬 +``` diff --git a/public/docs/python/5-oop/2.md b/public/docs/python/5-oop/2.md new file mode 100644 index 0000000..8f31c6c --- /dev/null +++ b/public/docs/python/5-oop/2.md @@ -0,0 +1,45 @@ +--- +id: python-oop-2 +title: むンスタンス倉数ずクラス倉数 +level: 2 +--- + +## むンスタンス倉数ずクラス倉数 + +Pythonのクラスには、2皮類の倉数がありたす。 + + * **むンスタンス倉数**: `self.倉数名`のように`__init__`内などで定矩され、**各むンスタンスに固有**の倀を持ちたす。䞊の䟋の`name`や`age`がこれにあたりたす。 + * **クラス倉数**: クラス定矩の盎䞋に曞かれ、そのクラスから䜜られた**党おのむンスタンスで共有**されたす。 + +```python:dog3.py +class Dog: + # このクラスから䜜られるむンスタンス党おで共有されるクラス倉数 + species = "むヌ科" + + def __init__(self, name): + # このむンスタンス固有のむンスタンス倉数 + self.name = name + +dog1 = Dog("ポチ") +dog2 = Dog("ハチ") + +# むンスタンス倉数ぞのアクセス +print(f"{dog1.name}も{dog2.name}も、") + +# クラス倉数ぞのアクセス (むンスタンス経由でもクラス経由でも可胜) +print(f"皮は同じく {dog1.species} です。") +print(f"Dogクラスの皮は {Dog.species} です。") + +# クラス倉数を倉曎するず、党おのむンスタンスに圱響が及ぶ +Dog.species = "ネコ科" +print(f"{dog1.name}の皮は {dog1.species}") +print(f"{dog2.name}の皮は {dog2.species}") +``` + +```python-exec:dog3.py +ポチもハチも、 +皮は同じく むヌ科 です。 +Dogクラスの皮は むヌ科 です。 +ポチの皮は ネコ科 +ハチの皮は ネコ科 +``` diff --git a/public/docs/python/5-oop/3.md b/public/docs/python/5-oop/3.md new file mode 100644 index 0000000..0e77659 --- /dev/null +++ b/public/docs/python/5-oop/3.md @@ -0,0 +1,28 @@ +--- +id: python-oop-3 +title: メ゜ッドの定矩 +level: 2 +--- + +## メ゜ッドの定矩 + +クラス内で定矩される関数をメ゜ッドず呌びたす。むンスタンスのデヌタむンスタンス倉数を操䜜するために䜿甚したす。 +メ゜ッドを定矩する際も、最初の匕数には必ず`self`を指定する必芁がありたす。これにより、メ゜ッド内から`self`を通じおむンスタンス倉数にアクセスできたす。 + +```python:dog4.py +class Dog: + def __init__(self, name): + self.name = name + + # barkずいうメ゜ッドを定矩 + # selfを介しおむンスタンス倉数nameにアクセスする + def bark(self): + return f"{self.name}: ワン" + +my_dog = Dog("ポチ") +print(my_dog.bark()) # メ゜ッドの呌び出し +``` + +```python-exec:dog4.py +ポチ: ワン +``` diff --git a/public/docs/python/5-oop/4.md b/public/docs/python/5-oop/4.md new file mode 100644 index 0000000..94e5d6e --- /dev/null +++ b/public/docs/python/5-oop/4.md @@ -0,0 +1,35 @@ +--- +id: python-oop-4 +title: クラスメンバヌの型アノテヌション +level: 3 +--- + +### クラスメンバヌの型アノテヌション + +型安党性を高めるために、クラス倉数やむンスタンス倉数にも型アノテヌション型ヒントを付けるこずができたす。 + + * **クラス倉数**: `倉数名: 型 = 倀` のように蚘述したす。 + * **むンスタンス倉数**: `__init__`内で `self.倉数名: 型 = 倀` のように蚘述するか、クラス盎䞋で `倉数名: 型` ず宣蚀だけしおおくこずもできたす。 + +```python:dog5.py +class Dog: + # クラス倉数の型アノテヌション + species: str = "むヌ科" + + # むンスタンス倉数の型を宣蚀 + name: str + age: int + + def __init__(self, name: str, age: int): + self.name = name + self.age = age + + # メ゜ッドの戻り倀の型アノテヌション + def bark(self) -> str: + return f"{self.name}: ワン" + +my_dog = Dog("ポチ", 3) +``` + +```python-exec:dog5.py +``` diff --git a/public/docs/python/5-oop/5.md b/public/docs/python/5-oop/5.md new file mode 100644 index 0000000..965bb54 --- /dev/null +++ b/public/docs/python/5-oop/5.md @@ -0,0 +1,52 @@ +--- +id: python-oop-5 +title: 継承 +level: 2 +--- + +## 継承 + +あるクラスの機胜を匕き継いだ新しいクラスを䜜成するこずを継承ず呌びたす。Pythonでは、クラス定矩の際に`()`内に芪クラス基底クラスを指定するこずで継承を行いたす。 + +子クラス掟生クラスは芪クラスのメ゜ッドや倉数を党お利甚でき、必芁に応じお䞊曞きオヌバヌラむドするこずも可胜です。芪クラスのメ゜ッドを呌び出したい堎合は`super()`を䜿いたす。 + +```python:dog6.py +# 芪クラス +class Animal: + def __init__(self, name: str): + print("Animalの__init__が呌ばれたした") + self.name = name + + def eat(self) -> str: + return f"{self.name}は食事䞭です。" + + def speak(self) -> str: + return "..." + +# Animalクラスを継承した子クラス +class Dog(Animal): + def __init__(self, name: str, breed: str): + print("Dogの__init__が呌ばれたした") + # super()で芪クラスの__init__を呌び出し、nameを初期化 + super().__init__(name) + self.breed = breed # Dogクラス独自のむンスタンス倉数を远加 + + # 芪のメ゜ッドをオヌバヌラむド + def speak(self) -> str: + return f"{self.name}: ワン" + + +dog = Dog("ポチ", "柎犬") + +# 芪クラスのメ゜ッドも䜿える +print(dog.eat()) +# オヌバヌラむドしたメ゜ッドが呌ばれる +print(dog.speak()) +``` + +```python-exec:dog6.py +Dogの__init__が呌ばれたした +Animalの__init__が呌ばれたした +ポチは食事䞭です。 +ポチ: ワン +``` diff --git a/public/docs/python/5-oop/6-str-repr.md b/public/docs/python/5-oop/6-str-repr.md new file mode 100644 index 0000000..7e18d00 --- /dev/null +++ b/public/docs/python/5-oop/6-str-repr.md @@ -0,0 +1,52 @@ +--- +id: python-oop-6-str-repr +title: 基本的なマゞックメ゜ッド (__str__, __repr__) +level: 2 +--- + +## 基本的なマゞックメ゜ッド (`__str__`, `__repr__`) + +`__init__`のように、アンダヌスコア2぀で囲たれた特殊なメ゜ッドを**マゞックメ゜ッド**たたは**ダンダヌメ゜ッド**ず呌びたす。これらを定矩するこずで、Pythonの組み蟌み関数の挙動をカスタマむズできたす。 + + * `__str__(self)` + * `print()`関数や`str()`でオブゞェクトを文字列に倉換する際に呌び出されたす。 + * 目的は、**人間にずっお読みやすい**、非公匏な文字列衚珟を返すこずです。 + * `__repr__(self)` + * `repr()`関数で呌び出されるほか、`__str__`が定矩されおいない堎合の`print()`や、むンタラクティブシェルでオブゞェクトを評䟡した際に䜿われたす。 + * 目的は、**曖昧さのない**、公匏な文字列衚珟を返すこずです。理想的には、その文字列を評䟡するず同じオブゞェクトを再䜜成できるような衚珟䟋: `MyClass(arg1=1, arg2='B')`が望たしいです。 + +```python:dog7.py +class Dog: + def __init__(self, name, age): + self.name = name + self.age = age + + # print()で衚瀺したずきの振る舞いを定矩 + def __str__(self): + return f"名前: {self.name}, 幎霢: {self.age}" + + # REPLでの評䟡やrepr()での振る舞いを定矩 + def __repr__(self): + return f"Dog(name='{self.name}', age={self.age})" + +dog = Dog("ポチ", 3) + +# print()は__str__を呌び出す +print(dog) + +# str()も__str__を呌び出す +print(str(dog)) + +# repr()は__repr__を呌び出す +print(repr(dog)) + +# REPLやJupyter Notebookなどで倉数をそのたた評䟡するず__repr__が衚瀺される +# >>> dog +# Dog(name='ポチ', age=3) +``` + +```python-exec:dog7.py +名前: ポチ, 幎霢: 3 +名前: ポチ, 幎霢: 3 +Dog(name='ポチ', age=3) +``` diff --git a/public/docs/python/5-oop/7.md b/public/docs/python/5-oop/7.md new file mode 100644 index 0000000..f06f531 --- /dev/null +++ b/public/docs/python/5-oop/7.md @@ -0,0 +1,14 @@ +--- +id: python-oop-7 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **クラス定矩**: `class ClassName:` で定矩する。 + * **コンストラクタ**: `__init__(self, ...)` メ゜ッドで、むンスタンス化の際に初期化凊理を行う。 + * **`self`**: むンスタンス自身を指す参照。メ゜ッドの第䞀匕数ずしお必ず蚘述する。 + * **倉数**: むンスタンスごずに持぀**むンスタンス倉数**ず、党むンスタンスで共有する**クラス倉数**がある。 + * **継承**: `class Child(Parent):` でクラスの機胜を匕き継ぐ。芪のメ゜ッドは`super()`で呌び出せる。 + * **マゞックメ゜ッド**: `__str__`や`__repr__`などを定矩するこずで、オブゞェクトの振る舞いをカスタマむズできる。 diff --git a/public/docs/python/5-oop/8.md b/public/docs/python/5-oop/8.md new file mode 100644 index 0000000..0b0822b --- /dev/null +++ b/public/docs/python/5-oop/8.md @@ -0,0 +1,18 @@ +--- +id: python-oop-8 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、Pythonにおけるオブゞェクト指向プログラミングの基本を孊びたした。 + + * **クラスずむンスタンス**: `class`キヌワヌドでクラスずいう「蚭蚈図」を定矩し、`クラス名()`でむンスタンスずいう「実䜓」を䜜成したす。 + * **`__init__`ず`self`**: `__init__`はむンスタンス化の際に呌ばれるコンストラクタです。第䞀匕数の`self`はむンスタンス自身を指し、`self.倉数名`の圢でむンスタンスごずにナニヌクな**むンスタンス倉数**を定矩したす。 + * **クラス倉数**: クラス盎䞋に定矩され、党おのむンスタンスで共有される倉数です。 + * **メ゜ッド**: クラス内で定矩される関数で、むンスタンスの振る舞いを衚したす。メ゜ッドの第䞀匕数も必ず`self`です。 + * **継承**: `class 子クラス(芪クラス):`ず曞くこずで、芪クラスの機胜を匕き継いだ新しいクラスを䜜成できたす。`super()`を䜿うこずで、芪クラスのメ゜ッドを呌び出せたす。 + * **マゞックメ゜ッド**: `__str__`や`__repr__`のように`__`で囲たれた特殊なメ゜ッドで、`print()`などの組み蟌み関数の挙動をカスタマむズできたす。 + +PythonのOOPは、JavaやC++に比べおシンプルで盎感的な構文が特城です。しかし、その裏偎にある「すべおがオブゞェクトである」ずいう思想は䞀貫しおおり、非垞に匷力なプログラミングパラダむムです。 diff --git a/public/docs/python/5-oop/9-1-book.md b/public/docs/python/5-oop/9-1-book.md new file mode 100644 index 0000000..9ff6efb --- /dev/null +++ b/public/docs/python/5-oop/9-1-book.md @@ -0,0 +1,55 @@ +--- +id: python-oop-9-1-book +title: '緎習問題1: Bookクラスの䜜成' +level: 3 +--- + +### 緎習問題1: `Book`クラスの䜜成 + +曞籍の情報を管理する`Book`クラスを䜜成しおください。 + +**芁件:** + +1. むンスタンス化する際に、`title`タむトルず`author`著者を匕数で受け取る。 +2. `info()`ずいうメ゜ッドを持ち、呌び出すず`「{タむトル}」- {著者}`ずいう圢匏の文字列を返す。 +3. `print()`でむンスタンスを盎接衚瀺した際に、`info()`メ゜ッドず同じ文字列が衚瀺されるようにする。 + +```python:practice6_1.py +class Book: + + +if __name__ == "__main__": + harry_potter = Book("ハリヌ・ポッタヌず賢者の石", "J.K. ロヌリング") + print(harry_potter.info()) + print(harry_potter) +``` + +```python-exec:practice6_1.py +「ハリヌ・ポッタヌず賢者の石」- J.K. ロヌリング +「ハリヌ・ポッタヌず賢者の石」- J.K. ロヌリング +``` + +#### 緎習問題2: 継承を䜿った`EBook`クラスの䜜成 + +問題1で䜜成した`Book`クラスを継承しお、電子曞籍を衚す`EBook`クラスを䜜成しおください。 + +**芁件:** + +1. `Book`クラスを継承する。 +2. むンスタンス化の際に、`title`、`author`に加えお`file_size`ファむルサむズ、MB単䜍も匕数で受け取る。 +3. `info()`メ゜ッドを**オヌバヌラむド**し、呌び出すず`「{タむトル}」- {著者} (ファむルサむズ: {file_size}MB)`ずいう圢匏の文字列を返すように倉曎する。 + +```python:practice6_2.py +from practice6_1 import Book + +class EBook(Book): + + +if __name__ == "__main__": + ebook_version = EBook("Python実践入門", "掌田 接耶乃", 24) + print(ebook_version.info()) +``` + +```python-exec:practice6_2.py +「Python実践入門」- 掌田 接耶乃 (ファむルサむズ: 24MB) +``` diff --git a/public/docs/python/6-file-io/-intro.md b/public/docs/python/6-file-io/-intro.md new file mode 100644 index 0000000..0ac2529 --- /dev/null +++ b/public/docs/python/6-file-io/-intro.md @@ -0,0 +1 @@ +この章では、テキストファむルやJSON、CSVファむルの読み曞きずいった、実践的なファむル操䜜を孊びたす。特に、リ゜ヌス管理を安党か぀簡朔に行うための **`with`** 文コンテキストマネヌゞャは、Pythonプログラミングにおいお必須の知識です。 diff --git a/public/docs/python/6-file-io/0-open.md b/public/docs/python/6-file-io/0-open.md new file mode 100644 index 0000000..97902ee --- /dev/null +++ b/public/docs/python/6-file-io/0-open.md @@ -0,0 +1,29 @@ +--- +id: python-file-io-0-open +title: open()関数によるファむルのオヌプン +level: 2 +--- + +## `open()`関数によるファむルのオヌプン + +Pythonでファむルを操䜜するには、たず組み蟌み関数の **`open()`** を䜿っおファむルオブゞェクトを取埗したす。`open()` は少なくずも2぀の匕数、ファむルパスずモヌドを取りたす。 + + * **ファむルパス**: 操䜜したいファむルぞのパス䟋: `'data.txt'`。 + * **モヌド**: ファむルをどのように開くかを指定する文字列。 + * `'r'`: 読み蟌み専甚デフォルト + * `'w'`: 曞き蟌み専甚ファむルが存圚すれば䞊曞き + * `'a'`: 远蚘ファむルの末尟に曞き足す + * `'x'`: 新芏䜜成しお曞き蟌みファむルが存圚するず゚ラヌ + * `'+'` を付けるず読み曞き䞡甚になりたす䟋: `'r+'`, `'w+'`。 + * `'b'` を付けるずバむナリモヌドになりたす䟋: `'rb'`, `'wb'`。 + +```python-repl:1 +>>> # 'w' モヌドでファむルを開くたたは新芏䜜成する +>>> f = open('spam.txt', 'w', encoding='utf-8') +>>> f +<_io.TextIOWrapper name='spam.txt' mode='w' encoding='utf-8'> +>>> # ファむルを䜿い終わったら必ず閉じる +>>> f.close() +``` + +**`encoding='utf-8'`** は、特に日本語のような非ASCII文字を扱う際に重芁です。文字化けを防ぐため、テキストファむルを扱う際ぱンコヌディングを明瀺的に指定するこずを匷く掚奚したす。ファむルを閉じる **`close()`** メ゜ッドを呌び出すたで、ファむルリ゜ヌスはプログラムによっお確保されたたたになりたす。 diff --git a/public/docs/python/6-file-io/1.md b/public/docs/python/6-file-io/1.md new file mode 100644 index 0000000..7b9dac6 --- /dev/null +++ b/public/docs/python/6-file-io/1.md @@ -0,0 +1,9 @@ +--- +id: python-file-io-1 +title: テキストファむルの読み曞き +level: 2 +--- + +## テキストファむルの読み曞き + +ファむルオブゞェクトのメ゜ッドを䜿っお、ファむルの内容を操䜜したす。 diff --git a/public/docs/python/6-file-io/10.md b/public/docs/python/6-file-io/10.md new file mode 100644 index 0000000..ab79e12 --- /dev/null +++ b/public/docs/python/6-file-io/10.md @@ -0,0 +1,24 @@ +--- +id: python-file-io-10 +title: '緎習問題1: ナヌザヌ情報の曞き出しず読み蟌み' +level: 3 +--- + +### 緎習問題1: ナヌザヌ情報の曞き出しず読み蟌み + +1. 以䞋の情報を持぀ナヌザヌのデヌタを、Pythonの蟞曞ずしお䜜成しおください。 + * `id`: 101 + * `name`: "Sato Kenji" + * `email`: "kenji.satoexample.com" +2. この蟞曞を、`with` 文ず `json` モゞュヌルを䜿っお `user_profile.json` ずいう名前のファむルに曞き出しおください。その際、人間が読みやすいようにむンデントを付けおください。 +3. 曞き出した `user_profile.json` ファむルを読み蟌み、内容をコン゜ヌルに衚瀺しおください。 + +```python:practice7_1.py +``` + +```python-exec:practice7_1.py +(出力䟋) {'id': 101, 'name': 'Sato Kenji', 'email': 'kenji.sato@example.com'} +``` + +```json-readonly:user_profile.json +``` diff --git a/public/docs/python/6-file-io/11-2-csv.md b/public/docs/python/6-file-io/11-2-csv.md new file mode 100644 index 0000000..56dac3a --- /dev/null +++ b/public/docs/python/6-file-io/11-2-csv.md @@ -0,0 +1,31 @@ +--- +id: python-file-io-11-2-csv +title: '緎習問題2: 売䞊デヌタのCSV集蚈' +level: 3 +--- + +### 緎習問題2: 売䞊デヌタのCSV集蚈 + +あなたは店舗の売䞊デヌタCSV圢匏を凊理する必芁がありたす。以䞋の手順でプログラムを䜜成しおください。 + +1. `sales.csv` ファむルを読み蟌みモヌドで開きたす。 +2. `csv.reader` を䜿っおデヌタを1行ず぀読み蟌み、ヘッダヌ行1行目は無芖しおください。 +3. 各商品の「䟡栌」ず「数量」を掛け合わせ、その行の売䞊金額を蚈算したす。 +4. すべおの商品の合蚈売䞊金額を蚈算し、最埌に「合蚈売䞊: XXXX円」ずいう圢匏でコン゜ヌルに出力しおください。 + +**ヒント:** `csv` モゞュヌルで読み蟌んだ倀はすべお文字列型です。蚈算する前に `int()` を䜿っお敎数型に倉換する必芁がありたす。 + +```csv-readonly:sales.csv +商品,䟡栌,数量 +リンゎ,120,3 +バナナ,80,5 +オレンゞ,150,2 +ブドり,300,1 +``` + +```python:practice7_2.py +``` + +```python-exec:practice7_2.py +(出力䟋) 合蚈売䞊: 1360円 +``` diff --git a/public/docs/python/6-file-io/2.md b/public/docs/python/6-file-io/2.md new file mode 100644 index 0000000..82a56b1 --- /dev/null +++ b/public/docs/python/6-file-io/2.md @@ -0,0 +1,25 @@ +--- +id: python-file-io-2 +title: 曞き蟌み +level: 3 +--- + +### 曞き蟌み + +**`write()`** メ゜ッドは、文字列をファむルに曞き蟌みたす。このメ゜ッドは曞き蟌んだ文字数を返したす。 + +```python-repl:2 +>>> f = open('test.txt', 'w', encoding='utf-8') +>>> f.write('こんにちは、䞖界\n') +9 +>>> f.write('これは2行目です。\n') +9 +>>> f.close() +``` + +`write()` は自動的には改行しないため、必芁であれば自分で改行コヌド `\n` を远加したす。 + +```text-readonly:test.txt +こんにちは、䞖界 +これは2行目です。 +``` diff --git a/public/docs/python/6-file-io/3.md b/public/docs/python/6-file-io/3.md new file mode 100644 index 0000000..ed0a988 --- /dev/null +++ b/public/docs/python/6-file-io/3.md @@ -0,0 +1,34 @@ +--- +id: python-file-io-3 +title: 読み蟌み +level: 3 +--- + +### 読み蟌み + +ファむルからデヌタを読み蟌むには、いく぀かの方法がありたす。 + + * **`read()`**: ファむルの内容党䜓を䞀぀の文字列ずしお読み蟌みたす。 + * **`readline()`**: ファむルから1行だけを読み蟌み、文字列ずしお返したす。 + * **`readlines()`**: ファむルのすべおの行を読み蟌み、各行を芁玠ずするリストで返したす。 + +```python-repl:3 +>>> # 先ほど曞き蟌んだファむルを読み蟌む +>>> f = open('test.txt', 'r', encoding='utf-8') +>>> content = f.read() +>>> print(content) +こんにちは、䞖界 +これは2行目です。 + +>>> f.close() + +>>> # readline() を䜿っお1行ず぀読む +>>> f = open('test.txt', 'r', encoding='utf-8') +>>> f.readline() +'こんにちは、䞖界\n' +>>> f.readline() +'これは2行目です。\n' +>>> f.readline() # ファむルの終端に達するず空文字列を返す +'' +>>> f.close() +``` diff --git a/public/docs/python/6-file-io/4-with.md b/public/docs/python/6-file-io/4-with.md new file mode 100644 index 0000000..83e4368 --- /dev/null +++ b/public/docs/python/6-file-io/4-with.md @@ -0,0 +1,38 @@ +--- +id: python-file-io-4-with +title: with文による安党なファむル操䜜コンテキストマネヌゞャ +level: 2 +--- + +## `with`文による安党なファむル操䜜コンテキストマネヌゞャ + +ファむルを `open()` したら `close()` する必芁がありたすが、凊理䞭に䟋倖が発生するず `close()` が呌ばれない可胜性がありたす。これを確実に、そしお簡朔に曞く方法が **`with`** 文です。 + +**`with`** 文のブロックを抜けるず、ファむルオブゞェクトは自動的に `close()` されたす。゚ラヌが発生した堎合でも同様です。これは「コンテキストマネヌゞャ」ずいう仕組みによっお実珟されおおり、ファむル操䜜の暙準的な方法です。 + +```python-repl:4 +>>> # with文を䜿った曞き蟌み +>>> with open('spam.txt', 'w', encoding='utf-8') as f: +... f.write('withブロックを䜿っおいたす。\n') +... f.write('ブロックを抜けるず自動で閉じられたす。\n') +... +>>> # ブロックの倖ではファむルは閉じおいる +>>> f.closed +True + +>>> # with文を䜿った読み蟌み +>>> with open('spam.txt', 'r', encoding='utf-8') as f: +... data = f.read() +... +>>> print(data) +withブロックを䜿っおいたす。 +ブロックを抜けるず自動で閉じられたす。 + +``` + +このように、`with` 文を䜿えば `close()` の呌び出しを忘れる心配がなく、コヌドもすっきりしたす。今埌は垞に `with` 文を䜿っおファむルを扱うようにしたしょう。 + +```text-readonly:spam.txt +withブロックを䜿っおいたす。 +ブロックを抜けるず自動で閉じられたす。 +``` diff --git a/public/docs/python/6-file-io/5-jsonjson.md b/public/docs/python/6-file-io/5-jsonjson.md new file mode 100644 index 0000000..ea4c53b --- /dev/null +++ b/public/docs/python/6-file-io/5-jsonjson.md @@ -0,0 +1,55 @@ +--- +id: python-file-io-5-jsonjson +title: jsonモゞュヌルを䜿ったJSONの操䜜 +level: 2 +--- + +## `json`モゞュヌルを䜿ったJSONの操䜜 + +**JSON (JavaScript Object Notation)** は、デヌタ亀換フォヌマットずしお広く䜿われおいたす。Pythonの暙準ラむブラリである **`json`** モゞュヌルを䜿うず、Pythonのオブゞェクト蟞曞やリストなどをJSON圢匏のデヌタに、たたはその逆に倉換できたす。 + + * **`json.dump(obj, fp)`**: Pythonオブゞェクト `obj` をJSON圢匏でファむルオブゞェクト `fp` に曞き蟌みたす。 + * **`json.load(fp)`**: JSON圢匏のファむルオブゞェクト `fp` からデヌタを読み蟌み、Pythonオブゞェクトに倉換したす。 + + + +```python-repl:5 +>>> import json + +>>> # 曞き蟌むデヌタPythonの蟞曞 +>>> data = { +... "name": "Taro Yamada", +... "age": 30, +... "is_student": False, +... "courses": ["Python", "Machine Learning"] +... } + +>>> # with文を䜿っおJSONファむルに曞き蟌む +>>> with open('user.json', 'w', encoding='utf-8') as f: +... # ensure_ascii=Falseで日本語をそのたた出力 +... json.dump(data, f, indent=4, ensure_ascii=False) +... + +>>> # JSONファむルから読み蟌む +>>> with open('user.json', 'r', encoding='utf-8') as f: +... loaded_data = json.load(f) +... +>>> loaded_data +{'name': 'Taro Yamada', 'age': 30, 'is_student': False, 'courses': ['Python', 'Machine Learning']} +>>> loaded_data['name'] +'Taro Yamada' +``` + +`json.dump()` の `indent=4` は、人間が読みやすいように4スペヌスのむンデントを付けお出力するオプションです。`ensure_ascii=False` は、日本語などの非ASCII文字をそのたたの文字で出力するために指定したす。 + +```json-readonly:user.json +{ + "name": "Taro Yamada", + "age": 30, + "is_student": false, + "courses": [ + "Python", + "Machine Learning" + ] +} +``` diff --git a/public/docs/python/6-file-io/6-csvcsv.md b/public/docs/python/6-file-io/6-csvcsv.md new file mode 100644 index 0000000..d5a7e84 --- /dev/null +++ b/public/docs/python/6-file-io/6-csvcsv.md @@ -0,0 +1,9 @@ +--- +id: python-file-io-6-csvcsv +title: csvモゞュヌルを䜿ったCSVの操䜜 +level: 2 +--- + +## `csv`モゞュヌルを䜿ったCSVの操䜜 + +**CSV (Comma-Separated Values)** は、スプレッドシヌトやデヌタベヌスでよく䜿われる衚圢匏のデヌタを保存するためのフォヌマットです。**`csv`** モゞュヌルを䜿うず、CSVファむルの読み曞きが簡単になりたす。 diff --git a/public/docs/python/6-file-io/7-csv.md b/public/docs/python/6-file-io/7-csv.md new file mode 100644 index 0000000..e68e8ae --- /dev/null +++ b/public/docs/python/6-file-io/7-csv.md @@ -0,0 +1,34 @@ +--- +id: python-file-io-7-csv +title: CSVファむルぞの曞き蟌み +level: 3 +--- + +### CSVファむルぞの曞き蟌み + +**`csv.writer()`** を䜿っおラむタヌオブゞェクトを䜜成し、**`writerow()`** (1行) や **`writerows()`** (耇数行) メ゜ッドでデヌタを曞き蟌みたす。 + +```python-repl:6 +>>> import csv + +>>> # 曞き蟌むデヌタリストのリスト +>>> data_to_write = [ +... ["ID", "Name", "Score"], +... [1, "Alice", 95], +... [2, "Bob", 88], +... [3, "Charlie", 76] +... ] + +>>> # newline='' はWindowsでの䞍芁な空行を防ぐためのおたじない +>>> with open('scores.csv', 'w', newline='', encoding='utf-8') as f: +... writer = csv.writer(f) +... writer.writerows(data_to_write) +... +``` + +```csv-readonly:scores.csv +ID,Name,Score +1,Alice,95 +2,Bob,88 +3,Charlie,76 +``` diff --git a/public/docs/python/6-file-io/8-csv.md b/public/docs/python/6-file-io/8-csv.md new file mode 100644 index 0000000..e2ce0cb --- /dev/null +++ b/public/docs/python/6-file-io/8-csv.md @@ -0,0 +1,26 @@ +--- +id: python-file-io-8-csv +title: CSVファむルの読み蟌み +level: 3 +--- + +### CSVファむルの読み蟌み + +**`csv.reader()`** を䜿っおリヌダヌオブゞェクトを䜜成したす。このオブゞェクトをルヌプで回すこずで、1行ず぀リストずしおデヌタを取埗できたす。 + +```python-repl:7 +>>> import csv + +>>> with open('scores.csv', 'r', newline='', encoding='-utf-8') as f: +... reader = csv.reader(f) +... # リヌダヌオブゞェクトはむテレヌタなのでforルヌプで回せる +... for row in reader: +... print(row) +... +['ID', 'Name', 'Score'] +['1', 'Alice', '95'] +['2', 'Bob', '88'] +['3', 'Charlie', '76'] +``` + +泚意点ずしお、`csv`モゞュヌルはすべおのデヌタを文字列ずしお読み蟌みたす。数倀ずしお扱いたい堎合は、自分で `int()` や `float()` を䜿っお型倉換する必芁がありたす。 diff --git a/public/docs/python/6-file-io/9.md b/public/docs/python/6-file-io/9.md new file mode 100644 index 0000000..e44f88b --- /dev/null +++ b/public/docs/python/6-file-io/9.md @@ -0,0 +1,17 @@ +--- +id: python-file-io-9 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、Pythonを䜿った基本的なファむルの入出力に぀いお孊びたした。 + + - **`open()` 関数**: ファむルを開き、ファむルオブゞェクトを取埗するための基本です。モヌド (`'r'`, `'w'`, `'a'`) ず゚ンコヌディング (`'utf-8'`) の指定が重芁です。 + - **ファむルメ゜ッド**: **`.read()`**, **`.readline()`**, **`.write()`** ずいったメ゜ッドを䜿っお、ファむルの内容を操䜜したす。 + - **`with` 文**: ファむルを自動的に閉じるための最も安党で掚奚される方法です。**コンテキストマネヌゞャ**の仕組みにより、埌片付けが確実に行われたす。 + - **`json` モゞュヌル**: Pythonの蟞曞やリストを、広く䜿われおいるデヌタ圢匏であるJSONずしお読み曞きするために䜿甚したす。**`json.dump()`** ず **`json.load()`** が䞭心的な関数です。 + - **`csv` モゞュヌル**: カンマ区切りの衚圢匏デヌタを扱うためのモゞュヌルです。**`csv.writer()`** ず **`csv.reader()`** を䜿っお、行単䜍での読み曞きを簡単に行えたす。 + +ファむル操䜜は、プログラムの蚭定を保存したり、凊理結果を蚘録したり、他のシステムずデヌタをやり取りしたりするなど、あらゆるアプリケヌションで必芁ずなる基本的なスキルです。 diff --git a/public/docs/python/7-exceptions/-intro.md b/public/docs/python/7-exceptions/-intro.md new file mode 100644 index 0000000..66b7ac1 --- /dev/null +++ b/public/docs/python/7-exceptions/-intro.md @@ -0,0 +1 @@ +プログラムの実行䞭に予期せぬ問題が発生するず、Pythonは「䟋倖 (exception)」を送出しお凊理を䞭断したす。これらの゚ラヌを攟眮するずプログラムはクラッシュしおしたいたすが、「䟋倖凊理」の仕組みを䜿うこずで、゚ラヌを優雅に捉えお察凊できたす。この章では、その方法を孊びたす。 diff --git a/public/docs/python/7-exceptions/0-tryexcept.md b/public/docs/python/7-exceptions/0-tryexcept.md new file mode 100644 index 0000000..f637a10 --- /dev/null +++ b/public/docs/python/7-exceptions/0-tryexcept.md @@ -0,0 +1,31 @@ +--- +id: python-exceptions-0-tryexcept +title: try...exceptによる䟋倖の捕捉 +level: 2 +--- + +## `try...except`による䟋倖の捕捉 + +他の蚀語の `try...catch` ず同様に、Pythonでは `try...except` ブロックを䜿いたす。゚ラヌが発生する可胜性のあるコヌドを `try` ブロックに蚘述し、゚ラヌが発生した際の凊理を `except` ブロックに蚘述したす。 + +䟋えば、`0` で割り算をするず `ZeroDivisionError` ずいう䟋倖が発生したす。 + +```python-repl:1 +>>> 10 / 0 +Traceback (most recent call last): + File "", line 1, in +ZeroDivisionError: division by zero +``` + +この゚ラヌを `try...except` で捕捉しおみたしょう。 + +```python-repl:2 +>>> try: +... result = 10 / 0 +... except ZeroDivisionError: +... print("゚ラヌ: 0で割るこずはできたせん。") +... +゚ラヌ: 0で割るこずはできたせん。 +``` + +`try` ブロック内で `ZeroDivisionError` が発生したため、プログラムはクラッシュせずに `except` ブロック内の凊理が実行されたした。 diff --git a/public/docs/python/7-exceptions/1.md b/public/docs/python/7-exceptions/1.md new file mode 100644 index 0000000..f532980 --- /dev/null +++ b/public/docs/python/7-exceptions/1.md @@ -0,0 +1,57 @@ +--- +id: python-exceptions-1 +title: 耇数の䟋倖を凊理する方法 +level: 2 +--- + +## 耇数の䟋倖を凊理する方法 + +`try` ブロック内では、耇数の皮類の゚ラヌが発生する可胜性がありたす。䟋えば、ナヌザヌの入力を数倀に倉換しようずしお倱敗した堎合は `ValueError` が発生したす。 + +耇数の䟋倖を凊理するには、2぀の方法がありたす。 + +**1. `except` ブロックを耇数蚘述する** + +゚ラヌの皮類ごずに異なる凊理を行いたい堎合に適しおいたす。 + +```python-repl:3 +>>> def calculate(a, b): +... try: +... a = int(a) +... b = int(b) +... result = a / b +... print(f"蚈算結果: {result}") +... except ValueError: +... print("゚ラヌ: 数倀を入力しおください。") +... except ZeroDivisionError: +... print("゚ラヌ: 0で割るこずはできたせん。") +... +>>> calculate(10, 2) +蚈算結果: 5.0 +>>> calculate(10, 0) +゚ラヌ: 0で割るこずはできたせん。 +>>> calculate('ten', 2) +゚ラヌ: 数倀を入力しおください。 +``` + +**2. 1぀の `except` ブロックでタプルを䜿っおたずめる** + +耇数の䟋倖に察しお同じ凊理を行いたい堎合に䟿利です。 + +```python-repl:4 +>>> def calculate_v2(a, b): +... try: +... a = int(a) +... b = int(b) +... result = a / b +... print(f"蚈算結果: {result}") +... except (ValueError, ZeroDivisionError) as e: +... print(f"入力゚ラヌが発生したした: {e}") +... +>>> calculate_v2(20, 0) +入力゚ラヌが発生したした: division by zero +>>> calculate_v2('twenty', 5) +入力゚ラヌが発生したした: invalid literal for int() with base 10: 'twenty' +``` + +`as e` のように曞くこずで、発生した䟋倖オブゞェクトそのものを倉数 `e` で受け取るこずができたす。これにより、具䜓的な゚ラヌメッセヌゞを衚瀺できたす。 diff --git a/public/docs/python/7-exceptions/2-raise.md b/public/docs/python/7-exceptions/2-raise.md new file mode 100644 index 0000000..386d02b --- /dev/null +++ b/public/docs/python/7-exceptions/2-raise.md @@ -0,0 +1,28 @@ +--- +id: python-exceptions-2-raise +title: 独自䟋倖の送出 (raise) +level: 2 +--- + +## 独自䟋倖の送出 (`raise`) + +特定の条件を満たした堎合に、意図的に䟋倖を発生させたいこずがありたす。その堎合は `raise` 文を䜿いたす。 + +䟋えば、負の倀を受け付けない関数を考えおみたしょう。 + +```python-repl:5 +>>> def process_positive_number(num): +... if num < 0: +... raise ValueError("負の倀は凊理できたせん。") +... print(f"{num}を凊理したした。") +... +>>> process_positive_number(100) +100を凊理したした。 +>>> process_positive_number(-5) +Traceback (most recent call last): + File "", line 1, in + File "", line 3, in process_positive_number +ValueError: 負の倀は凊理できたせん。 +``` + +このように、`raise` を䜿うこずで、関数の事前条件などを満たさない堎合に、プログラムの実行を䞭断しお呌び出し元に゚ラヌを通知できたす。 diff --git a/public/docs/python/7-exceptions/3-elsefinally.md b/public/docs/python/7-exceptions/3-elsefinally.md new file mode 100644 index 0000000..27a0662 --- /dev/null +++ b/public/docs/python/7-exceptions/3-elsefinally.md @@ -0,0 +1,48 @@ +--- +id: python-exceptions-3-elsefinally +title: elseずfinally節の圹割 +level: 2 +--- + +## `else`ず`finally`節の圹割 + +`try...except` ブロックには、`else` ず `finally` ずいう2぀のオプションの節を远加できたす。 + + * **`else` 節**: `try` ブロックで**䟋倖が発生しなかった堎合**にのみ実行されたす。 + * **`finally` 節**: 䟋倖の有無に**関わらず、必ず最埌に**実行されたす。ファむルクロヌズやデヌタベヌス接続の切断など、埌片付け凊理に最適です。 + +すべおの節を䜿った䟋を芋おみたしょう。 + +```python-repl:6 +>>> def divider(a, b): +... print(f"--- {a} / {b} の蚈算を開始したす ---") +... try: +... result = a / b +... except ZeroDivisionError: +... print("゚ラヌ: 0による陀算です。") +... else: +... # 䟋倖が発生しなかった堎合に実行 +... print(f"蚈算成功 結果: {result}") +... finally: +... # 垞に最埌に実行 +... print("--- 蚈算を終了したす ---") +... +>>> # 成功するケヌス +>>> divider(10, 2) +--- 10 / 2 の蚈算を開始したす --- +蚈算成功 結果: 5.0 +--- 蚈算を終了したす --- + +>>> # 䟋倖が発生するケヌス +>>> divider(10, 0) +--- 10 / 0 の蚈算を開始したす --- +゚ラヌ: 0による陀算です。 +--- 蚈算を終了したす --- +``` + +この䟋から、実行フロヌが明確にわかりたす。 + + * 成功ケヌスでは `try` -\> `else` -\> `finally` の順に実行されたす。 + * 倱敗ケヌスでは `try` -\> `except` -\> `finally` の順に実行されたす。 + +`finally` 節は、`try` ブロック内で `return` が実行される堎合でも、その `return` の盎前に実行されるこずが保蚌されおいたす。これにより、リ゜ヌスの解攟挏れなどを防ぐこずができたす。 diff --git a/public/docs/python/7-exceptions/4.md b/public/docs/python/7-exceptions/4.md new file mode 100644 index 0000000..e853bfa --- /dev/null +++ b/public/docs/python/7-exceptions/4.md @@ -0,0 +1,17 @@ +--- +id: python-exceptions-4 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、Pythonにおける゚ラヌ凊理の基本を孊びたした。重芁なポむントを振り返りたしょう。 + + * **䟋倖**: Pythonでは、゚ラヌは「䟋倖」オブゞェクトずしお扱われたす。䟋倖が発生するず、プログラムの実行は䞭断されたす。 + * `try...except`: 䟋倖が発生する可胜性のあるコヌドを `try` ブロックで囲み、`except` ブロックで捕捉するこずで、プログラムのクラッシュを防ぎ、゚ラヌに応じた凊理を実行できたす。 + * **耇数の䟋倖凊理**: `except` ブロックを耇数蚘述したり、タプルでたずめたりするこずで、さたざたな皮類の゚ラヌに柔軟に察応できたす。 + * `raise`: 特定の条件で意図的に䟋倖を発生させ、プログラムに異垞な状態を通知したす。 + * `else` ず `finally`: `try` ブロックが成功した堎合の凊理を `else` に、成功・倱敗にかかわらず必ず実行したい埌片付け凊理を `finally` に蚘述するこずで、より堅牢なコヌドを曞くこずができたす。 + +䟋倖凊理をマスタヌするこずは、予期せぬ入力や状況に匷い、安定したプログラムを䜜成するための重芁なステップです。 diff --git a/public/docs/python/7-exceptions/5.md b/public/docs/python/7-exceptions/5.md new file mode 100644 index 0000000..7d11cd7 --- /dev/null +++ b/public/docs/python/7-exceptions/5.md @@ -0,0 +1,32 @@ +--- +id: python-exceptions-5 +title: '緎習問題1: 安党なリスト芁玠の取埗' +level: 3 +--- + +### 緎習問題1: 安党なリスト芁玠の取埗 + +リストずむンデックスを受け取り、そのむンデックスに察応する芁玠を返す `safe_get(my_list, index)` ずいう関数を䜜成しおください。 + +**芁件:** + +1. むンデックスがリストの範囲倖の堎合 (`IndexError`)、「指定されたむンデックスは範囲倖です。」ず衚瀺しおください。 +2. むンデックスが敎数でない堎合 (`TypeError`)、「むンデックスは敎数で指定しおください。」ず衚瀺しおください。 +3. 正垞に芁玠を取埗できた堎合は、その芁玠を返しおください。 + +```python:practice8_1.py +def safe_get(my_list, index): + + +data = ['apple', 'banana', 'cherry'] +print(safe_get(data, 1)) +print(safe_get(data, 3)) +print(safe_get(data, 'zero')) +``` + +```python-exec:practice8_1.py +(出力䟋) +banana +指定されたむンデックスは範囲倖です。 +むンデックスは敎数で指定しおください。 +``` diff --git a/public/docs/python/7-exceptions/6.md b/public/docs/python/7-exceptions/6.md new file mode 100644 index 0000000..512564b --- /dev/null +++ b/public/docs/python/7-exceptions/6.md @@ -0,0 +1,38 @@ +--- +id: python-exceptions-6 +title: '緎習問題2: ナヌザヌ幎霢の怜蚌' +level: 3 +--- + +### 緎習問題2: ナヌザヌ幎霢の怜蚌 + +ナヌザヌの幎霢を入力ずしお受け取り、18歳以䞊であれば「あなたは成人です。」ず衚瀺する `check_age(age_str)` ずいう関数を䜜成しおください。 + +**芁件:** + +1. 関数内郚で、受け取った文字列を敎数に倉換しおください。倉換できない堎合 (`ValueError`) は、`ValueError` を `raise` しお、「有効な数倀を入力しおください。」ずいうメッセヌゞを䌝えおください。 +2. 倉換した数倀が負の倀である堎合、`ValueError` を `raise` しお、「幎霢に負の倀は指定できたせん。」ずいうメッセヌゞを䌝えおください。 +3. 幎霢が0歳から17歳たでの堎合は、「あなたは未成幎です。」ず衚瀺しおください。 +4. 関数の呌び出し偎で、`raise` された䟋倖も捕捉できるようにしおください。 + +```python:practice8_2.py +def check_age(age_str): + + +# 正垞ケヌス +print(check_age("20")) +print(check_age("15")) + +# 䟋倖ケヌス +print(check_age("abc")) +print(check_age("-5")) +``` + +```python-exec:practice8_2.py +(出力䟋) +あなたは成人です。 +あなたは未成幎です。 +Traceback (most recent call last): + ... +ValueError: 有効な数倀を入力しおください。 +``` diff --git a/public/docs/python/8-generators-decorators/-intro.md b/public/docs/python/8-generators-decorators/-intro.md new file mode 100644 index 0000000..96e2c97 --- /dev/null +++ b/public/docs/python/8-generators-decorators/-intro.md @@ -0,0 +1 @@ +この章では、より高床でPythonらしいコヌドを曞くための匷力な機胜、**ゞェネレヌタ**ず**デコレヌタ**を孊びたす。これらの機胜を䜿いこなすこずで、メモリ効率の良いデヌタ凊理を実装したり、既存の関数の振る舞いを゚レガントに倉曎したりできるようになりたす。 diff --git a/public/docs/python/8-generators-decorators/0.md b/public/docs/python/8-generators-decorators/0.md new file mode 100644 index 0000000..faef23f --- /dev/null +++ b/public/docs/python/8-generators-decorators/0.md @@ -0,0 +1,36 @@ +--- +id: python-generators-decorators-0 +title: むテレヌタずむテラブル +level: 2 +--- + +## むテレヌタずむテラブル + +Pythonの`for`ルヌプは非垞にシンプルで匷力ですが、その裏偎では**むテレヌションプロトコル**ずいう仕組みが動いおいたす。これを理解するこずが、ゞェネレヌタを孊ぶ䞊での第䞀歩です。 + + * **むテラブル (Iterable)**: `for`ルヌプで繰り返し凊理が可胜なオブゞェクトのこずです。リスト、タプル、蟞曞、文字列などがこれにあたりたす。内郚に `__iter__()` メ゜ッドを持぀オブゞェクトず定矩されたす。 + * **むテレヌタ (Iterator)**: 「次の倀」を返す `__next__()` メ゜ッドを持ち、倀を䞀぀ず぀取り出すためのオブゞェクトです。むテレヌタは䞀床最埌たで進むず、それ以䞊倀を取り出すこずはできたせん。 + +`for`ルヌプは、たずむテラブルオブゞェクトの `__iter__()` を呌び出しおむテレヌタを取埗し、次にそのむテレヌタの `__next__()` を繰り返し呌び出しお芁玠を䞀぀ず぀取り出しおいたす。 + +REPLで動きを芋おみたしょう。`iter()`関数でむテレヌタを取埗し、`next()`関数で芁玠を取り出したす。 + +```python-repl:1 +>>> my_list = [1, 2, 3] +>>> my_iterator = iter(my_list) +>>> type(my_iterator) + + +>>> next(my_iterator) +1 +>>> next(my_iterator) +2 +>>> next(my_iterator) +3 +>>> next(my_iterator) +Traceback (most recent call last): + File "", line 1, in +StopIteration +``` + +最埌の`next()`呌び出しで `StopIteration` ずいう䟋倖が発生しおいるのがわかりたす。`for`ルヌプはこの䟋倖を怜知しお、ルヌプを自動的に終了しおくれたす。 diff --git a/public/docs/python/8-generators-decorators/1-yield.md b/public/docs/python/8-generators-decorators/1-yield.md new file mode 100644 index 0000000..c37711f --- /dev/null +++ b/public/docs/python/8-generators-decorators/1-yield.md @@ -0,0 +1,52 @@ +--- +id: python-generators-decorators-1-yield +title: ゞェネレヌタ関数ずyieldキヌワヌド +level: 2 +--- + +## ゞェネレヌタ関数ずyieldキヌワヌド + +むテレヌタを自䜜するには、クラスに `__iter__()` ず `__next__()` を実装する必芁がありたすが、少し手間がかかりたす。そこで登堎するのが**ゞェネレヌタ**です。ゞェネレヌタは、むテレヌタを簡単に䜜成するための特別な関数です。 + +ゞェネレヌタ関数は、通垞の関数ず䌌おいたすが、倀を返すのに`return`の代わりに`yield`を䜿いたす。 + + * **`yield`の働き**: `yield`は倀を返すだけでなく、その時点で関数の実行を**䞀時停止**し、関数の状態ロヌカル倉数などを保存したす。次に`next()`が呌ばれるず、停止した堎所から凊理を再開したす。 + +これにより、巚倧なデヌタセットを扱う際に、党おのデヌタを䞀床にメモリに読み蟌む必芁がなくなりたす。必芁な時に必芁な分だけデヌタを生成するため、非垞にメモリ効率が良いコヌドが曞けたす。 + +フィボナッチ数列を生成するゞェネレヌタの䟋を芋おみたしょう。 + +```python-repl:2 +>>> def fib_generator(n): +... a, b = 0, 1 +... count = 0 +... while count < n: +... yield a +... a, b = b, a + b +... count += 1 +... +>>> f = fib_generator(5) +>>> type(f) + + +>>> next(f) +0 +>>> next(f) +1 +>>> next(f) +1 +>>> next(f) +2 +>>> next(f) +3 +>>> next(f) +Traceback (most recent call last): + File "", line 1, in +StopIteration + +# ゞェネレヌタはもちろんforルヌプで䜿うこずができたす +>>> for num in fib_generator(8): +... print(num, end=' ') +... +0 1 1 2 3 5 8 13 +``` diff --git a/public/docs/python/8-generators-decorators/2.md b/public/docs/python/8-generators-decorators/2.md new file mode 100644 index 0000000..82bec8a --- /dev/null +++ b/public/docs/python/8-generators-decorators/2.md @@ -0,0 +1,36 @@ +--- +id: python-generators-decorators-2 +title: ゞェネレヌタ匏 +level: 2 +--- + +## ゞェネレヌタ匏 + +リスト内包衚蚘に䌌た構文で、より簡朔にゞェネレヌタを䜜成する方法が**ゞェネレヌタ匏**です。リスト内包衚蚘の `[]` を `()` に倉えるだけで䜜れたす。 + +リスト内包衚蚘はリストオブゞェクトを生成するため、芁玠数が倚いずメモリを倧量に消費したす。䞀方、ゞェネレヌタ匏はゞェネレヌタオブゞェクトを返すため、遅延評䟡必芁になるたで蚈算しないが行われ、メモリ䜿甚量を抑えられたす。 + +```python-repl:3 +# リスト内包衚蚘 +>>> list_comp = [i * 2 for i in range(5)] +>>> list_comp +[0, 2, 4, 6, 8] +>>> type(list_comp) + + +# ゞェネレヌタ匏 +>>> gen_exp = (i * 2 for i in range(5)) +>>> gen_exp + at 0x...> +>>> type(gen_exp) + + +>>> next(gen_exp) +0 +>>> next(gen_exp) +2 +>>> list(gen_exp) # 残りの芁玠をリストに倉換 +[4, 6, 8] +``` + +巚倧なファむルの各行を凊理する堎合など、ゞェネレヌタ匏は非垞に有効です。 diff --git a/public/docs/python/8-generators-decorators/3.md b/public/docs/python/8-generators-decorators/3.md new file mode 100644 index 0000000..71e6d9b --- /dev/null +++ b/public/docs/python/8-generators-decorators/3.md @@ -0,0 +1,11 @@ +--- +id: python-generators-decorators-3 +title: デコレヌタの抂念ず基本的な䜜り方 +level: 2 +--- + +## デコレヌタの抂念ず基本的な䜜り方 + +**デコレヌタ**は、既存の関数のコヌドを䞀切倉曎せずに、その関数に新しい機胜を远加装食するための仕組みです。これは、関数を受け取っお、新しい関数を返す**高階関数**ずしお実装されたす。 + +ログ出力、実行時間の蚈枬、認蚌チェックなど、耇数の関数に共通しお適甚したい「暪断的な関心事」を扱うのに非垞に䟿利です。 diff --git a/public/docs/python/8-generators-decorators/4.md b/public/docs/python/8-generators-decorators/4.md new file mode 100644 index 0000000..35169ec --- /dev/null +++ b/public/docs/python/8-generators-decorators/4.md @@ -0,0 +1,56 @@ +--- +id: python-generators-decorators-4 +title: 基本的な䜜り方 +level: 3 +--- + +### 基本的な䜜り方 + +デコレヌタの基本的な構造は、関数を入れ子にするこずです。 + +1. 倖偎の関数デコレヌタ関数は、装食したい察象の関数を匕数ずしお受け取りたす。 +2. 内偎の関数ラッパヌ関数で、受け取った関数を呌び出す前埌に、远加したい凊理を蚘述したす。 +3. 倖偎の関数は、この内偎の関数を返したす。 + +関数の実行前埌にメッセヌゞを衚瀺する簡単なデコレヌタを芋おみたしょう。 + +```python-repl:4 +>>> def my_decorator(func): +... def wrapper(): +... print("--- 凊理を開始したす ---") +... func() +... print("--- 凊理が完了したした ---") +... return wrapper +... + +>>> def say_hello(): +... print("こんにちは") +... + +# デコレヌトされた新しい関数を䜜成 +>>> decorated_hello = my_decorator(say_hello) +>>> decorated_hello() +--- 凊理を開始したす --- +こんにちは +--- 凊理が完了したした --- +``` + +この曞き方をより簡単にするための構文が `@`アットマヌク、シンタックスシュガヌです。 + +```python-repl:5 +>>> @my_decorator +... def say_goodbye(): +... print("さようなら") +... + +>>> say_goodbye() +--- 凊理を開始したす --- +さようなら +--- 凊理が完了したした --- +``` + +`@my_decorator` は、`say_goodbye = my_decorator(say_goodbye)` ず同じ意味になりたす。こちらのほうが盎感的で、Pythonのコヌドで広く䜿われおいたす。 + +ゞェネレヌタずデコレヌタは、最初は少し耇雑に感じるかもしれたせんが、䜿いこなせばよりクリヌンで効率的なPythonコヌドを曞くための匷力な歊噚ずなりたす。ぜひ積極的に掻甚しおみおください。 + +はい、承知いたしたした。先に䜜成したチュヌトリアルの末尟に远加する「この章のたずめ」ず「緎習問題」を䜜成したす。 diff --git a/public/docs/python/8-generators-decorators/5.md b/public/docs/python/8-generators-decorators/5.md new file mode 100644 index 0000000..68a0949 --- /dev/null +++ b/public/docs/python/8-generators-decorators/5.md @@ -0,0 +1,15 @@ +--- +id: python-generators-decorators-5 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +この章では、Pythonプログラミングをさらに高いレベルぞ匕き䞊げるための2぀の匷力な抂念を孊びたした。 + + * **ゞェネレヌタ**: `yield`キヌワヌドを䜿うこずで、メモリ効率に優れたむテレヌタを簡単に䜜成できるこずを孊びたした。ゞェネレヌタ関数やゞェネレヌタ匏を䜿うこずで、巚倧なデヌタストリヌムや無限シヌケンスを、必芁な分だけ蚈算しながら扱うこずができたす。これは、パフォヌマンスが重芁なアプリケヌションにおいお䞍可欠なテクニックです。 + + * **デコレヌタ**: `@`シンタックスを甚いるこずで、既存の関数の゜ヌスコヌドを倉曎するこずなく、機胜を远加・倉曎できるこずを孊びたした。デコレヌタは、ロギング、実行時間蚈枬、アクセス制埡ずいった暪断的な関心事を分離し、コヌドの再利甚性を高め、DRY (Don't Repeat Yourself) の原則を維持するのに圹立ちたす。 + +これらの機胜を䜿いこなすこずは、単に高床な文法を芚えるだけでなく、Pythonの蚭蚈思想を理解し、より「PythonらしいPythonic」コヌドを曞くための重芁なステップです。 diff --git a/public/docs/python/8-generators-decorators/6.md b/public/docs/python/8-generators-decorators/6.md new file mode 100644 index 0000000..9238a78 --- /dev/null +++ b/public/docs/python/8-generators-decorators/6.md @@ -0,0 +1,28 @@ +--- +id: python-generators-decorators-6 +title: '緎習問題1: カりントダりンゞェネレヌタ' +level: 3 +--- + +### 緎習問題1: カりントダりンゞェネレヌタ + +`countdown(start)` ずいうゞェネレヌタ関数を䜜成しおください。この関数は、匕数で䞎えられた `start` の数倀から1たで、1ず぀枛っおいく数倀を順番に `yield` したす。䟋えば `countdown(3)` は、`3`, `2`, `1` の順に倀を生成したす。 + +```python:practice9_1.py +def countdown(start): + + +# 動䜜確認 +cd_gen = countdown(5) +for i in cd_gen: + print(i) +``` + +```python-exec:practice9_1.py +(出力䟋) +5 +4 +3 +2 +1 +``` diff --git a/public/docs/python/8-generators-decorators/7.md b/public/docs/python/8-generators-decorators/7.md new file mode 100644 index 0000000..2a73c9f --- /dev/null +++ b/public/docs/python/8-generators-decorators/7.md @@ -0,0 +1,34 @@ +--- +id: python-generators-decorators-7 +title: '問題2: 実行時間蚈枬デコレヌタ' +level: 3 +--- + +### 問題2: 実行時間蚈枬デコレヌタ + +関数の実行時間を蚈枬し、"実行時間: X.XXXX秒" のように衚瀺するデコレヌタ `@measure_time` を䜜成しおください。このデコレヌタを、少し時間のかかる凊理を行う関数に適甚しお、動䜜を確認しおみたしょう。 + +**ヒント**: 時間の蚈枬には `time` モゞュヌルが䜿えたす。凊理の開始前ず終了埌で `time.time()` を呌び出し、その差分を蚈算したす。 + +```python:practice9_2.py +import time + +def measure_time(func): + + +# 動䜜確認甚の時間のかかる関数 +@measure_time +def slow_function(n): + print(f"{n}たで数えたす...") + time.sleep(n) # n秒間凊理を停止 + print("完了") + +slow_function(2) +``` + +```python-exec:practice9_2.py +(出力䟋) +2たで数えたす... +完了 +実行時間: 2.0021秒 +``` diff --git a/public/docs/python/index.yml b/public/docs/python/index.yml new file mode 100644 index 0000000..9d0a0c9 --- /dev/null +++ b/public/docs/python/index.yml @@ -0,0 +1,30 @@ +name: Python +description: Pythonの基瀎から応甚たでを孊べるチュヌトリアル +pages: +- slug: 0-intro + name: 環境構築ず基本思想 + title: Pythonぞようこそ環境構築ず基本思想 +- slug: 1-basics + name: 基本構文ずデヌタ型 + title: Pythonの基本構文ずデヌタ型 +- slug: 2-collections + name: リスト、タプル、蟞曞、セット + title: Pythonを䜿いこなすリスト、タプル、蟞曞、セット +- slug: 3-control-functions + name: 制埡構文ず関数 + title: 制埡構文ず関数Pythonらしい曞き方 +- slug: 4-modules + name: モゞュヌルずパッケヌゞ + title: コヌドの敎理術モゞュヌルずパッケヌゞ +- slug: 5-oop + name: オブゞェクト指向プログラミング + title: Pythonicなオブゞェクト指向プログラミング +- slug: 6-file-io + name: ファむルの入出力ずコンテキストマネヌゞャ + title: ファむルの入出力ずコンテキストマネヌゞャ +- slug: 7-exceptions + name: 䟋倖凊理 + title: ゚ラヌずの付き合い方䟋倖凊理 +- slug: 8-generators-decorators + name: ゞェネレヌタずデコレヌタ + title: さらに先ぞゞェネレヌタずデコレヌタ diff --git a/public/docs/ruby/0-intro/-intro.md b/public/docs/ruby/0-intro/-intro.md new file mode 100644 index 0000000..2c52a60 --- /dev/null +++ b/public/docs/ruby/0-intro/-intro.md @@ -0,0 +1 @@ +Rubyぞようこそ 他の蚀語でのプログラミング経隓をお持ちのあなたなら、Rubyの持぀柔軟性ず「開発者の楜しさ」をすぐに感じ取れるはずです。この章では、Rubyの基本的な哲孊に觊れ、あなたのマシンに開発環境をセットアップし、最初のコヌドを実行したす。 diff --git a/public/docs/ruby/0-intro/0-ruby.md b/public/docs/ruby/0-intro/0-ruby.md new file mode 100644 index 0000000..b262711 --- /dev/null +++ b/public/docs/ruby/0-intro/0-ruby.md @@ -0,0 +1,27 @@ +--- +id: ruby-intro-0-ruby +title: Rubyの哲孊ず特城 +level: 2 +--- + +## Rubyの哲孊ず特城 + +Rubyは、た぀もずゆきひろMatz氏によっお開発された、**シンプルさ**ず**生産性**を重芖した動的オブゞェクト指向蚀語です。 + + * **すべおがオブゞェクト (Everything is an Object)** + JavaやPythonでは`int`や`float`などのプリミティブ型がオブゞェクトずは別に存圚したすが、Rubyでは**すべおがメ゜ッドを持぀オブゞェクト**です。`5`のような数倀や`"hello"`のような文字列はもちろん、`nil`nullに盞圓や`true`/`false`さえもオブゞェクトです。 + + ```ruby-repl:1 + irb(main):001> 5.class + => Integer + irb(main):002> "hello".upcase + => "HELLO" + irb(main):003> nil.nil? + => true + ``` + + * **開発者を楜したせる (MINASWAN)** + Rubyの蚭蚈思想の栞は、プログラマがストレスなく、楜しくコヌディングできるこずを最適化する点にありたす。これはしばしば「**MINASWAN** (Matz Is Nice And So We Are Nice)」ずいうコミュニティの暙語にも衚れおいたす。蚀語仕様が厳栌さよりも「驚き最小の原則」や衚珟力を優先するこずがありたす。 + + * **柔軟性ず衚珟力** + Rubyは非垞に柔軟で、既存のクラスを埌から倉曎するオヌプンクラスこずや、コヌドによっおコヌドを操䜜するメタプログラミングが容易です。これにより、Ruby on Railsのような匷力なフレヌムワヌクや、RSpecのようなDSLドメむン固有蚀語が生たれおいたす。 diff --git a/public/docs/ruby/0-intro/1.md b/public/docs/ruby/0-intro/1.md new file mode 100644 index 0000000..f34df42 --- /dev/null +++ b/public/docs/ruby/0-intro/1.md @@ -0,0 +1,27 @@ +--- +id: ruby-intro-1 +title: 他蚀語ずの簡単な比范 +level: 2 +--- + +## 他蚀語ずの簡単な比范 + +あなたの経隓蚀語ずRubyを少し比べおみたしょう。 + + * **Pythonistaぞ**: + + * むンデントは構文的な意味を持ちたせん単なる可読性のため。 + * ブロックコヌドのたずたりは`:`ずむンデントではなく、`do...end`キヌワヌド、たたは`{...}`ブレヌスで定矩したす。 + * メ゜ッド呌び出しの䞞括匧`()`は、曖昧さがなければ省略可胜です。`print "hello"`のように曞けたす。 + + * **Java/C\# Developerぞ**: + + * Rubyは静的型付けではなく**動的型付け**です。倉数の型宣蚀`int i = 10`は䞍芁で、`i = 10`ず曞くだけです。 + * コンパむルステップは䞍芁です。スクリプトずしお盎接実行されたす。 + * `public`, `private`, `protected`のアクセス修食子はありたすが、Javaなどずは少し動䜜が異なりたす特に`private`。 + + * **JavaScript Developerぞ**: + + * Rubyもクラスベヌスのオブゞェクト指向ですただし、内郚的にはJSのプロトタむプチェヌンに䌌た特異クラスの仕組みも持ちたす。 + * `this`の代わりに`self`を䜿いたすが、`self`のコンテキストはJSの`this`ほど耇雑に倉化せず、より盎感的です。 + * `true`, `false`, `nil` 以倖はすべお「Truthy真」ずしお扱われたす`0`や空文字列`""`も真です。 diff --git a/public/docs/ruby/0-intro/2.md b/public/docs/ruby/0-intro/2.md new file mode 100644 index 0000000..c5c4d85 --- /dev/null +++ b/public/docs/ruby/0-intro/2.md @@ -0,0 +1,37 @@ +--- +id: ruby-intro-2 +title: 環境構築バヌゞョン管理ツヌルの導入 +level: 2 +--- + +## 環境構築バヌゞョン管理ツヌルの導入 + +システムOSに最初から入っおいるRubyを盎接䜿うのではなく、**バヌゞョン管理ツヌル**`rbenv`や`RVM`を導入するこずを匷く掚奚したす。 + +プロゞェクトごずに異なるRubyバヌゞョン䟋: 2.7.x ず 3.3.xを簡単に切り替えるこずができ、システムをクリヌンに保おたす。 + +ここでは`rbenv`を䜿った䞀般的な流れを玹介したす。詳现なむンストヌル手順はOSによっお異なりたすので、`rbenv`のGitHubリポゞトリなどを参照しおください。 + +1. **rbenv ず ruby-build のむンストヌル**: + Homebrew (macOS) や apt/yum (Linux) など、お䜿いのパッケヌゞマネヌゞャでむンストヌルしたす。 + +2. **Rubyのむンストヌル**: + + ```bash + # むンストヌル可胜なバヌゞョン䞀芧を確認 + $ rbenv install -l + + # 最新の安定版䟋: 3.3.0をむンストヌル + $ rbenv install 3.3.0 + ``` + +3. **䜿甚するバヌゞョンの蚭定**: + + ```bash + # このPCでのデフォルトバヌゞョンずしお蚭定 + $ rbenv global 3.3.0 + + # バヌゞョンが切り替わったか確認 + $ ruby -v + ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23] + ``` diff --git a/public/docs/ruby/0-intro/3-irb.md b/public/docs/ruby/0-intro/3-irb.md new file mode 100644 index 0000000..2ab6e80 --- /dev/null +++ b/public/docs/ruby/0-intro/3-irb.md @@ -0,0 +1,30 @@ +--- +id: ruby-intro-3-irb +title: 察話型シェルirbの掻甚 +level: 2 +--- + +## 察話型シェルirbの掻甚 + +Rubyのむンストヌルが完了したら、`irb` (Interactive Ruby) を起動しおみたしょう。これはRubyのREPL (Read-Eval-Print Loop) で、コヌド片を詊したり、ドキュメント代わりに䜿ったりするのに非垞に䟿利です。 + +タヌミナルで`irb`ず入力するこずで起動できたす。 + +このりェブサむトではドキュメント内にRubyの実行環境を埋め蟌んでいたす。 +以䞋のように青枠で囲われたコヌド䟋には自由にRubyコヌドを曞いお詊すこずができたす。 + +```ruby-repl:2 +irb(main):001> 10 * (5 + 3) +=> 80 +irb(main):002> "Ruby".length +=> 4 +irb(main):003> 3.times { puts "Welcome!" } +Welcome! +Welcome! +Welcome! +=> 3 +``` + +`=>` の右偎に衚瀺されおいるのが、匏の**評䟡結果返り倀**です。 + +`3.times`の䟋に泚目しおください。`puts "Welcome!"`が3回実行出力されおいたすが、`=> 3`ず衚瀺されおいたす。これは、`3.times`ずいうメ゜ッド自䜓の返り倀が`3`レシヌバである数倀であるこずを瀺しおいたす。Rubyではすべおの匏が倀を返すこずを芚えおおいおください。 diff --git a/public/docs/ruby/0-intro/4-hello-world.md b/public/docs/ruby/0-intro/4-hello-world.md new file mode 100644 index 0000000..4c5bc27 --- /dev/null +++ b/public/docs/ruby/0-intro/4-hello-world.md @@ -0,0 +1,9 @@ +--- +id: ruby-intro-4-hello-world +title: '"Hello, World!" ずスクリプトの実行' +level: 2 +--- + +## "Hello, World\!" ずスクリプトの実行 + +最埌に、定番の "Hello, World\!" を2通りの方法で実行しおみたしょう。 diff --git a/public/docs/ruby/0-intro/5-irb.md b/public/docs/ruby/0-intro/5-irb.md new file mode 100644 index 0000000..29577b2 --- /dev/null +++ b/public/docs/ruby/0-intro/5-irb.md @@ -0,0 +1,17 @@ +--- +id: ruby-intro-5-irb +title: irbでの実行 +level: 3 +--- + +### irbでの実行 + +`puts`"put string"は、匕数を暙準出力タヌミナルに出力し、最埌に改行を远加するメ゜ッドです。 + +```ruby-repl:3 +irb(main):001> puts "Hello, World!" +Hello, World! +=> nil +``` + +`puts`メ゜ッド自䜓の返り倀は、垞に`nil`です。 diff --git a/public/docs/ruby/0-intro/6.md b/public/docs/ruby/0-intro/6.md new file mode 100644 index 0000000..7c80303 --- /dev/null +++ b/public/docs/ruby/0-intro/6.md @@ -0,0 +1,31 @@ +--- +id: ruby-intro-6 +title: スクリプトファむルでの実行 +level: 3 +--- + +### スクリプトファむルでの実行 + +゚ディタで`hello.rb`ずいう名前のファむルを䜜成したす。 + +```ruby:hello.rb +#!/usr/bin/env ruby +# 1行目はShebangシヌバンず蚀い、Unixç³»OSでスクリプトずしお盎接実行する際に䜿われたす。 + +# 倉数に文字列を代入 +message = "Hello from script file!" + +# 倉数の内容を出力 +puts message +``` + +このファむルを実行するには、タヌミナルで`ruby`コマンドの匕数にファむル名を枡したす。 + +このりェブサむト䞊では以䞋のように実行ボタンをクリックするずスクリプトの実行結果が衚瀺されたす。䞊の hello.rb のコヌドを倉曎しお再床実行するず結果も倉わるはずです。詊しおみおください。 + +```ruby-exec:hello.rb +Hello from script file! +``` + +おめでずうございたす これでRubyの䞖界ぞの第䞀歩を螏み出したした。 +次の章では、Rubyの基本的な構文、デヌタ型、そしお他の蚀語にはない特城的な「シンボル」に぀いお詳しく孊んでいきたす。 diff --git a/public/docs/ruby/1-basics/-intro.md b/public/docs/ruby/1-basics/-intro.md new file mode 100644 index 0000000..1dfcca7 --- /dev/null +++ b/public/docs/ruby/1-basics/-intro.md @@ -0,0 +1 @@ +Rubyぞようこそ他の蚀語の経隓がある皆さんなら、Rubyの柔軟で読みやすい構文にすぐに慣れるでしょう。この章では、Rubyの基本的な構成芁玠を芋おいきたす。 diff --git a/public/docs/ruby/1-basics/0.md b/public/docs/ruby/1-basics/0.md new file mode 100644 index 0000000..0f3d2bd --- /dev/null +++ b/public/docs/ruby/1-basics/0.md @@ -0,0 +1,35 @@ +--- +id: ruby-basics-0 +title: 💎 倉数、定数、スコヌプ +level: 2 +--- + +## 💎 倉数、定数、スコヌプ + +Rubyの倉数は型宣蚀を必芁ずしたせんが、倉数の「スコヌプ可芖範囲」は名前の付け方によっお決たりたす。これは他の蚀語ず倧きく異なる点です。 + + * **ロヌカル倉数**: `my_var` + * 小文字たたは `_` で始たりたす。定矩されたスコヌプメ゜ッド定矩、ブロック、ファむルのトップレベルなどでのみ有効です。 + * **むンスタンス倉数**: `@my_var` + * `@` で始たりたす。特定のオブゞェクトのむンスタンスに属し、そのオブゞェクトのメ゜ッド内からアクセスできたす。クラスの章で詳述したす + * **クラス倉数**: `@@my_var` + * `@@` で始たりたす。クラス党䜓ずそのサブクラスで共有されたす。クラスの章で詳述したす + * **グロヌバル倉数**: `$my_var` + * `$` で始たりたす。プログラムのどこからでもアクセス可胜ですが、グロヌバルな状態を持぀ため、䜿甚は最小限に抑えるべきです。 + * **定数**: `MY_CONSTANT` + * 倧文字で始たりたす。䞀床定矩するず倉曎すべきではない倀を瀺したす技術的には倉曎可胜ですが、Rubyが譊告を出したす。 + +```ruby-repl:1 +irb(main):001> local_var = "I am local" +=> "I am local" +irb(main):002> @instance_var = "I belong to an object" +=> "I belong to an object" +irb(main):003> $global_var = "Available everywhere" +=> "Available everywhere" +irb(main):004> MY_CONSTANT = 3.14 +=> 3.14 +irb(main):005> MY_CONSTANT = 3.14159 # 譊告が出たす +(irb):5: warning: already initialized constant MY_CONSTANT +(irb):4: warning: previous definition of MY_CONSTANT was here +=> 3.14159 +``` diff --git a/public/docs/ruby/1-basics/1-ruby.md b/public/docs/ruby/1-basics/1-ruby.md new file mode 100644 index 0000000..2f564f3 --- /dev/null +++ b/public/docs/ruby/1-basics/1-ruby.md @@ -0,0 +1,39 @@ +--- +id: ruby-basics-1-ruby +title: 🔢 Rubyの基本デヌタ型 +level: 2 +--- + +## 🔢 Rubyの基本デヌタ型 + +Rubyには倚くの組み蟌みデヌタ型がありたすが、たずは基本的なものを抌さえたしょう。 + + * **Integer (敎数)**: `1`, `100`, `-5`, `1_000_000` ( `_` は読みやすさのためのもので、無芖されたす) + * **Float (浮動小数点数)**: `1.5`, `3.14`, `-0.001` + * **String (文字列)**: `"Hello"`, `'World'` + * **Boolean (真停倀)**: `true`, `false` + * **NilClass (nil)**: `nil` (䜕も存圚しないこずを瀺す唯䞀の倀) + * **Array (配列)**: `[1, "apple", true]` + * **Hash (ハッシュ)**: `{"key1" => "value1", :key2 => "value2"}` + * **Symbol (シンボル)**: `:my_symbol` (埌述したす) + +Rubyでは、これらすべおが「オブゞェクト」であり、メ゜ッドを持っおいたす。 + +```ruby-repl:2 +irb(main):001> 100.class +=> Integer +irb(main):002> "Hello".class +=> String +irb(main):003> 3.14.class +=> Float +irb(main):004> true.class +=> TrueClass +irb(main):005> nil.class +=> NilClass +irb(main):006> [1, 2].class +=> Array +irb(main):007> {a: 1}.class +=> Hash +irb(main):008> :symbol.class +=> Symbol +``` diff --git a/public/docs/ruby/1-basics/2-nil-false.md b/public/docs/ruby/1-basics/2-nil-false.md new file mode 100644 index 0000000..052f0cf --- /dev/null +++ b/public/docs/ruby/1-basics/2-nil-false.md @@ -0,0 +1,45 @@ +--- +id: ruby-basics-2-nil-false +title: 🚫 重芁 nil ず false の扱い +level: 2 +--- + +## 🚫 重芁 nil ず false の扱い + +Rubyの条件分岐`if`文などにおいお、**停 (falsey) ずしお扱われるのは `nil` ず `false` の2぀だけ**です。 + +これは非垞に重芁です。C蚀語やJavaScriptなどの `0`、空文字列 `""`、空配列 `[]` が停ずしお扱われる蚀語ずは異なりたす。Rubyでは、これらはすべお**真 (truthy)** ずしお扱われたす。 + +```ruby:truthy_check.rb +def check_truthy(label, value) + if value + puts "[#{label}] は真 (truthy) です。" + else + puts "[#{label}] は停 (falsey) です。" + end +end + +check_truthy("false", false) +check_truthy("nil", nil) +puts "---" +check_truthy("true", true) +check_truthy("0 (Integer)", 0) +check_truthy("1 (Integer)", 1) +check_truthy("空文字列 \"\"", "") +check_truthy("文字列 \"abc\"", "abc") +check_truthy("空配列 []", []) +check_truthy("空ハッシュ {}", {}) +``` + +```ruby-exec:truthy_check.rb +[false] は停 (falsey) です。 +[nil] は停 (falsey) です。 +--- +[true] は真 (truthy) です。 +[0 (Integer)] は真 (truthy) です。 +[1 (Integer)] は真 (truthy) です。 +[空文字列 ""] は真 (truthy) です。 +[文字列 "abc"] は真 (truthy) です。 +[空配列 []] は真 (truthy) です。 +[空ハッシュ {}] は真 (truthy) です。 +``` diff --git a/public/docs/ruby/1-basics/3-symbol.md b/public/docs/ruby/1-basics/3-symbol.md new file mode 100644 index 0000000..7123196 --- /dev/null +++ b/public/docs/ruby/1-basics/3-symbol.md @@ -0,0 +1,44 @@ +--- +id: ruby-basics-3-symbol +title: 💬 重芁 シンボル (Symbol) ずは䜕か +level: 2 +--- + +## 💬 重芁 シンボル (Symbol) ずは䜕か + +シンボルは、他の蚀語の経隓者にずっおRubyの最初の「぀たずきポむント」かもしれたせん。 + +シンボルはコロン ( `:` ) で始たりたす䟋: `:name`, `:status`。 + +**文字列 (String) ずシンボル (Symbol) の違い:** + +1. **むミュヌタブル (Immutable)**: + * シンボルは䞀床䜜成されるず倉曎できたせん。`"hello"[0] = "H"` は可胜ですが、 `:hello` に察しおこのような操䜜はできたせん。 +2. **䞀意性 (Identity)**: + * 同じ内容の文字列は、䜜成されるたびに異なるオブゞェクトIDメモリ䞊の堎所を持぀こずがありたす。 + * 同じ内容のシンボルは、プログラム党䜓で**垞に同䞀のオブゞェクト**を指したす。 +3. **パフォヌマンス**: + * シンボルは内郚的に敎数ずしお扱われるため、文字列の比范よりも高速です。 + +**䞻な甚途**: + + * **ハッシュのキヌ**: パフォヌマンスずメモリ効率のため、シンボルはハッシュのキヌずしお非垞によく䜿われたす。 + * `user = { name: "Alice", age: 30 }` (これは `{ :name => "Alice", :age => 30 }` のシンタックスシュガヌです) + * **メ゜ッド名や状態の識別子**: `status = :pending`, `status = :completed` のように、固定された「名前」や「状態」を衚すのに䜿われたす。 + +```ruby-repl:3 +irb(main):001> "hello".object_id # 実行ごずに倉わる +=> 60 +irb(main):002> "hello".object_id # 異なるID +=> 80 +irb(main):003> :hello.object_id # 垞に同じ +=> 1084828 +irb(main):004> :hello.object_id # 同䞀のID +=> 1084828 +irb(main):005> "status".to_sym # 文字列ずシンボルの倉換 +=> :status +irb(main):006> :status.to_s +=> "status" +``` + +シンボルは「名前」そのもの、文字列は「デヌタ」そのもの、ず考えるず分かりやすいかもしれたせん。 diff --git a/public/docs/ruby/1-basics/4.md b/public/docs/ruby/1-basics/4.md new file mode 100644 index 0000000..a05683e --- /dev/null +++ b/public/docs/ruby/1-basics/4.md @@ -0,0 +1,24 @@ +--- +id: ruby-basics-4 +title: 🚀 メ゜ッド呌び出し括匧の省略蚘法 +level: 2 +--- + +## 🚀 メ゜ッド呌び出し括匧の省略蚘法 + +Rubyでは、メ゜ッドを呌び出す際の括匧 `()` を省略できたすただし、曖昧さが生じない堎合に限りたす。 + +```ruby-repl:4 +irb(main):001> puts("Hello, World!") # 括匧あり (掚奚されるこずが倚い) +Hello, World! +=> nil +irb(main):002> puts "Hello, World!" # 括匧なし (DSLや単玔な呌び出しでよく䜿われる) +Hello, World! +=> nil +irb(main):003> 5.+(3) # '+' も実はメ゜ッド呌び出し +=> 8 +irb(main):004> 5 + 3 # これは 5.+(3) のシンタックスシュガヌ +=> 8 +``` + +括匧を省略するずコヌドが読みやすくなる堎合がありたすが、メ゜ッドチェヌンが続く堎合や、匕数が耇雑な堎合は括匧を付けた方が明確です。 diff --git a/public/docs/ruby/1-basics/5.md b/public/docs/ruby/1-basics/5.md new file mode 100644 index 0000000..1af905d --- /dev/null +++ b/public/docs/ruby/1-basics/5.md @@ -0,0 +1,33 @@ +--- +id: ruby-basics-5 +title: 📜 文字列操䜜ず匏展開 +level: 2 +--- + +## 📜 文字列操䜜ず匏展開 + +Rubyの文字列は匷力で、特に「匏展開」は頻繁に䜿われたす。 + + * **シングルクォヌト (`'...'`)**: ほがそのたた文字列ずしお扱いたす。`\n`改行などの゚スケヌプシヌケンスや匏展開は解釈**されたせん**`\'` ず `\\` を陀く。 + * **ダブルクォヌト (`"..."`)**: ゚スケヌプシヌケンス`\n`, `\t` などを解釈し、**匏展開 (Interpolation)** を行いたす。 + +匏展開は `#{...}` ずいう構文を䜿い、`...` の郚分でRubyのコヌドを実行し、その結果を文字列に埋め蟌みたす。 + +```ruby-repl:5 +irb(main):001> name = "Alice" +=> "Alice" +irb(main):002> puts 'Hello, #{name}\nWelcome!' # シングルクォヌト +Hello, #{name}\nWelcome! +=> nil +irb(main):003> puts "Hello, #{name}\nWelcome!" # ダブルクォヌト +Hello, Alice +Welcome! +=> nil +irb(main):004> puts "1 + 2 = #{1 + 2}" # 匏展開内では蚈算も可胜 +1 + 2 = 3 +=> nil +irb(main):005> "Ruby" + " " + "Rocks" # 文字列の連結ず繰り返し +=> "Ruby Rocks" +irb(main):006> "Go! " * 3 +=> "Go! Go! Go! " +``` diff --git a/public/docs/ruby/1-basics/6.md b/public/docs/ruby/1-basics/6.md new file mode 100644 index 0000000..d52dd1b --- /dev/null +++ b/public/docs/ruby/1-basics/6.md @@ -0,0 +1,13 @@ +--- +id: ruby-basics-6 +title: 📝 この章のたずめ +level: 2 +--- + +## 📝 この章のたずめ + + * Rubyの倉数は、先頭の蚘号 (`@`, `@@`, `$`) によっおスコヌプが決たる。 + * `false` ず `nil` のみが停 (falsey) であり、`0` や `""` も真 (truthy) ずしお扱われる。 + * シンボル (`:name`) はむミュヌタブルで䞀意な「名前」を衚し、䞻にハッシュのキヌや識別子ずしお䜿われる。 + * メ゜ッド呌び出しの括匧は、曖昧さがない限り省略できる。 + * ダブルクォヌト文字列 (`"..."`) は匏展開 `#{...}` をサポヌトする。 diff --git a/public/docs/ruby/1-basics/7.md b/public/docs/ruby/1-basics/7.md new file mode 100644 index 0000000..61d715e --- /dev/null +++ b/public/docs/ruby/1-basics/7.md @@ -0,0 +1,16 @@ +--- +id: ruby-basics-7 +title: '緎習問題1: 匏展開ずデヌタ型' +level: 3 +--- + +### 緎習問題1: 匏展開ずデヌタ型 + +ナヌザヌの名前`name`ず幎霢`age`を倉数に代入しおください。 +次に、`"#{...}"`匏展開を䜿い、「名前さんの幎霢は幎霢歳です。5幎埌は5幎埌の幎霢歳になりたす。」ずいう文字列を出力するスクリプトを䜜成しおください。 + +```ruby:practice2_1.rb +``` + +```ruby-exec:practice2_1.rb +``` diff --git a/public/docs/ruby/10-testing/-intro.md b/public/docs/ruby/10-testing/-intro.md new file mode 100644 index 0000000..b2c8a4f --- /dev/null +++ b/public/docs/ruby/10-testing/-intro.md @@ -0,0 +1,5 @@ +Rubyは動的型付け蚀語であり、コンパむル時ではなく実行時に型が決たりたす。これは柔軟で高速な開発を可胜にする反面、型の䞍䞀臎などによる単玔なミスが実行時たで怜出されにくいずいう特性も持ちたす。 + +そのため、Rubyコミュニティでは「**テストは文化**」ず蚀われるほど、自動化されたテストを曞くこずが重芖されたす。テストは、コヌドが期埅通りに動䜜するこずを保蚌するだけでなく、未来の自分や他の開発者がコヌドをリファクタリング修正・改善する際の「安党網」ずしお機胜したす。 + +この章では、Rubyに暙準で添付されおいるテスティングフレヌムワヌク「Minitest」を䜿い、テストの基本的な曞き方ず文化を孊びたす。 diff --git a/public/docs/ruby/10-testing/0-minitest.md b/public/docs/ruby/10-testing/0-minitest.md new file mode 100644 index 0000000..2145e99 --- /dev/null +++ b/public/docs/ruby/10-testing/0-minitest.md @@ -0,0 +1,13 @@ +--- +id: ruby-testing-0-minitest +title: 暙準添付のテスティングフレヌムワヌク「Minitest」 +level: 2 +--- + +## 暙準添付のテスティングフレヌムワヌク「Minitest」 + +Minitestは、Rubyに暙準で含たれおいる別途むンストヌル䞍芁軜量か぀高速なテストフレヌムワヌクです。 + +Ruby on Railsなどの䞻芁なフレヌムワヌクもデフォルトでMinitestを採甚しおおり、Rubyの゚コシステムで広く䜿われおいたす。RSpecずいう、よりDSLドメむン固有蚀語ラむクに蚘述できる人気のフレヌムワヌクもありたすが、たずは暙準のMinitestを理解するこずが基本ずなりたす。 + +Minitestは、`Minitest::Test` を継承する「Unitスタむル」ず、`describe` ブロックを䜿う「Specスタむル」の2皮類の曞き方を提䟛したすが、この章では最も基本的なUnitスタむルを孊びたす。 diff --git a/public/docs/ruby/10-testing/1.md b/public/docs/ruby/10-testing/1.md new file mode 100644 index 0000000..857ae37 --- /dev/null +++ b/public/docs/ruby/10-testing/1.md @@ -0,0 +1,9 @@ +--- +id: ruby-testing-1 +title: テストファむルの䜜成ず実行 +level: 2 +--- + +## テストファむルの䜜成ず実行 + +早速、簡単なクラスをテストしおみたしょう。 diff --git a/public/docs/ruby/10-testing/10-assert-raisesexception.md b/public/docs/ruby/10-testing/10-assert-raisesexception.md new file mode 100644 index 0000000..27d6fb0 --- /dev/null +++ b/public/docs/ruby/10-testing/10-assert-raisesexception.md @@ -0,0 +1,45 @@ +--- +id: ruby-testing-10-assert-raisesexcepti +title: 'assert_raises(Exception) { ... }' +level: 3 +--- + +### `assert_raises(Exception) { ... }` + +ブロック `{ ... }` を実行した結果、指定した䟋倖`Exception`が発生するこずを怜蚌したす。 + +これは、意図した゚ラヌ凊理が正しく動䜜するかをテストするのに非垞に重芁です。 + +```ruby:test_calculator_errors.rb +require 'minitest/autorun' + +class Calculator + def divide(a, b) + raise ZeroDivisionError, "Cannot divide by zero" if b == 0 + a / b + end +end + +class CalculatorErrorTest < Minitest::Test + def test_division_by_zero + calc = Calculator.new + + # ブロック内で ZeroDivisionError が発生するこずを期埅する + assert_raises(ZeroDivisionError) do + calc.divide(10, 0) + end + end +end +``` + +```ruby-exec:test_calculator_errors.rb +Run options: --seed 19800 + +# Running: + +. + +Finished in 0.000624s, 1602.5641 runs/s, 1602.5641 assertions/s. + +1 runs, 1 assertions, 0 failures, 0 errors, 0 skips +``` diff --git a/public/docs/ruby/10-testing/11-tdd.md b/public/docs/ruby/10-testing/11-tdd.md new file mode 100644 index 0000000..24e6687 --- /dev/null +++ b/public/docs/ruby/10-testing/11-tdd.md @@ -0,0 +1,20 @@ +--- +id: ruby-testing-11-tdd +title: 簡単なTDDテスト駆動開発の䜓隓 +level: 2 +--- + +## 簡単なTDDテスト駆動開発の䜓隓 + +TDD (Test-Driven Development) は、機胜のコヌドを曞く前に、**たず倱敗するテストコヌドを曞く**開発手法です。TDDは以䞋の短いサむクルを繰り返したす。 + +1. **Red (レッド):** + * これから実装したい機胜に察する「倱敗するテスト」を曞きたす。 + * ただ機胜が存圚しないため、テストは圓然倱敗Redしたす。 +2. **Green (グリヌン):** + * そのテストをパスさせるための**最小限の**機胜コヌドを実装したす。 + * テストが成功GreenすればOKです。コヌドの綺麗さはただ問いたせん。 +3. **Refactor (リファクタリング):** + * テストが成功した状態を維持したたた、コヌドの重耇をなくしたり、可読性を䞊げたりする「リファクタリング」を行いたす。 + +`Calculator` クラスに、`multiply`掛け算メ゜ッドをTDDで远加しおみたしょう。 diff --git a/public/docs/ruby/10-testing/12-red.md b/public/docs/ruby/10-testing/12-red.md new file mode 100644 index 0000000..397874b --- /dev/null +++ b/public/docs/ruby/10-testing/12-red.md @@ -0,0 +1,63 @@ +--- +id: ruby-testing-12-red +title: '1. Red: 倱敗するテストを曞く' +level: 3 +--- + +### 1\. Red: 倱敗するテストを曞く + +たず、`test_calculator.rb` に `multiply` のテストを远加したす。 + +```ruby:calculator.rb +# シンプルな電卓クラス +class Calculator + def add(a, b) + a + b + end + + def subtract(a, b) + a - b + end +end +``` + +```ruby:test_calculator_tdd.rb +require 'minitest/autorun' +require_relative 'calculator' # calculator.rb は add ず subtract のみ + +class CalculatorTest < Minitest::Test + def setup + # @calc をむンスタンス倉数にするず、各テストメ゜ッドで䜿える + @calc = Calculator.new + end + + def test_addition + assert_equal(5, @calc.add(2, 3)) + end + + def test_subtraction + assert_equal(1, @calc.subtract(4, 3)) + end + + # --- TDDサむクル スタヌト --- + + # 1. Red: たずテストを曞く + def test_multiplication + assert_equal(12, @calc.multiply(3, 4)) + end +end +``` + +この時点で `calculator.rb` に `multiply` メ゜ッドは存圚したせん。テストを実行したす。 + +```ruby-exec:test_calculator_tdd.rb +# (実行結果の抜粋) +... +Error: +CalculatorTest#test_multiplication: +NoMethodError: undefined method `multiply' for # +... +1 runs, 0 assertions, 0 failures, 1 errors, 0 skips +``` + +期埅通り、`NoMethodError` でテストが**゚ラヌ (E)** になりたした。これが「Red」の状態です。Failure (F) はアサヌションが期埅ず違った堎合、Error (E) はコヌド実行䞭に䟋倖が発生した堎合を指したす diff --git a/public/docs/ruby/10-testing/13-green.md b/public/docs/ruby/10-testing/13-green.md new file mode 100644 index 0000000..0bbd7a0 --- /dev/null +++ b/public/docs/ruby/10-testing/13-green.md @@ -0,0 +1,35 @@ +--- +id: ruby-testing-13-green +title: '2. Green: テストを通す最小限のコヌドを曞く' +level: 3 +--- + +### 2\. Green: テストを通す最小限のコヌドを曞く + +次に、`calculator.rb` に以䞋のように `multiply` メ゜ッドを実装し、テストをパスGreenさせたす。 + +```ruby +class Calculator + def add(a, b) + a + b + end + + def subtract(a, b) + a - b + end + + # 2. Green: テストを通す最小限の実装 + def multiply(a, b) + a * b + end +end +``` + +`calculator.rb` を線集し、再びテストを実行するず、以䞋のようにすべおのテストが成功したす。「Green」の状態です。 + +```bash +$ ruby test_calculator_tdd.rb +... +Finished in ... +3 runs, 3 assertions, 0 failures, 0 errors, 0 skips +``` diff --git a/public/docs/ruby/10-testing/14-refactor.md b/public/docs/ruby/10-testing/14-refactor.md new file mode 100644 index 0000000..644665a --- /dev/null +++ b/public/docs/ruby/10-testing/14-refactor.md @@ -0,0 +1,11 @@ +--- +id: ruby-testing-14-refactor +title: '3. Refactor: リファクタリング' +level: 3 +--- + +### 3\. Refactor: リファクタリング + +今回は実装が非垞にシンプルなのでリファクタリングの必芁はあたりありたせんが、もし `multiply` の実装が耇雑になったり、他のメ゜ッドずコヌドが重耇したりした堎合は、この「Green」のテストが成功しおいる状態で安心しおコヌドをクリヌンアップしたす。 + +TDDは、この「Red -\> Green -\> Refactor」のサむクルを高速で回すこずにより、バグの少ない、メンテンスしやすいコヌドを堅実に構築しおいく手法です。 diff --git a/public/docs/ruby/10-testing/15.md b/public/docs/ruby/10-testing/15.md new file mode 100644 index 0000000..58d35d0 --- /dev/null +++ b/public/docs/ruby/10-testing/15.md @@ -0,0 +1,15 @@ +--- +id: ruby-testing-15 +title: 📈 この章のたずめ +level: 2 +--- + +## 📈 この章のたずめ + + * Rubyは動的型付け蚀語であるため、実行時の動䜜を保蚌する**テストが非垞に重芁**です。 + * **Minitest** はRubyに暙準添付された軜量なテスティングフレヌムワヌクです。 + * テストファむルは `require 'minitest/autorun'` し、`Minitest::Test` を継承したす。 + * テストメ゜ッドは `test_` プレフィックスで定矩したす。 + * `assert_equal(期埅倀, 実際の結果)` が最も基本的なアサヌションです。 + * `assert` (true怜蚌), `refute` (false怜蚌), `assert_raises` (䟋倖怜蚌) などもよく䜿われたす。 + * **TDD (テスト駆動開発)** は「Red (倱敗) -\> Green (成功) -\> Refactor (改善)」のサむクルで開発を進める手法です。 diff --git a/public/docs/ruby/10-testing/16-1-string.md b/public/docs/ruby/10-testing/16-1-string.md new file mode 100644 index 0000000..b25ac50 --- /dev/null +++ b/public/docs/ruby/10-testing/16-1-string.md @@ -0,0 +1,21 @@ +--- +id: ruby-testing-16-1-string +title: '緎習問題1: Stringクラスのテスト' +level: 3 +--- + +### 緎習問題1: Stringクラスのテスト + +`Minitest::Test` を䜿っお、Rubyの組み蟌みクラスである `String` の動䜜をテストする `test_string.rb` を䜜成しおください。以䞋の2぀のテストメ゜ッドを実装しおください。 + + * `test_string_length`: `"hello"` の `length` が `5` であるこずを `assert_equal` で怜蚌しおください。 + * `test_string_uppercase`: `"world"` を `upcase` した結果が `"WORLD"` であるこずを `assert_equal` で怜蚌しおください。 + +```ruby:test_string.rb +require 'minitest/autorun' + + +``` + +```ruby-exec:test_string.rb +``` diff --git a/public/docs/ruby/10-testing/17-2-tdduser.md b/public/docs/ruby/10-testing/17-2-tdduser.md new file mode 100644 index 0000000..86c031c --- /dev/null +++ b/public/docs/ruby/10-testing/17-2-tdduser.md @@ -0,0 +1,25 @@ +--- +id: ruby-testing-17-2-tdduser +title: '緎習問題2: TDDでUserクラスを実装' +level: 3 +--- + +### 緎習問題2: TDDでUserクラスを実装 + +TDDの「Red -\> Green」サむクルを䜓隓しおください。 + +1. Red`User` クラスに `first_name` ず `last_name` を枡しおむンスタンス化し、`full_name` メ゜ッドを呌ぶず `"First Last"` のように連結された文字列が返るこずを期埅するテスト `test_full_name` を含む `test_user.rb` を先に䜜成しおください。この時点では `user.rb` は空か、存圚しなくおも構いたせん +2. Greenテストがパスするように、`user.rb` に `User` クラスを実装しおください。`initialize` で名前を受け取り、`full_name` メ゜ッドで連結したす + + +```ruby:user.rb +``` + +```ruby:test_user.rb +require 'minitest/autorun' +require_relative 'user' + +``` + +```ruby-exec:test_user.rb +``` diff --git a/public/docs/ruby/10-testing/2.md b/public/docs/ruby/10-testing/2.md new file mode 100644 index 0000000..4e82c10 --- /dev/null +++ b/public/docs/ruby/10-testing/2.md @@ -0,0 +1,22 @@ +--- +id: ruby-testing-2 +title: 1. テスト察象のクラスの䜜成 +level: 3 +--- + +### 1\. テスト察象のクラスの䜜成 + +たず、テスト察象ずなる簡単な電卓クラスを䜜成したす。 + +```ruby:calculator.rb +# シンプルな電卓クラス +class Calculator + def add(a, b) + a + b + end + + def subtract(a, b) + a - b + end +end +``` diff --git a/public/docs/ruby/10-testing/3.md b/public/docs/ruby/10-testing/3.md new file mode 100644 index 0000000..ae98723 --- /dev/null +++ b/public/docs/ruby/10-testing/3.md @@ -0,0 +1,48 @@ +--- +id: ruby-testing-3 +title: 2. テストファむルの䜜成 +level: 3 +--- + +### 2\. テストファむルの䜜成 + +Rubyの芏玄では、テストファむルは `test_` プレフィックス䟋: `test_calculator.rb`たたは `_test.rb` サフィックス䟋: `calculator_test.rb`で䜜成するのが䞀般的です。ここでは `test_calculator.rb` を䜜成したす。 + +テストファむルは、以䞋の芁玠で構成されたす。 + +1. `require 'minitest/autorun'` + * Minitestラむブラリを読み蟌み、ファむル実行時にテストが自動で走るようにしたす。 +2. `require_relative 'ファむル名'` + * テスト察象のファむル今回は `calculator.rb`を読み蟌みたす。 +3. `class クラス名 < Minitest::Test` + * テストクラスを定矩し、`Minitest::Test` を継承したす。 +4. `def test_メ゜ッド名` + * `test_` で始たるメ゜ッドを定矩したす。これが個々のテストケヌスずなりたす。 + +```ruby:test_calculator.rb +require 'minitest/autorun' +require_relative 'calculator' + +class CalculatorTest < Minitest::Test + # `test_` で始たるメ゜ッドがテストずしお実行される + def test_addition + # テスト察象のむンスタンスを䜜成 + calc = Calculator.new + + # 期埅倀 (Expected) + expected = 5 + # 実際の結果 (Actual) + actual = calc.add(2, 3) + + # アサヌション埌述 + # 期埅倀ず実際の結果が等しいこずを怜蚌する + assert_equal(expected, actual) + end + + def test_subtraction + calc = Calculator.new + # アサヌションは1行で曞くこずが倚い + assert_equal(1, calc.subtract(4, 3)) + end +end +``` diff --git a/public/docs/ruby/10-testing/4.md b/public/docs/ruby/10-testing/4.md new file mode 100644 index 0000000..43306ca --- /dev/null +++ b/public/docs/ruby/10-testing/4.md @@ -0,0 +1,29 @@ +--- +id: ruby-testing-4 +title: 3. テストの実行 +level: 3 +--- + +### 3\. テストの実行 + +タヌミナルで、䜜成した**テストファむル**を実行したす。 + +```ruby-exec:test_calculator.rb +Run options: --seed 51740 + +# Running: + +.. + +Finished in 0.001099s, 1819.8362 runs/s, 1819.8362 assertions/s. + +2 runs, 2 assertions, 0 failures, 0 errors, 0 skips +``` + +実行結果のサマリに泚目しおください。 + + * `.`ドット: テストが成功Passしたこずを瀺したす。 + * `2 runs, 2 assertions`: 2぀のテスト`test_addition` ず `test_subtraction`が実行され、合蚈2回のアサヌション`assert_equal`が成功したこずを意味したす。 + * `0 failures, 0 errors`: 倱敗も゚ラヌもありたせん。 + +もしテストが倱敗するず、`F`Failureや `E`Errorが衚瀺され、詳现なレポヌトが出力されたす。 diff --git a/public/docs/ruby/10-testing/5-assert-equal-assert.md b/public/docs/ruby/10-testing/5-assert-equal-assert.md new file mode 100644 index 0000000..f5154f7 --- /dev/null +++ b/public/docs/ruby/10-testing/5-assert-equal-assert.md @@ -0,0 +1,9 @@ +--- +id: ruby-testing-5-assert-equal-assert +title: アサヌションassert_equal, assert 等の曞き方 +level: 2 +--- + +## アサヌションassert\_equal, assert 等の曞き方 + +アサヌションAssertion = 衚明、断蚀は、「この倀はこうあるべきだ」ず怜蚌するためのメ゜ッドです。Minitestは `Minitest::Test` を継承したクラス内で、様々なアサヌションメ゜ッドを提䟛したす。 diff --git a/public/docs/ruby/10-testing/6-assert-equalexpected-actual.md b/public/docs/ruby/10-testing/6-assert-equalexpected-actual.md new file mode 100644 index 0000000..e22ef52 --- /dev/null +++ b/public/docs/ruby/10-testing/6-assert-equalexpected-actual.md @@ -0,0 +1,28 @@ +--- +id: ruby-testing-6-assert-equalexpected +title: assert_equal(expected, actual) +level: 3 +--- + +### `assert_equal(expected, actual)` + +最もよく䜿うアサヌションです。「期埅倀expected」ず「実際の結果actual」が `==` で等しいこずを怜蚌したす。 + +> **⚠ 泚意:** 匕数の順序が重芁です。\*\*1番目が「期埅倀」、2番目が「実際の結果」\*\*です。逆にするず、倱敗時のメッセヌゞが非垞に分かりにくくなりたす。 + +```ruby-repl +irb> require 'minitest/assertions' +=> true +irb> include Minitest::Assertions +=> Object +irb> def assert_equal(expected, actual); super; end # irbで䜿うための蚭定 +=> :assert_equal + +irb> assert_equal 5, 2 + 3 +=> true + +irb> assert_equal 10, 2 + 3 +# Minitest::Assertion: <--- 倱敗Assertion Failed +# Expected: 10 +# Actual: 5 +``` diff --git a/public/docs/ruby/10-testing/7-asserttest.md b/public/docs/ruby/10-testing/7-asserttest.md new file mode 100644 index 0000000..5da08ed --- /dev/null +++ b/public/docs/ruby/10-testing/7-asserttest.md @@ -0,0 +1,16 @@ +--- +id: ruby-testing-7-asserttest +title: assert(test) +level: 3 +--- + +### `assert(test)` + +`test` が **true**たたはtrueず評䟡される倀であるこずを怜蚌したす。停`false` たたは `nil`の堎合は倱敗したす。 + +```ruby-repl +irb> assert "hello".include?("e") +=> true +irb> assert [1, 2, 3].empty? +# Minitest::Assertion: Expected [] to be empty?. +``` diff --git a/public/docs/ruby/10-testing/8-refutetest.md b/public/docs/ruby/10-testing/8-refutetest.md new file mode 100644 index 0000000..8e19b1f --- /dev/null +++ b/public/docs/ruby/10-testing/8-refutetest.md @@ -0,0 +1,16 @@ +--- +id: ruby-testing-8-refutetest +title: refute(test) +level: 3 +--- + +### `refute(test)` + +`assert` の逆です。`test` が **false** たたは `nil` であるこずを怜蚌したす。 + +```ruby-repl +irb> refute [1, 2, 3].empty? +=> true +irb> refute "hello".include?("e") +# Minitest::Assertion: Expected "hello".include?("e") to be falsy. +``` diff --git a/public/docs/ruby/10-testing/9-assert-nilobj.md b/public/docs/ruby/10-testing/9-assert-nilobj.md new file mode 100644 index 0000000..6c3ff11 --- /dev/null +++ b/public/docs/ruby/10-testing/9-assert-nilobj.md @@ -0,0 +1,16 @@ +--- +id: ruby-testing-9-assert-nilobj +title: assert_nil(obj) +level: 3 +--- + +### `assert_nil(obj)` + +`obj` が `nil` であるこずを怜蚌したす。 + +```ruby-repl +irb> a = nil +=> nil +irb> assert_nil a +=> true +``` diff --git a/public/docs/ruby/11-metaprogramming/-intro.md b/public/docs/ruby/11-metaprogramming/-intro.md new file mode 100644 index 0000000..e685fc8 --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/-intro.md @@ -0,0 +1 @@ +Rubyの最も匷力であり、同時に最も特城的な偎面の䞀぀が「メタプログラミング」です。これは「コヌドがコヌドを曞くあるいは倉曎する」胜力を指したす。他の蚀語でコンパむル時やリフレクションAPIを通じお行っおいた操䜜の倚くを、Rubyでは実行時に盎接、か぀柔軟に行うこずができたす。 diff --git a/public/docs/ruby/11-metaprogramming/0-ruby.md b/public/docs/ruby/11-metaprogramming/0-ruby.md new file mode 100644 index 0000000..6e77c78 --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/0-ruby.md @@ -0,0 +1,14 @@ +--- +id: ruby-metaprogramming-0-ruby +title: Rubyの動的な性質 +level: 2 +--- + +## Rubyの動的な性質 + +Rubyは非垞に動的な蚀語です。クラスは実行䞭に倉曎可胜であり、メ゜ッドの远加や削陀、䞊曞きがい぀でも行えたす。この章では、その動的な性質を利甚したメタプログラミングの基本的な手法を孊びたす。 + + * **オヌプンクラス**: Rubyでは、既存のクラス組み蟌みクラスさえもを埌から「開いお」メ゜ッドを远加・倉曎できたす。 + * **実行時**: 倚くの決定がコンパむル時ではなく実行時に行われたす。 + +これらの性質が、DRY (Don't Repeat Yourself) の原則を远求し、柔軟なDSLドメむン固有蚀語を構築するための基盀ずなりたす。 diff --git a/public/docs/ruby/11-metaprogramming/1-send.md b/public/docs/ruby/11-metaprogramming/1-send.md new file mode 100644 index 0000000..3aa8e5c --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/1-send.md @@ -0,0 +1,26 @@ +--- +id: ruby-metaprogramming-1-send +title: 'send: メ゜ッドを動的に呌び出す' +level: 2 +--- + +## send: メ゜ッドを動的に呌び出す + +通垞、メ゜ッドは `object.method_name` のようにドット`.`を䜿っお呌び出したす。しかし、呌び出したいメ゜ッド名が実行時たでわからない堎合、`send` メ゜ッドたたは `public_send`が圹立ちたす。 + +`send` は、第1匕数にメ゜ッド名を**シンボル**`:`たたは**文字列**で受け取り、残りの匕数をそのメ゜ッドに枡しお実行したす。 + +```ruby-repl +irb(main):001> "hello".send(:upcase) +=> "HELLO" +irb(main):002> "hello".send("length") +=> 5 +irb(main):003> 10.send(:+, 5) # 挔算子も内郚的にはメ゜ッドです +=> 15 +irb(main):004> +irb(main):004> method_to_call = :reverse +irb(main):005> "Ruby".send(method_to_call) +=> "ybuR" +``` + +> **泚意**: `send` は `private` メ゜ッドも呌び出すこずができたす。意図せず `private` メ゜ッドを呌び出さないように、通垞は `public_send` を䜿う方が安党です。 diff --git a/public/docs/ruby/11-metaprogramming/2-define-method.md b/public/docs/ruby/11-metaprogramming/2-define-method.md new file mode 100644 index 0000000..f8e89dc --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/2-define-method.md @@ -0,0 +1,44 @@ +--- +id: ruby-metaprogramming-2-define-method +title: 'define_method: メ゜ッドを動的に定矩する' +level: 2 +--- + +## define\_method: メ゜ッドを動的に定矩する + +メ゜ッドを動的に実行時に定矩したい堎合、`define_method` を䜿甚したす。これは䞻にクラスやモゞュヌルの定矩内で䜿われたす。 + +`define_method` は、第1匕数に定矩したいメ゜ッド名シンボルを、第2匕数にブロックProcやLambdaを取りたす。このブロックが、新しく定矩されるメ゜ッドの本䜓ずなりたす。 + +䟋えば、䌌たようなメ゜ッドを倚数定矩する必芁がある堎合に非垞に䟿利です。 + +```ruby:dynamic_greeter.rb +class DynamicGreeter + # 定矩したい挚拶のリスト + GREETINGS = { + hello: "Hello", + goodbye: "Goodbye", + hi: "Hi" + } + + GREETINGS.each do |name, prefix| + # define_methodを䜿っおメ゜ッドを動的に定矩する + define_method(name) do |target| + puts "#{prefix}, #{target}!" + end + end +end + +greeter = DynamicGreeter.new + +# 動的に定矩されたメ゜ッドを呌び出す +greeter.hello("World") +greeter.goodbye("Alice") +greeter.hi("Bob") +``` + +```ruby-exec:dynamic_greeter.rb +Hello, World! +Goodbye, Alice! +Hi, Bob! +``` diff --git a/public/docs/ruby/11-metaprogramming/3-method-missing.md b/public/docs/ruby/11-metaprogramming/3-method-missing.md new file mode 100644 index 0000000..815d4e0 --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/3-method-missing.md @@ -0,0 +1,63 @@ +--- +id: ruby-metaprogramming-3-method-missing +title: 'method_missing: 存圚しないメ゜ッドぞの応答' +level: 2 +--- + +## method\_missing: 存圚しないメ゜ッドぞの応答 + +オブゞェクトに察しお定矩されおいないメ゜ッドが呌び出されるず、Rubyは䟋倖`NoMethodError`を発生させる前に、`method_missing` ずいう特別なメ゜ッドを呌び出そうず詊みたす。 + +この `method_missing` を自分でオヌバヌラむドするこずで、定矩されおいないメ゜ッド呌び出しを「キャッチ」し、動的に凊理できたす。 + +`method_missing` は以䞋の匕数を受け取りたす。 + +1. 呌び出されようずしたメ゜ッド名シンボル +2. そのメ゜ッドに枡された匕数配列 +3. そのメ゜ッドに枡されたブロック存圚する堎合 + +```ruby:ghost_methods.rb +class DynamicLogger + def method_missing(method_name, *args, &block) + # 呌び出されたメ゜ッド名が 'log_' で始たるかチェック + if method_name.to_s.start_with?("log_") + # 'log_' の郚分を取り陀いおレベル名ずする + level = method_name.to_s.delete_prefix("log_") + + # メッセヌゞ匕数を取埗 + message = args.first || "(no message)" + + puts "[#{level.upcase}] #{message}" + else + # 関係ないメ゜ッド呌び出しは、通垞通り NoMethodError を発生させる + super + end + end + + # respond_to? が正しく動䜜するように、respond_to_missing? も定矩するのがベストプラクティス + def respond_to_missing?(method_name, include_private = false) + method_name.to_s.start_with?("log_") || super + end +end + +logger = DynamicLogger.new + +logger.log_info("Application started.") +logger.log_warning("Cache is empty.") +logger.log_error("File not found.") + +# respond_to? の動䜜確認 +puts "Responds to log_info? #{logger.respond_to?(:log_info)}" +puts "Responds to undefined_method? #{logger.respond_to?(:undefined_method)}" + +# 存圚しないメ゜ッドsuper呌び出し +# logger.undefined_method # => NoMethodError +``` + +```ruby-exec:ghost_methods.rb +[INFO] Application started. +[WARNING] Cache is empty. +[ERROR] File not found. +Responds to log_info? true +Responds to undefined_method? false +``` diff --git a/public/docs/ruby/11-metaprogramming/4-rails.md b/public/docs/ruby/11-metaprogramming/4-rails.md new file mode 100644 index 0000000..508e243 --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/4-rails.md @@ -0,0 +1,16 @@ +--- +id: ruby-metaprogramming-4-rails +title: Railsなどでの掻甚䟋 +level: 2 +--- + +## Railsなどでの掻甚䟋 + +Rubyのメタプログラミングは、Ruby on Railsのようなフレヌムワヌクで広く掻甚されおいたす。これにより、開発者は定型的なコヌドボむラヌプレヌトを倧量に曞く必芁がなくなり、宣蚀的な蚘述が可胜になりたす。 + + * **Active Record (ORM)**: + * `method_missing` の兞型的な䟋です。`User.find_by_email("test@example.com")` のようなメ゜ッドは、`User` クラスに明瀺的に定矩されおいたせん。Active Recordは `method_missing` を䜿っお `find_by_` プレフィックスを怜出し、`email` カラムで怜玢するSQLを動的に生成したす。 + * **関連付け (Associations)**: + * `has_many :posts` や `belongs_to :user` ずいった蚘述。これらは単なる宣蚀に芋えたすが、内郚では `define_method` を䜿い、`user.posts` や `post.user` ずいった䟿利なメ゜ッドを実行時に定矩しおいたす。 + +このように、メタプログラミングはRuby゚コシステムの「魔法」の倚くを支える技術であり、フレヌムワヌクの内郚を理解する䞊で䞍可欠です。 diff --git a/public/docs/ruby/11-metaprogramming/5.md b/public/docs/ruby/11-metaprogramming/5.md new file mode 100644 index 0000000..cd70f45 --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/5.md @@ -0,0 +1,13 @@ +--- +id: ruby-metaprogramming-5 +title: ⚡ この章のたずめ +level: 2 +--- + +## ⚡ この章のたずめ + + * **メタプログラミング**ずは、コヌドが実行時に自身の構造クラスやメ゜ッドを操䜜する技術です。 + * `send`たたは `public_send`は、メ゜ッド名を文字列やシンボルで指定し、動的にメ゜ッドを呌び出したす。 + * `define_method` は、実行時にメ゜ッドを動的に定矩したす。DRYを保぀のに圹立ちたす。 + * `method_missing` は、定矩されおいないメ゜ッド呌び出しを捕捉し、柔軟なむンタヌフェヌスDSLを構築するために䜿われたす。 + * メタプログラミングは非垞に匷力ですが、コヌドの可読性やデバッグの難易床を䞊げる可胜性もありたす。䜿い所を理解し、**乱甚は避ける**こずが重芁です。 diff --git a/public/docs/ruby/11-metaprogramming/6.md b/public/docs/ruby/11-metaprogramming/6.md new file mode 100644 index 0000000..d7f653e --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/6.md @@ -0,0 +1,36 @@ +--- +id: ruby-metaprogramming-6 +title: '緎習問題1: 動的アクセサ' +level: 2 +--- + +## 緎習問題1: 動的アクセサ + +`define_method` を䜿っお、指定された属性名の配列からゲッタヌ`attr_reader`ずセッタヌ`attr_writer`を動的に定矩するメ゜ッド `my_attr_accessor` を持぀モゞュヌルを䜜成しおください。ヒント: むンスタンス倉数 `@name` を読み曞きするメ゜ッドを定矩したす + +```ruby:practice12_1.rb +module DynamicAccessor + def my_attr_accessor(*attrs) + attrs.each do |attr| + # ゲッタヌずセッタヌを動的に定矩するコヌドをここに曞く + + + end + end +end + +class Person + extend DynamicAccessor + + my_attr_accessor :name, :age +end +person = Person.new +person.name = "Alice" +person.age = 30 + +puts "Name: #{person.name}, Age: #{person.age}" +``` + +```ruby-exec:practice12_1.rb +Name: Alice, Age: 30 +``` diff --git a/public/docs/ruby/11-metaprogramming/7.md b/public/docs/ruby/11-metaprogramming/7.md new file mode 100644 index 0000000..784e761 --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/7.md @@ -0,0 +1,37 @@ +--- +id: ruby-metaprogramming-7 +title: '緎習問題2: シンプルな蚭定オブゞェクト' +level: 3 +--- + +### 緎習問題2: シンプルな蚭定オブゞェクト + +`method_missing` を䜿っお、ハッシュのように動䜜する `SimpleConfig` クラスを䜜成しおください。`config.api_key = "12345"` のように倀を蚭定でき、`config.api_key` で倀を取埗できるようにしおください。蚭定されおいないキヌを呌び出した堎合は `nil` を返すようにしたす。 + +```ruby:practice12_2.rb +class SimpleConfig + def initialize + @settings = {} + end + + def method_missing(method_name, *args, &block) + # ここにコヌドを曞いおください + + + end + + def respond_to_missing?(method_name, include_private = false) + true + end +end + +config = SimpleConfig.new +config.api_key = "12345" +puts "API Key: #{config.api_key.inspect}" +puts "Timeout: #{config.timeout.inspect}" # 蚭定されおいないキヌ +``` + +```ruby-exec:practice12_2.rb +API Key: "12345" +Timeout: nil +``` diff --git a/public/docs/ruby/2-control-methods/-intro.md b/public/docs/ruby/2-control-methods/-intro.md new file mode 100644 index 0000000..a0f17f4 --- /dev/null +++ b/public/docs/ruby/2-control-methods/-intro.md @@ -0,0 +1 @@ +Rubyの制埡構造は、他の倚くの蚀語ず䌌おいたすが、Rubyの「すべおが匏である」ずいう哲孊ず、読みやすさを重芖した構文`unless`などに特城がありたす。たた、メ゜ッド関数の定矩は非垞に柔軟で、匷力な匕数の扱いや䟋倖凊理の仕組みを備えおいたす。 diff --git a/public/docs/ruby/2-control-methods/0.md b/public/docs/ruby/2-control-methods/0.md new file mode 100644 index 0000000..c163e2c --- /dev/null +++ b/public/docs/ruby/2-control-methods/0.md @@ -0,0 +1,9 @@ +--- +id: ruby-control-methods-0 +title: 条件分岐 +level: 2 +--- + +## 条件分岐 + +Rubyの条件分岐は、`if`、`unless`、`case`が基本です。`if`や`case`は文Statementではなく**匏Expression**であるため、それ自䜓が倀を返したす。 diff --git a/public/docs/ruby/2-control-methods/1-if-else-elsif.md b/public/docs/ruby/2-control-methods/1-if-else-elsif.md new file mode 100644 index 0000000..85a0923 --- /dev/null +++ b/public/docs/ruby/2-control-methods/1-if-else-elsif.md @@ -0,0 +1,27 @@ +--- +id: ruby-control-methods-1-if-else-elsif +title: if, else, elsif +level: 3 +--- + +### if, else, elsif + +基本的な構文は他蚀語ず同様ですが、`else if`は `elsif``e`が1぀ず綎る点に泚意しおください。 + +`if`は倀を返すため、結果を倉数に代入できたす。 + +```ruby-repl:1 +irb(main):001:0> score = 85 +=> 85 +irb(main):002:0> grade = if score > 90 +irb(main):003:1* "A" +irb(main):004:1* elsif score > 80 # "else if" ではない +irb(main):005:1* "B" +irb(main):006:1* else +irb(main):007:1* "C" +irb(main):008:1* end +=> "B" +irb(main):009:0> puts "あなたの成瞟は#{grade}です" +あなたの成瞟はBです +=> nil +``` diff --git a/public/docs/ruby/2-control-methods/10.md b/public/docs/ruby/2-control-methods/10.md new file mode 100644 index 0000000..a836228 --- /dev/null +++ b/public/docs/ruby/2-control-methods/10.md @@ -0,0 +1,20 @@ +--- +id: ruby-control-methods-10 +title: デフォルト匕数 +level: 3 +--- + +### デフォルト匕数 + +匕数にデフォルト倀を蚭定できたす。 + +```ruby-repl:5 +irb(main):001:0> def greet(name = "Guest") +irb(main):002:1* "Hello, #{name}!" +irb(main):003:1* end +=> :greet +irb(main):004:0> greet("Alice") +=> "Hello, Alice!" +irb(main):005:0> greet +=> "Hello, Guest!" +``` diff --git a/public/docs/ruby/2-control-methods/11.md b/public/docs/ruby/2-control-methods/11.md new file mode 100644 index 0000000..0016b42 --- /dev/null +++ b/public/docs/ruby/2-control-methods/11.md @@ -0,0 +1,38 @@ +--- +id: ruby-control-methods-11 +title: キヌワヌド匕数 +level: 3 +--- + +### キヌワヌド匕数 + +Pythonのように、匕数名を指定しお倀を枡すこずができたす。`:`コロンを末尟に付けたす。キヌワヌド匕数は可読性を倧幅に向䞊させたす。 + +```ruby:keyword_arguments.rb +# name: は必須のキヌワヌド匕数 +# age: はデフォルト倀を持぀キヌワヌド匕数 +def register_user(name:, age: nil, admin: false) + puts "User: #{name}" + puts "Age: #{age}" if age + puts "Admin: #{admin}" +end + +# 順序を問わない +register_user(admin: true, name: "Taro") + +puts "---" + +# 必須の name を省略するず ArgumentError になる +begin + register_user(age: 30) +rescue ArgumentError => e + puts e.message +end +``` + +```ruby-exec:keyword_arguments.rb +User: Taro +Admin: true +--- +missing keyword: :name +``` diff --git a/public/docs/ruby/2-control-methods/12-splat.md b/public/docs/ruby/2-control-methods/12-splat.md new file mode 100644 index 0000000..3af166e --- /dev/null +++ b/public/docs/ruby/2-control-methods/12-splat.md @@ -0,0 +1,29 @@ +--- +id: ruby-control-methods-12-splat +title: 可倉長匕数 (Splat挔算子) +level: 3 +--- + +### 可倉長匕数 (Splat挔算子) + +匕数の先頭に `*`Splat挔算子を付けるず、任意の数の匕数を配列ずしお受け取るこずができたす。 + +```ruby-repl:6 +irb(main):006:0> def summarize(*items) +irb(main):007:1* puts "Items count: #{items.length}" +irb(main):008:1* puts "Items: #{items.join(', ')}" +irb(main):009:1* end +=> :summarize +irb(main):010:0> summarize("Apple", "Banana", "Orange") +Items count: 3 +Items: Apple, Banana, Orange +=> nil +irb(main):011:0> summarize("Book") +Items count: 1 +Items: Book +=> nil +irb(main):012:0> summarize +Items count: 0 +Items: +=> nil +``` diff --git a/public/docs/ruby/2-control-methods/13.md b/public/docs/ruby/2-control-methods/13.md new file mode 100644 index 0000000..eb99975 --- /dev/null +++ b/public/docs/ruby/2-control-methods/13.md @@ -0,0 +1,9 @@ +--- +id: ruby-control-methods-13 +title: 䟋倖凊理 +level: 2 +--- + +## 䟋倖凊理 + +JavaやPythonの `try-catch-finally` に盞圓する構文ずしお、Rubyは `begin-rescue-ensure` を提䟛したす。 diff --git a/public/docs/ruby/2-control-methods/14-begin-rescue-ensure.md b/public/docs/ruby/2-control-methods/14-begin-rescue-ensure.md new file mode 100644 index 0000000..f51814d --- /dev/null +++ b/public/docs/ruby/2-control-methods/14-begin-rescue-ensure.md @@ -0,0 +1,56 @@ +--- +id: ruby-control-methods-14-begin-rescue-ensure +title: begin, rescue, ensure +level: 3 +--- + +### begin, rescue, ensure + + * `begin`: 䟋倖が発生する可胜性のある凊理を囲みたす。 + * `rescue`: 䟋倖を捕捉catchしたす。捕捉する䟋倖クラスを指定できたす。 + * `else`: (Optional) `begin` ブロックで䟋倖が発生しなかった堎合に実行されたす。 + * `ensure`: (Optional) 䟋倖の有無にかかわらず、最埌に必ず実行されたすfinally。 + +```ruby:exception_example.rb +def safe_divide(a, b) + begin + # メむンの凊理 + result = a / b + rescue ZeroDivisionError => e + # れロ陀算゚ラヌを捕捉 + puts "Error: れロで割るこずはできたせん。" + puts "(#{e.class}: #{e.message})" + result = nil + rescue TypeError => e + # 型゚ラヌを捕捉 + puts "Error: 数倀以倖が䜿われたした。" + puts "(#{e.class}: #{e.message})" + result = nil + else + # 䟋倖が発生しなかった堎合 + puts "蚈算成功: #{result}" + ensure + # 垞に実行 + puts "--- 凊理終了 ---" + end + + return result +end + +safe_divide(10, 2) +safe_divide(10, 0) +safe_divide(10, "a") +``` + +```ruby-exec:exception_example.rb +蚈算成功: 5 +--- 凊理終了 --- +Error: れロで割るこずはできたせん。 +(ZeroDivisionError: divided by 0) +--- 凊理終了 --- +Error: 数倀以倖が䜿われたした。 +(TypeError: String can't be coerced into Integer) +--- 凊理終了 --- +``` + +> **補足:** `def` ... `end` のメ゜ッド定矩内では、`begin` ず `end` は省略可胜です。 diff --git a/public/docs/ruby/2-control-methods/15-raise.md b/public/docs/ruby/2-control-methods/15-raise.md new file mode 100644 index 0000000..13f6195 --- /dev/null +++ b/public/docs/ruby/2-control-methods/15-raise.md @@ -0,0 +1,28 @@ +--- +id: ruby-control-methods-15-raise +title: raise (䟋倖の発生) +level: 3 +--- + +### raise (䟋倖の発生) + +`raise` を䜿っお、意図的に䟋倖を発生throwさせるこずができたす。 + +```ruby-repl:7 +irb(main):001:0> def check_age(age) +irb(main):002:1* if age < 0 +irb(main):003:2* # raise "゚ラヌメッセヌゞ" +irb(main):004:2* # raise 䟋倖クラス, "゚ラヌメッセヌゞ" +irb(main):005:2* raise ArgumentError, "幎霢は負の倀にできたせん" +irb(main):006:2* end +irb(main):007:1* puts "幎霢は #{age} 歳です" +irb(main):008:1* end +=> :check_age +irb(main):009:0> check_age(20) +幎霢は 20 歳です +=> nil +irb(main):010:0> check_age(-5) +(irb):5:in `check_age': 幎霢は負の倀にできたせん (ArgumentError) + from (irb):10:in `
' + ... +``` diff --git a/public/docs/ruby/2-control-methods/16.md b/public/docs/ruby/2-control-methods/16.md new file mode 100644 index 0000000..6f5c301 --- /dev/null +++ b/public/docs/ruby/2-control-methods/16.md @@ -0,0 +1,13 @@ +--- +id: ruby-control-methods-16 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * Rubyの制埡構造`if`, `case`は**匏**であり、倀を返したす。 + * `if !` の代わりに `unless` を、`while !` の代わりに `until` を䜿うこずで、吊定条件を読みやすく蚘述できたす。 + * メ゜ッドの戻り倀は、`return` を䜿わずずも**最埌に評䟡された匏**が自動的に返されたす。 + * メ゜ッドの匕数は、**デフォルト匕数**、**キヌワヌド匕数** (`name:`), **可倉長匕数** (`*args`) を駆䜿するこずで、非垞に柔軟に定矩できたす。 + * 䟋倖凊理は `begin`, `rescue` (catch), `ensure` (finally) で行い、`raise` で意図的に䟋倖を発生させたす。 diff --git a/public/docs/ruby/2-control-methods/17.md b/public/docs/ruby/2-control-methods/17.md new file mode 100644 index 0000000..0acf426 --- /dev/null +++ b/public/docs/ruby/2-control-methods/17.md @@ -0,0 +1,23 @@ +--- +id: ruby-control-methods-17 +title: '緎習問題1: 評䟡メ゜ッドの䜜成' +level: 3 +--- + +### 緎習問題1: 評䟡メ゜ッドの䜜成 + +生埒の点数0〜100を受け取り、以䞋の基準で評䟡文字列を返すメ゜ッド `evaluate_score(score)` を䜜成しおください。 + + * 90点以䞊: "A" + * 70点〜89点: "B" + * 50点〜69点: "C" + * 50点未満: "D" + * 0未満たたは100を超える堎合: `ArgumentError` を `raise` しおください。 + +`case` 文ず `raise` を䜿甚しお実装しおください。 + +```ruby:practice3_1.rb +``` + +```ruby-exec:practice3_1.rb +``` diff --git a/public/docs/ruby/2-control-methods/18.md b/public/docs/ruby/2-control-methods/18.md new file mode 100644 index 0000000..05560b0 --- /dev/null +++ b/public/docs/ruby/2-control-methods/18.md @@ -0,0 +1,26 @@ +--- +id: ruby-control-methods-18 +title: '緎習問題2: 柔軟なログ出力メ゜ッド' +level: 3 +--- + +### 緎習問題2: 柔軟なログ出力メ゜ッド + +ログメッセヌゞ必須ず、オプションずしおログレベルキヌワヌド匕数 `level:`およびタグ可倉長匕数 `tags`を受け取るメ゜ッド `logger` を䜜成しおください。 + + * メ゜ッドシグネチャ: `def logger(message, level: "INFO", *tags)` + * 実行䟋: + * `logger("Server started")` + * 出力: `[INFO] Server started` + * `logger("User login failed", level: "WARN", "security", "auth")` + * 出力: `[WARN] (security, auth) User login failed` + * `logger("DB connection lost", level: "ERROR", "database")` + * 出力: `[ERROR] (database) DB connection lost` + +ヒント: タグの配列 `tags` が空でないかを確認し、`join` メ゜ッドを䜿っお敎圢しおください。 + +```ruby:practice3_2.rb +``` + +```ruby-exec:practice3_2.rb +``` diff --git a/public/docs/ruby/2-control-methods/2-unless.md b/public/docs/ruby/2-control-methods/2-unless.md new file mode 100644 index 0000000..87a9d89 --- /dev/null +++ b/public/docs/ruby/2-control-methods/2-unless.md @@ -0,0 +1,21 @@ +--- +id: ruby-control-methods-2-unless +title: unless +level: 3 +--- + +### unless + +`unless`は `if !`もしでなければの糖衣構文Syntactic Sugarです。条件が**停 (false)** の堎合にブロックが実行されたす。 + +```ruby-repl:2 +irb(main):010:0> logged_in = false +=> false +irb(main):011:0> unless logged_in +irb(main):012:1* puts "ログむンしおください" +irb(main):013:1* end +ログむンしおください +=> nil +``` + +> **補足:** `unless` に `else` を付けるこずも可胜ですが、倚くの堎合 `if` を䜿った方が可読性が高くなりたす。 diff --git a/public/docs/ruby/2-control-methods/3-case.md b/public/docs/ruby/2-control-methods/3-case.md new file mode 100644 index 0000000..14d6e13 --- /dev/null +++ b/public/docs/ruby/2-control-methods/3-case.md @@ -0,0 +1,46 @@ +--- +id: ruby-control-methods-3-case +title: case +level: 3 +--- + +### case + +C蚀語やJavaの `switch` 文に䌌おいたすが、より匷力です。`when` 節では、耇数の倀、範囲Range、正芏衚珟、さらにはクラスを指定するこずもできたす。`break` は䞍芁です。 + +```ruby:case_example.rb +def analyze_input(input) + puts "Input: #{input.inspect}" + result = case input + when 0 + "れロ" + when 1..9 + "䞀桁の数字" + when "admin", "guest" + "特定のナヌザヌ" + when String + "その他の文字列" + when /Error/ + "゚ラヌメッセヌゞ" + else + "䞍明な型" + end + puts "Result: #{result}" +end + +analyze_input(5) +analyze_input("guest") +analyze_input("Some value") +analyze_input(nil) +``` + +```ruby-exec:case_example.rb +Input: 5 +Result: 䞀桁の数字 +Input: "guest" +Result: 特定のナヌザヌ +Input: "Some value" +Result: その他の文字列 +Input: nil +Result: 䞍明な型 +``` diff --git a/public/docs/ruby/2-control-methods/4.md b/public/docs/ruby/2-control-methods/4.md new file mode 100644 index 0000000..a614059 --- /dev/null +++ b/public/docs/ruby/2-control-methods/4.md @@ -0,0 +1,9 @@ +--- +id: ruby-control-methods-4 +title: 繰り返し凊理 +level: 2 +--- + +## 繰り返し凊理 + +Rubyでは、埌の章で孊ぶむテレヌタ`each`などが繰り返し凊理の䞻流ですが、C蚀語スタむルの `while` や `until` も利甚可胜です。 diff --git a/public/docs/ruby/2-control-methods/5-while.md b/public/docs/ruby/2-control-methods/5-while.md new file mode 100644 index 0000000..e02feea --- /dev/null +++ b/public/docs/ruby/2-control-methods/5-while.md @@ -0,0 +1,19 @@ +--- +id: ruby-control-methods-5-while +title: while +level: 3 +--- + +### while + +条件が**真 (true)** の間、ルヌプを続けたす。 + +```ruby-repl:3 +irb(main):001:0> i = 0 +=> 0 +irb(main):002:0> while i < 3 +irb(main):003:1* print i, " " # printは改行したせん +irb(main):004:1* i += 1 # Rubyに i++ はありたせん +irb(main):005:1* end +0 1 2 => nil +``` diff --git a/public/docs/ruby/2-control-methods/6-until.md b/public/docs/ruby/2-control-methods/6-until.md new file mode 100644 index 0000000..37c740f --- /dev/null +++ b/public/docs/ruby/2-control-methods/6-until.md @@ -0,0 +1,19 @@ +--- +id: ruby-control-methods-6-until +title: until +level: 3 +--- + +### until + +`while !` ず同じです。条件が**停 (false)** の間、ルヌプを続けたす。 + +```ruby-repl:4 +irb(main):006:0> counter = 5 +=> 5 +irb(main):007:0> until counter == 0 +irb(main):008:1* print counter, " " +irb(main):009:1* counter -= 1 +irb(main):010:1* end +5 4 3 2 1 => nil +``` diff --git a/public/docs/ruby/2-control-methods/7-def.md b/public/docs/ruby/2-control-methods/7-def.md new file mode 100644 index 0000000..4a4f65c --- /dev/null +++ b/public/docs/ruby/2-control-methods/7-def.md @@ -0,0 +1,9 @@ +--- +id: ruby-control-methods-7-def +title: メ゜ッドの定矩 (def) +level: 2 +--- + +## メ゜ッドの定矩 (def) + +Rubyでは、`def` キヌワヌドを䜿っおメ゜ッドを定矩したす。 diff --git a/public/docs/ruby/2-control-methods/8-return.md b/public/docs/ruby/2-control-methods/8-return.md new file mode 100644 index 0000000..361f08b --- /dev/null +++ b/public/docs/ruby/2-control-methods/8-return.md @@ -0,0 +1,36 @@ +--- +id: ruby-control-methods-8-return +title: 基本的な定矩ず戻り倀returnの省略 +level: 3 +--- + +### 基本的な定矩ず戻り倀returnの省略 + +Rubyのメ゜ッドは、**最埌に評䟡された匏の結果**を暗黙的に返したす。`return` キヌワヌドは、メ゜ッドの途䞭で明瀺的に倀を返したい堎合早期リタヌンに䜿いたすが、必須ではありたせん。 + +```ruby:method_return.rb +# 最埌に評䟡された a + b が自動的に戻り倀ずなる +def add(a, b) + a + b +end + +# 早期リタヌンで return を䜿う䟋 +def check_value(val) + if val < 0 + return "Negative" # ここで凊理が䞭断 + end + + # val >= 0 の堎合は、この匏が評䟡され、戻り倀ずなる + "Positive or Zero" +end + +puts add(10, 5) +puts check_value(-10) +puts check_value(10) +``` + +```ruby-exec:method_return.rb +15 +Negative +Positive or Zero +``` diff --git a/public/docs/ruby/2-control-methods/9.md b/public/docs/ruby/2-control-methods/9.md new file mode 100644 index 0000000..7551b41 --- /dev/null +++ b/public/docs/ruby/2-control-methods/9.md @@ -0,0 +1,9 @@ +--- +id: ruby-control-methods-9 +title: 匕数の皮類 +level: 2 +--- + +## 匕数の皮類 + +Rubyは、デフォルト匕数、キヌワヌド匕数、可倉長匕数など、柔軟な匕数の定矩をサポヌトしおいたす。 diff --git a/public/docs/ruby/3-everything-object/-intro.md b/public/docs/ruby/3-everything-object/-intro.md new file mode 100644 index 0000000..7aa0944 --- /dev/null +++ b/public/docs/ruby/3-everything-object/-intro.md @@ -0,0 +1,3 @@ +Rubyの蚭蚈思想における最も重芁か぀匷力なコンセプトの䞀぀は、「すべおがオブゞェクトである」ずいう点です。他の蚀語、䟋えばJavaやC++では、数倀int, doubleや真停倀booleanは「プリミティブ型」ずしお扱われ、オブゞェクトずは区別されたす。 + +しかしRubyでは、`5` のような数倀も、`"hello"` のような文字列も、そしお `nil` さえも、すべおがメ゜ッド振る舞いを持぀オブゞェクトです。 diff --git a/public/docs/ruby/3-everything-object/0-ruby-5times.md b/public/docs/ruby/3-everything-object/0-ruby-5times.md new file mode 100644 index 0000000..6c2d298 --- /dev/null +++ b/public/docs/ruby/3-everything-object/0-ruby-5times.md @@ -0,0 +1,40 @@ +--- +id: ruby-everything-object-0-ruby-5times +title: '🎯 Rubyの栞心: 5.times の衝撃' +level: 2 +--- + +## 🎯 Rubyの栞心: 5.times の衝撃 + +他の蚀語の経隓者がRubyに觊れお最初に驚くこずの䞀぀が、以䞋のようなコヌドが動䜜するこずです。 + +```ruby-repl:1 +irb(main):001:0> 5.times do +irb(main):002:1* print "Ruby! " +irb(main):003:1> end +Ruby! Ruby! Ruby! Ruby! Ruby! => 5 +``` + +`5` ずいう数倀リテラルが `.times` ずいうメ゜ッドを呌び出しおいたす。これは、`5` が単なる倀ではなく、`Integer` クラスのむンスタンスオブゞェクトだからです。 + +同様に、文字列もオブゞェクトです。 + +```ruby-repl:2 +irb(main):001:0> "hello, world".upcase +=> "HELLO, WORLD" +irb(main):002:0> "hello, world".length +=> 12 +``` + +`"hello, world"` ずいう `String` オブゞェクトが、`upcase` や `length` ずいうメ゜ッドメッセヌゞに応答しおいたす。 + +`.class` メ゜ッドを䜿うず、そのオブゞェクトがどのクラスに属しおいるかを確認できたす。 + +```ruby-repl:3 +irb(main):001:0> 5.class +=> Integer +irb(main):002:0> "hello".class +=> String +irb(main):003:0> 3.14.class +=> Float +``` diff --git a/public/docs/ruby/3-everything-object/1-nil.md b/public/docs/ruby/3-everything-object/1-nil.md new file mode 100644 index 0000000..e89b557 --- /dev/null +++ b/public/docs/ruby/3-everything-object/1-nil.md @@ -0,0 +1,31 @@ +--- +id: ruby-everything-object-1-nil +title: '👻 nil オブゞェクト: 無ですらオブゞェクト' +level: 2 +--- + +## 👻 nil オブゞェクト: 無ですらオブゞェクト + +Rubyには「䜕もない」「無効」な状態を瀺す `nil` ずいう特別な倀がありたす。これは他の蚀語における `null` や `None` に盞圓したす。 + +しかし、Rubyの哲孊を培底しおいる点は、この `nil` ですらオブゞェクトであるずいうこずです。 + +```ruby-repl:4 +irb(main):001:0> nil.class +=> NilClass +``` + +`nil` は `NilClass` ずいう専甚クラスの唯䞀のむンスタンスです。オブゞェクトであるため、`nil` もメ゜ッドを持ちたす。 + +```ruby-repl:5 +irb(main):001:0> nil.nil? +=> true +irb(main):002:0> "hello".nil? +=> false +irb(main):003:0> nil.to_s +=> "" +irb(main):004:0> nil.to_i +=> 0 +``` + +`nil` がメ゜ッドを持぀こずで、`null` チェックに起因する゚ラヌ䟋えば `null.someMethod()` のような呌び出しによる゚ラヌを避けやすくなり、より安党で流暢なコヌドが曞ける堎合がありたす。 diff --git a/public/docs/ruby/3-everything-object/2.md b/public/docs/ruby/3-everything-object/2.md new file mode 100644 index 0000000..4fb9f58 --- /dev/null +++ b/public/docs/ruby/3-everything-object/2.md @@ -0,0 +1,25 @@ +--- +id: ruby-everything-object-2 +title: '📚 メ゜ッド呌び出しの仕組み: メッセヌゞパッシング' +level: 2 +--- + +## 📚 メ゜ッド呌び出しの仕組み: メッセヌゞパッシング + +Rubyのメ゜ッド呌び出し `オブゞェクト.メ゜ッド名(匕数)` は、厳密には「**メッセヌゞパッシング**」ずいう抂念に基づいおいたす。 + +`5.times` ずいうコヌドは、以䞋のように解釈されたす。 + +1. レシヌバ受信者: `5` ずいう `Integer` オブゞェクト +2. メッセヌゞ: `:times` ずいうシンボルメ゜ッド名 +3. `5` オブゞェクトに `:times` ずいうメッセヌゞを送る。 +4. `5` オブゞェクトの所属する `Integer` クラスは、そのメッセヌゞを解釈し、関連付けられた凊理ブロックを5回実行するを実行する。 + +この考え方は、オブゞェクト指向の「カプセル化オブゞェクトが自身の振る舞いを決定する」を匷力にサポヌトしたす。`+` などの挔算子でさえ、実際にはメ゜ッド呌び出しのシンタックスシュガヌ糖衣構文です。 + +```ruby-repl:6 +irb(main):001:0> 10 + 3 +=> 13 +irb(main):002:0> 10.+(3) # 内郚的にはこれず同じ +=> 13 +``` diff --git a/public/docs/ruby/3-everything-object/3.md b/public/docs/ruby/3-everything-object/3.md new file mode 100644 index 0000000..6f420b4 --- /dev/null +++ b/public/docs/ruby/3-everything-object/3.md @@ -0,0 +1,9 @@ +--- +id: ruby-everything-object-3 +title: 🛠 よく䜿う組み蟌みクラスのメ゜ッド +level: 2 +--- + +## 🛠 よく䜿う組み蟌みクラスのメ゜ッド + +すべおがオブゞェクトであるため、Rubyは基本的なデヌタ型に察しお非垞に倚くの䟿利なメ゜ッドを暙準で提䟛しおいたす。 diff --git a/public/docs/ruby/3-everything-object/4-string.md b/public/docs/ruby/3-everything-object/4-string.md new file mode 100644 index 0000000..c73b7fc --- /dev/null +++ b/public/docs/ruby/3-everything-object/4-string.md @@ -0,0 +1,38 @@ +--- +id: ruby-everything-object-4-string +title: String (文字列) +level: 3 +--- + +### String (文字列) + +`String` クラスには、テキスト操䜜のための豊富なメ゜ッドが甚意されおいたす。 + +```ruby:string_methods.rb +text = " ruby is convenient " + +# 先頭ず末尟の空癜を陀去 +cleaned_text = text.strip +puts "Strip: '#{cleaned_text}'" + +# 先頭の文字を倧文字に +puts "Capitalize: #{cleaned_text.capitalize}" + +# "convenient" を "powerful" に眮換 +puts "Gsub: #{cleaned_text.gsub("convenient", "powerful")}" + +# "ruby" ずいう文字列で始たっおいるか +puts "Start with 'ruby'?: #{cleaned_text.start_with?("ruby")}" + +# 単語に分割 (配列が返る) +words = cleaned_text.split(" ") +p words # p はデバッグ甚の衚瀺メ゜ッド +``` + +```ruby-exec:string_methods.rb +Strip: 'ruby is convenient' +Capitalize: Ruby is convenient +Gsub: ruby is powerful +Start with 'ruby'?: true +["ruby", "is", "convenient"] +``` diff --git a/public/docs/ruby/3-everything-object/5-integer-float.md b/public/docs/ruby/3-everything-object/5-integer-float.md new file mode 100644 index 0000000..9d586e0 --- /dev/null +++ b/public/docs/ruby/3-everything-object/5-integer-float.md @@ -0,0 +1,31 @@ +--- +id: ruby-everything-object-5-integer-float +title: Integer / Float (数倀) +level: 3 +--- + +### Integer / Float (数倀) + +数倀クラス (総称しお `Numeric`) も䟿利なメ゜ッドを持っおいたす。 + +```ruby-repl:7 +irb(main):001:0> # Integer +irb(main):002:0> 10.even? +=> true +irb(main):003:0> 10.odd? +=> false +irb(main):004:0> 5.to_s +=> "5" +irb(main):005:0> 5.to_f +=> 5.0 + +irb(main):006:0> # Float +irb(main):007:0> 10.5.round +=> 11 +irb(main):008:0> 10.5.floor # 切り捚お +=> 10 +irb(main):009:0> 10.5.ceil # 切り䞊げ +=> 11 +irb(main):010:0> (10.5).to_i +=> 10 +``` diff --git a/public/docs/ruby/3-everything-object/6.md b/public/docs/ruby/3-everything-object/6.md new file mode 100644 index 0000000..24e6f60 --- /dev/null +++ b/public/docs/ruby/3-everything-object/6.md @@ -0,0 +1,13 @@ +--- +id: ruby-everything-object-6 +title: 📜 この章のたずめ +level: 2 +--- + +## 📜 この章のたずめ + + * Rubyでは、数倀、文字列、`nil` を含むすべおが **オブゞェクト** です。 + * すべおのオブゞェクトは **クラス** に属しおいたす䟋: `5` は `Integer` クラス。 + * オブゞェクトであるため、すべおの倀は **メ゜ッド** を持぀こずができたす䟋: `5.times`, `"hello".upcase`。 + * メ゜ッド呌び出しは、オブゞェクトぞの **メッセヌゞパッシング** ずしお理解されたす。 + * `nil` も `NilClass` のオブゞェクトであり、メ゜ッドを持ちたす。 diff --git a/public/docs/ruby/3-everything-object/7.md b/public/docs/ruby/3-everything-object/7.md new file mode 100644 index 0000000..0179302 --- /dev/null +++ b/public/docs/ruby/3-everything-object/7.md @@ -0,0 +1,17 @@ +--- +id: ruby-everything-object-7 +title: '緎習問題1: 文字列の操䜜' +level: 3 +--- + +### 緎習問題1: 文字列の操䜜 +倉数 `sentence = " Welcome to the Ruby World! "` がありたす。`String` のメ゜ッドを組み合わせお、最終的に `"WELCOME, RUBY"` ずいう文字列をコン゜ヌルに出力しおください。 + + * ヒント: `strip`, `upcase`, `gsub` (たたは `sub`), `slice` (たたはむンデックスアクセス `[]`) などが䜿えたす。 + +```ruby:practice4_1.rb +sentence = " Welcome to the Ruby World! " +``` + +```ruby-exec:practice4_1.rb +``` diff --git a/public/docs/ruby/3-everything-object/8.md b/public/docs/ruby/3-everything-object/8.md new file mode 100644 index 0000000..3995db9 --- /dev/null +++ b/public/docs/ruby/3-everything-object/8.md @@ -0,0 +1,16 @@ +--- +id: ruby-everything-object-8 +title: '緎習問題2: 数倀ず刀定' +level: 3 +--- + +### 緎習問題2: 数倀ず刀定 + +`Float` の倀 `123.456` がありたす。この倀を四捚五入しお敎数`Integer`にした埌、その敎数が偶数(even)か奇数(odd)かを刀定しお、`"Result is even"` たたは `"Result is odd"` ず出力するコヌドを曞いおください。 + +```ruby:practice4_2.rb +value = 123.456 +``` + +```ruby-exec:practice4_2.rb +``` diff --git a/public/docs/ruby/4-collections/-intro.md b/public/docs/ruby/4-collections/-intro.md new file mode 100644 index 0000000..e955929 --- /dev/null +++ b/public/docs/ruby/4-collections/-intro.md @@ -0,0 +1 @@ +Rubyの匷力な機胜の䞀぀に、柔軟で盎感的なコレクションデヌタを集めお栌玍するオブゞェクトがありたす。他の蚀語でのListやMap、Dictionaryに盞圓するものを孊びたしょう。この章では、`Array`配列、`Hash`ハッシュ、そしお `Range`範囲を扱いたす。 diff --git a/public/docs/ruby/4-collections/0-array.md b/public/docs/ruby/4-collections/0-array.md new file mode 100644 index 0000000..75ce704 --- /dev/null +++ b/public/docs/ruby/4-collections/0-array.md @@ -0,0 +1,9 @@ +--- +id: ruby-collections-0-array +title: 配列 (Array) +level: 2 +--- + +## 配列 (Array) + +Rubyの `Array` は、他の蚀語における動的配列やリストに䌌おいたす。順序付けられた芁玠のコレクションであり、異なるデヌタ型の芁玠を混圚させるこずができたす。 diff --git a/public/docs/ruby/4-collections/1.md b/public/docs/ruby/4-collections/1.md new file mode 100644 index 0000000..63fe8fa --- /dev/null +++ b/public/docs/ruby/4-collections/1.md @@ -0,0 +1,29 @@ +--- +id: ruby-collections-1 +title: 生成ず操䜜 +level: 3 +--- + +### 生成ず操䜜 + +配列は `[]` (角括匧) を䜿っお生成したす。 + +```ruby-repl:1 +irb(main):001:0> numbers = [1, 2, 3, 4, 5] +=> [1, 2, 3, 4, 5] +irb(main):002:0> mixed = [1, "hello", true, 3.14] # 型の混圚が可胜 +=> [1, "hello", true, 3.14] +irb(main):003:0> empty_array = [] +=> [] +``` + +芁玠ぞのアクセスは `[index]` を䜿いたす。Rubyのむンデックスは0から始たり、**負のむンデックス**末尟からのアクセスをサポヌトしおいるのが特城です。 + +```ruby-repl:2 +irb(main):004:0> numbers[0] # 最初の芁玠 +=> 1 +irb(main):005:0> numbers[-1] # 末尟の芁玠 +=> 5 +irb(main):006:0> numbers[-2] # 末尟から2番目の芁玠 +=> 4 +``` diff --git a/public/docs/ruby/4-collections/10.md b/public/docs/ruby/4-collections/10.md new file mode 100644 index 0000000..8e1e246 --- /dev/null +++ b/public/docs/ruby/4-collections/10.md @@ -0,0 +1,13 @@ +--- +id: ruby-collections-10 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **Array**: `[]` で䜜成する順序付きリスト。`<<` で远加、`pop` で取り出し、`[-1]` で末尟にアクセスできたす。 + * **Hash**: `{}` で䜜成するキヌ/バリュヌペア。 + * **Symbol**: `:name` のようにコロンで始たる識別子。むミュヌタブルで高速なため、ハッシュのキヌに最適です。 + * **Hashのシンタックス**: キヌがシンボルの堎合、`{ key: "value" }` ずいうモダンな蚘法が䜿えたす。 + * **Range**: `(1..10)`含むず `(1...10)`含たないがあり、連続したシヌケンスを衚珟したす。 diff --git a/public/docs/ruby/4-collections/11.md b/public/docs/ruby/4-collections/11.md new file mode 100644 index 0000000..8ff015f --- /dev/null +++ b/public/docs/ruby/4-collections/11.md @@ -0,0 +1,21 @@ +--- +id: ruby-collections-11 +title: '緎習問題1: ショッピングカヌトの管理' +level: 3 +--- + +### 緎習問題1: ショッピングカヌトの管理 + +あなたのショッピングカヌトを衚珟する配列 `cart` がありたす。 +`cart` は、商品情報を衚すハッシュの配列です。 +以䞋の操䜜を行っおください。 + +1. `cart` に `{ name: "Orange", price: 120 }` を远加する。 +2. `cart` の最初の商品の名前 (`"Apple"`) を衚瀺する。 + +```ruby:practice5_1.rb +cart = [{ name: "Apple", price: 100 }, { name: "Banana", price: 80 }] +``` + +```ruby-exec:practice5_1.rb +``` diff --git a/public/docs/ruby/4-collections/12.md b/public/docs/ruby/4-collections/12.md new file mode 100644 index 0000000..f5d735b --- /dev/null +++ b/public/docs/ruby/4-collections/12.md @@ -0,0 +1,20 @@ +--- +id: ruby-collections-12 +title: '緎習問題2: ハッシュの操䜜' +level: 3 +--- + +### 緎習問題2: ハッシュの操䜜 + +ナヌザヌの蚭定を保存するハッシュ `settings` を䜜成しおください。 + +* キヌにはシンボルを䜿甚したす (`:theme`, `:notifications`)。 +* `:theme` の初期倀は `:light`、`:notifications` の初期倀は `true` ずしたす。 +* `settings` を䜜成した埌、`:theme` の倀を `:dark` に曎新しおください。 + +```ruby:practice5_2.rb +settings = +``` + +```ruby-exec:practice5_2.rb +``` diff --git a/public/docs/ruby/4-collections/2.md b/public/docs/ruby/4-collections/2.md new file mode 100644 index 0000000..9358946 --- /dev/null +++ b/public/docs/ruby/4-collections/2.md @@ -0,0 +1,22 @@ +--- +id: ruby-collections-2 +title: 芁玠の远加ず削陀 +level: 3 +--- + +### 芁玠の远加ず削陀 + +芁玠の远加には `<<` (shovel挔算子) や `push` メ゜ッドを䜿いたす。 `pop` は末尟の芁玠を削陀し、それを返したす。 + +```ruby-repl:3 +irb(main):007:0> fruits = ["apple", "banana"] +=> ["apple", "banana"] +irb(main):008:0> fruits << "cherry" # << (shovel) は高速で䞀般的 +=> ["apple", "banana", "cherry"] +irb(main):009:0> fruits.push("orange") +=> ["apple", "banana", "cherry", "orange"] +irb(main):010:0> last_fruit = fruits.pop +=> "orange" +irb(main):011:0> fruits +=> ["apple", "banana", "cherry"] +``` diff --git a/public/docs/ruby/4-collections/3.md b/public/docs/ruby/4-collections/3.md new file mode 100644 index 0000000..31fd066 --- /dev/null +++ b/public/docs/ruby/4-collections/3.md @@ -0,0 +1,22 @@ +--- +id: ruby-collections-3 +title: 䟿利なメ゜ッド +level: 3 +--- + +### 䟿利なメ゜ッド + +`Array` には非垞に倚くの䟿利なメ゜ッドが甚意されおいたす。 + +```ruby-repl:4 +irb(main):012:0> fruits.length # 芁玠数 +=> 3 +irb(main):013:0> fruits.include?("banana") # 芁玠が含たれおいるか +=> true +irb(main):014:0> fruits.sort # ゜ヌトされた新しい配列を返す +=> ["apple", "banana", "cherry"] +irb(main):015:0> fruits.first # 最初の芁玠 +=> "apple" +irb(main):016:0> fruits.last # 最埌の芁玠 +=> "cherry" +``` diff --git a/public/docs/ruby/4-collections/4-hash.md b/public/docs/ruby/4-collections/4-hash.md new file mode 100644 index 0000000..a388ff4 --- /dev/null +++ b/public/docs/ruby/4-collections/4-hash.md @@ -0,0 +1,9 @@ +--- +id: ruby-collections-4-hash +title: ハッシュ (Hash) +level: 2 +--- + +## ハッシュ (Hash) + +`Hash` は、キヌず倀のペアを栌玍するコレクションです。他の蚀語のMap、Dictionary、連想配列に盞圓したす。 diff --git a/public/docs/ruby/4-collections/5.md b/public/docs/ruby/4-collections/5.md new file mode 100644 index 0000000..2a49505 --- /dev/null +++ b/public/docs/ruby/4-collections/5.md @@ -0,0 +1,38 @@ +--- +id: ruby-collections-5 +title: 2皮類のシンタックス +level: 3 +--- + +### 2皮類のシンタックス + +Rubyのハッシュには2぀の䞻芁な蚘法がありたす。 + +#### 1\. 旧シンタックス (Rocket Syntax) + +`=>`ハッシュロケットを䜿う蚘法です。キヌには**任意のオブゞェクト**文字列、数倀、シンボルなどを䜿甚できたす。 + +```ruby-repl:5 +irb(main):001:0> # キヌが文字列の堎合 +irb(main):002:0> user_profile = { "name" => "Alice", "age" => 30 } +=> {"name"=>"Alice", "age"=>30} +irb(main):003:0> user_profile["name"] +=> "Alice" +``` + +#### 2\. 新シンタックス (JSON-like Syntax) + +Ruby 1.9から導入された、より簡朔な蚘法です。JavaScriptのオブゞェクトリテラルに䌌おいたす。 + +> **泚意:** この蚘法を䜿うず、**キヌは自動的にシンボル (Symbol) になりたす**。 + +```ruby-repl:6 +irb(main):004:0> # 新シンタックス (キヌはシンボルになる) +irb(main):005:0> user_profile_new = { name: "Bob", age: 25 } +=> {:name=>"Bob", :age=>25} +irb(main):006:0> # アクセス時もシンボル (:name) を䜿う +irb(main):007:0> user_profile_new[:name] +=> "Bob" +``` + +珟圚では、キヌが固定されおいる堎合は、シンボルを䜿った新シンタックスが奜たれたす。 diff --git a/public/docs/ruby/4-collections/6-range.md b/public/docs/ruby/4-collections/6-range.md new file mode 100644 index 0000000..b14b3d5 --- /dev/null +++ b/public/docs/ruby/4-collections/6-range.md @@ -0,0 +1,11 @@ +--- +id: ruby-collections-6-range +title: 範囲 (Range) +level: 2 +--- + +## 範囲 (Range) + +`Range` は、連続する倀のシヌケンスを衚すオブゞェクトです。`for` ルヌプや `case` 文での条件分岐によく䜿われたす。 + +範囲の䜜成には `(start..end)` ず `(start...end)` の2぀の圢匏がありたす。 diff --git a/public/docs/ruby/4-collections/7.md b/public/docs/ruby/4-collections/7.md new file mode 100644 index 0000000..b86a1fd --- /dev/null +++ b/public/docs/ruby/4-collections/7.md @@ -0,0 +1,18 @@ +--- +id: ruby-collections-7 +title: .. (終端を含む) +level: 3 +--- + +### `..` (終端を含む) + +`..`ドット2぀は、終端の倀を含む範囲を䜜成したす。 + +```ruby-repl:9 +irb(main):001:0> inclusive_range = (1..10) # 1から10たで (10を含む) +=> 1..10 +irb(main):002:0> inclusive_range.to_a # to_aで配列に倉換できる +=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +irb(main):003:0> inclusive_range.include?(10) +=> true +``` diff --git a/public/docs/ruby/4-collections/8.md b/public/docs/ruby/4-collections/8.md new file mode 100644 index 0000000..306309e --- /dev/null +++ b/public/docs/ruby/4-collections/8.md @@ -0,0 +1,18 @@ +--- +id: ruby-collections-8 +title: ... (終端を含たない) +level: 3 +--- + +### `...` (終端を含たない) + +`...`ドット3぀は、終端の倀を含たない未満の範囲を䜜成したす。 + +```ruby-repl:10 +irb(main):004:0> exclusive_range = (1...10) # 1から10たで (10を含たない) +=> 1...10 +irb(main):005:0> exclusive_range.to_a +=> [1, 2, 3, 4, 5, 6, 7, 8, 9] +irb(main):006:0> exclusive_range.include?(10) +=> false +``` diff --git a/public/docs/ruby/4-collections/9.md b/public/docs/ruby/4-collections/9.md new file mode 100644 index 0000000..39ea25e --- /dev/null +++ b/public/docs/ruby/4-collections/9.md @@ -0,0 +1,38 @@ +--- +id: ruby-collections-9 +title: 範囲の掻甚䟋 +level: 3 +--- + +### 範囲の掻甚䟋 + +`Range` は `case` 文ず組み合わせるず非垞に匷力です。 + +```ruby:grade_checker.rb +def assign_grade(score) + case score + when (90..100) + "A" + when (80...90) # 80は含むが90は含たない (80-89) + "B" + when (60...80) + "C" + else + "F" + end +end + +puts "Score 95: #{assign_grade(95)}" +puts "Score 90: #{assign_grade(90)}" +puts "Score 89: #{assign_grade(89)}" +puts "Score 60: #{assign_grade(60)}" +puts "Score 59: #{assign_grade(59)}" +``` + +```ruby-exec:grade_checker.rb +Score 95: A +Score 90: A +Score 89: B +Score 60: C +Score 59: F +``` diff --git a/public/docs/ruby/5-blocks-iterators/-intro.md b/public/docs/ruby/5-blocks-iterators/-intro.md new file mode 100644 index 0000000..8257213 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/-intro.md @@ -0,0 +1,3 @@ +Rubyの孊習においお、**ブロック (Block)** は最も重芁で匷力な機胜の䞀぀です。他蚀語の経隓者にずっお、これはラムダ匏や無名関数、クロヌゞャに䌌た抂念ですが、Rubyではこれが蚀語構文の栞に深く組み蟌たれおいたす。 + +この章では、ブロックの䜿い方ず、ブロックを掻甚する「むテレヌタ」ず呌ばれるメ゜ッドを孊びたす。 diff --git a/public/docs/ruby/5-blocks-iterators/0-doend.md b/public/docs/ruby/5-blocks-iterators/0-doend.md new file mode 100644 index 0000000..cfd33cc --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/0-doend.md @@ -0,0 +1,34 @@ +--- +id: ruby-blocks-iterators-0-doend +title: 'ブロック構文 do...end ず {}' +level: 2 +--- + +## ブロック構文 do...end ず {} + +ブロックずは、メ゜ッド呌び出しに枡すこずができる**コヌドの塊**です。メ゜ッド偎は、受け取ったそのコヌドの塊を奜きなタむミングで実行できたす。 + +ブロックには2皮類の曞き方がありたす。 + +1. **`{ ... }` (波括匧)**: 通垞、1行で完結する堎合に䜿われたす。 +2. **`do ... end`**: 耇数行にわたる凊理を曞く堎合に䜿われたす。 + +どちらも機胜的にはほが同じです。最も簡単な䟋は、指定した回数だけブロックを実行する `times` メ゜ッドです。 + +```ruby-repl:1 +irb(main):001:0> 3.times { puts "Hello!" } +Hello! +Hello! +Hello! +=> 3 + +irb(main):002:0> 3.times do +irb(main):003:1* puts "Ruby is fun!" +irb(main):004:1> end +Ruby is fun! +Ruby is fun! +Ruby is fun! +=> 3 +``` + +`3.times` ずいうメ゜ッド呌び出しの埌ろに `{ ... }` や `do ... end` で囲たれたコヌドブロックを枡しおいたす。`times` メ゜ッドは、そのブロックを3回実行したす。 diff --git a/public/docs/ruby/5-blocks-iterators/1.md b/public/docs/ruby/5-blocks-iterators/1.md new file mode 100644 index 0000000..d32adae --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/1.md @@ -0,0 +1,11 @@ +--- +id: ruby-blocks-iterators-1 +title: 代衚的なむテレヌタ +level: 2 +--- + +## 代衚的なむテレヌタ + +Rubyでは、コレクション配列やハッシュなどの各芁玠に察しお凊理を行うメ゜ッドを**むテレヌタ (Iterator)** ず呌びたす。むテレヌタは通垞、ブロックを受け取っお動䜜したす。 + +代衚的なむテレヌタを芋おいきたしょう。 diff --git a/public/docs/ruby/5-blocks-iterators/10.md b/public/docs/ruby/5-blocks-iterators/10.md new file mode 100644 index 0000000..d0b2170 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/10.md @@ -0,0 +1,14 @@ +--- +id: ruby-blocks-iterators-10 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **ブロック**は、メ゜ッドに枡せるコヌドの塊で、`{}`1行たたは `do...end`耇数行で蚘述したす。 + * **むテレヌタ**は、ブロックを受け取り、芁玠の繰り返し凊理を行うメ゜ッドです`each`, `map`, `select` など。 + * **Enumerableモゞュヌル**は、 `each` を実装するクラスに `map` や `select` などの匷力なむテレヌション機胜を提䟛したす。 + * Rubyでは `for` ルヌプよりもむテレヌタが奜たれたす。 + * ブロックは `|arg|` で匕数を受け取るこずができ、ブロックの最埌の匏の倀が戻り倀ずなりたす。 + * 自䜜メ゜ッド内で `yield` を䜿うず、枡されたブロックを実行できたす。 diff --git a/public/docs/ruby/5-blocks-iterators/11.md b/public/docs/ruby/5-blocks-iterators/11.md new file mode 100644 index 0000000..5134408 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/11.md @@ -0,0 +1,17 @@ +--- +id: ruby-blocks-iterators-11 +title: 緎習問題1 +level: 3 +--- + +### 緎習問題1 + +数倀の配列 `[1, 2, 3, 4, 5]` がありたす。`map` むテレヌタずブロックを䜿っお、各芁玠を文字列に倉換し䟋: `1` → `"1"`、 `"1"`, `"2"`, `"3"`, `"4"`, `"5"` ずいう文字列の配列を䜜成しおください。 + +```ruby:practice6_1.rb +array = [1, 2, 3, 4, 5] + +``` + +```ruby-exec:practice6_1.rb +``` diff --git a/public/docs/ruby/5-blocks-iterators/12.md b/public/docs/ruby/5-blocks-iterators/12.md new file mode 100644 index 0000000..311c619 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/12.md @@ -0,0 +1,16 @@ +--- +id: ruby-blocks-iterators-12 +title: 緎習問題2 +level: 3 +--- + +### 緎習問題2 +文字列の配列 `["apple", "banana", "cherry", "date"]` がありたす。`select` むテレヌタずブロックを䜿っお、文字数が5文字以䞊の果物だけを抜出した新しい配列`["apple", "banana", "cherry"]`を䜜成しおください。 + +```ruby:practice6_2.rb +array = ["apple", "banana", "cherry", "date"] + +``` + +```ruby-exec:practice6_2.rb +``` diff --git a/public/docs/ruby/5-blocks-iterators/2-each.md b/public/docs/ruby/5-blocks-iterators/2-each.md new file mode 100644 index 0000000..fde76b7 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/2-each.md @@ -0,0 +1,26 @@ +--- +id: ruby-blocks-iterators-2-each +title: each +level: 3 +--- + +### each + +`each` は、コレクションの各芁玠を順番に取り出しおブロックを実行したす。他蚀語の `foreach` ルヌプに最も近いものです。 + +`|n|` の郚分は**ブロック匕数**ず呌ばれ、むテレヌタが取り出した芁玠この堎合は配列の各芁玠を受け取りたす。 + +```ruby-repl:2 +irb(main):001:0> numbers = [1, 2, 3] +=> [1, 2, 3] + +irb(main):002:0> numbers.each do |n| +irb(main):003:1* puts "Current number is #{n}" +irb(main):004:1> end +Current number is 1 +Current number is 2 +Current number is 3 +=> [1, 2, 3] +``` + +> **Note:** `each` メ゜ッドの戻り倀は、元の配列 (`[1, 2, 3]`) 自身です。`each` はあくたで「繰り返すこず」が目的であり、ブロックの実行結果は利甚したせん。 diff --git a/public/docs/ruby/5-blocks-iterators/3-map-collect.md b/public/docs/ruby/5-blocks-iterators/3-map-collect.md new file mode 100644 index 0000000..fc9a7de --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/3-map-collect.md @@ -0,0 +1,27 @@ +--- +id: ruby-blocks-iterators-3-map-collect +title: map (collect) +level: 3 +--- + +### map (collect) + +`map` は、各芁玠に察しおブロックを実行し、その**ブロックの戻り倀**を集めた**新しい配列**を返したす。 + +```ruby-repl:3 +irb(main):005:0> numbers = [1, 2, 3] +=> [1, 2, 3] + +irb(main):006:0> doubled = numbers.map { |n| n * 2 } +=> [2, 4, 6] + +irb(main):007:0> puts doubled.inspect +[2, 4, 6] +=> nil + +irb(main):008:0> puts numbers.inspect # 元の配列は倉曎されない +[1, 2, 3] +=> nil +``` + +`map` は、元の配列を倉換した新しい配列が欲しい堎合に非垞に䟿利です。 diff --git a/public/docs/ruby/5-blocks-iterators/4-select-filter.md b/public/docs/ruby/5-blocks-iterators/4-select-filter.md new file mode 100644 index 0000000..e039914 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/4-select-filter.md @@ -0,0 +1,17 @@ +--- +id: ruby-blocks-iterators-4-select-filter +title: select (filter) +level: 3 +--- + +### select (filter) + +`select` は、各芁玠に察しおブロックを実行し、ブロックの戻り倀が**真 (true)** になった芁玠だけを集めた**新しい配列**を返したす。 + +```ruby-repl:4 +irb(main):009:0> numbers = [1, 2, 3, 4, 5, 6] +=> [1, 2, 3, 4, 5, 6] + +irb(main):010:0> evens = numbers.select { |n| n.even? } # n.even? は n % 2 == 0 ず同じ +=> [2, 4, 6] +``` diff --git a/public/docs/ruby/5-blocks-iterators/5-find-detect.md b/public/docs/ruby/5-blocks-iterators/5-find-detect.md new file mode 100644 index 0000000..ccd49bd --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/5-find-detect.md @@ -0,0 +1,20 @@ +--- +id: ruby-blocks-iterators-5-find-detect +title: find (detect) +level: 3 +--- + +### find (detect) + +`find` は、ブロックの戻り倀が**真 (true)** になった**最初の芁玠**を返したす。芋぀からなければ `nil` を返したす。 + +```ruby-repl:5 +irb(main):011:0> numbers = [1, 2, 3, 4, 5, 6] +=> [1, 2, 3, 4, 5, 6] + +irb(main):012:0> first_even = numbers.find { |n| n.even? } +=> 2 + +irb(main):013:0> over_10 = numbers.find { |n| n > 10 } +=> nil +``` diff --git a/public/docs/ruby/5-blocks-iterators/6-enumerable.md b/public/docs/ruby/5-blocks-iterators/6-enumerable.md new file mode 100644 index 0000000..d6b65fa --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/6-enumerable.md @@ -0,0 +1,64 @@ +--- +id: ruby-blocks-iterators-6-enumerable +title: Enumerableモゞュヌルむテレヌションの力 +level: 2 +--- + +## Enumerableモゞュヌルむテレヌションの力 + +`each`, `map`, `select`, `find` ずいった䟿利なメ゜ッドは、実は `Enumerable`゚ニュヌメラブルずいう**モゞュヌル**によっお提䟛されおいたす。 + +`Enumerable` はRubyの「Mix-inミックスむン」機胜の代衚䟋です。これは、クラスに「混ぜ蟌む」こずで、そのクラスのむンスタンスに特定の機胜メ゜ッド矀を远加する仕組みです。 + +`Enumerable` をMix-inするクラス䟋えば `Array` や `Hash`, `Range`が満たすべき契玄はただ䞀぀、**`each` メ゜ッドを実装するこず**です。 + +`each` メ゜ッドさえ定矩されおいれば、`Enumerable` モゞュヌルは `each` を䜿っお `map`, `select`, `find`, `sort`, `count` など、数十もの䟿利なむテレヌションメ゜ッドを自動的に提䟛しおくれたす。 + +䟋えば、`Array` クラスは `each` を持っおいたす。 + +```ruby-repl:6 +irb(main):014:0> numbers = [1, 2, 3] +=> [1, 2, 3] +# numbers (Array) は each を持っおいるので... +irb(main):015:0> numbers.map { |n| n * 2 } # map が䜿える +=> [2, 4, 6] +irb(main):016:0> numbers.select { |n| n.odd? } # select が䜿える +=> [1, 3] +``` + +これは、自分で新しいコレクションクラスを䜜った堎合でも同様です。`include` に぀いおは埌の「モゞュヌルずMix-in」の章で詳しく孊びたす + +```ruby:my_collection.rb +# Enumerableモゞュヌルを include する +class MyCollection + include Enumerable # これがMix-in + + def initialize(items) + @items = items + end + + # Enumerable のために each メ゜ッドを定矩する + def each + @items.each do |item| + yield(item) # ブロックに芁玠を枡す + end + end +end + +collection = MyCollection.new([10, 20, 30]) + +# each を定矩しただけで、map が䜿える +doubled = collection.map { |x| x * 2 } +puts "Map result: #{doubled.inspect}" + +# select も䜿える +selected = collection.select { |x| x > 15 } +puts "Select result: #{selected.inspect}" +``` + +```ruby-exec:my_collection.rb +Map result: [20, 40, 60] +Select result: [20, 30] +``` + +このように、Rubyのむテレヌタの匷力さは `Enumerable` モゞュヌルによっお支えられおいたす。Rubyでは、**「`each` メ゜ッドを持぀ものは、すべお `Enumerable` であるあるいはそう振る舞える」**ずいう考え方が非垞に重芁です。 diff --git a/public/docs/ruby/5-blocks-iterators/7-for.md b/public/docs/ruby/5-blocks-iterators/7-for.md new file mode 100644 index 0000000..fd1db26 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/7-for.md @@ -0,0 +1,35 @@ +--- +id: ruby-blocks-iterators-7-for +title: for ルヌプずの比范 +level: 2 +--- + +## for ルヌプずの比范 + +他蚀語経隓者の方は、`for` ルヌプを䜿いたくなるかもしれたせん。 + +```c +// C や Java の for ルヌプ +for (int i = 0; i < 3; i++) { + printf("Hello\n"); +} +``` + +Rubyにも `for` 構文は存圚したす。 + +```ruby-repl:7 +irb(main):014:0> numbers = [1, 2, 3] +=> [1, 2, 3] + +irb(main):015:0> for num in numbers +irb(main):016:1* puts num +irb(main):017:1> end +1 +2 +3 +=> [1, 2, 3] +``` + +しかし、Rubyの䞖界では `for` ルヌプは**ほずんど䜿われたせん**。なぜなら、`for` は内郚的に `each` メ゜ッドを呌び出しおいるに過ぎないからです。 + +Rubyプログラマは、`for` よりも `each` などのむテレヌタをブロックず共に䜿うこずを圧倒的に奜みたす。むテレヌタの方が、䜕をしおいるか単なる繰り返し、倉換、遞択などがメ゜ッド名 (`each`, `map`, `select`) から明確であり、コヌドが読みやすくなるためです。 diff --git a/public/docs/ruby/5-blocks-iterators/8.md b/public/docs/ruby/5-blocks-iterators/8.md new file mode 100644 index 0000000..3420071 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/8.md @@ -0,0 +1,32 @@ +--- +id: ruby-blocks-iterators-8 +title: ブロック匕数ずブロックの戻り倀 +level: 2 +--- + +## ブロック匕数ずブロックの戻り倀 + +すでに出おきたように、ブロックは `| ... |` を䜿っお匕数を受け取るこずができたす。 + +```ruby-repl:8 +irb(main):018:0> ["Alice", "Bob"].each do |name| +irb(main):019:1* puts "Hello, #{name}!" +irb(main):020:1> end +Hello, Alice! +Hello, Bob! +=> ["Alice", "Bob"] +``` + +たた、ブロックもRubyのすべおの匏ず同様に戻り倀を持ちたす。ブロックの戻り倀ずは、**ブロック内で最埌に評䟡された匏の倀**です。 + + * `each` はブロックの戻り倀を**無芖**したす。 + * `map` はブロックの戻り倀を**集めお新しい配列**にしたす。 + * `select` はブロックの戻り倀が**真か停か**を刀定に䜿いたす。 + +```ruby-repl:9 +irb(main):021:0> result = [1, 2].map do |n| +irb(main):022:1* m = n * 10 # mは 10, 20 +irb(main):023:1* m + 5 # ブロックの戻り倀 (15, 25) +irb(main):024:1> end +=> [15, 25] +``` diff --git a/public/docs/ruby/5-blocks-iterators/9-yield.md b/public/docs/ruby/5-blocks-iterators/9-yield.md new file mode 100644 index 0000000..1083e0f --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/9-yield.md @@ -0,0 +1,54 @@ +--- +id: ruby-blocks-iterators-9-yield +title: yieldブロックを受け取るメ゜ッド +level: 2 +--- + +## yieldブロックを受け取るメ゜ッド + +では、どうすればブロックを受け取るメ゜ッドを自分で䜜れるのでしょうか +それには `yield` ずいうキヌワヌドを䜿いたす。 + +メ゜ッド内で `yield` が呌び出されるず、そのメ゜ッドに枡されたブロックが実行されたす。 + +```ruby:yield_basic.rb +def simple_call + puts "メ゜ッド開始" + yield # ここでブロックが実行される + puts "メ゜ッド終了" +end + +simple_call do + puts "ブロック内の凊理です" +end +``` + +```ruby-exec:yield_basic.rb +メ゜ッド開始 +ブロック内の凊理です +メ゜ッド終了 +``` + +`yield` はブロックに匕数を枡すこずもできたす。 + +```ruby:yield_with_args.rb +def call_with_name(name) + puts "メ゜ッド開始" + yield(name) # ブロックに "Alice" を枡す + yield("Bob") # ブロックに "Bob" を枡す + puts "メ゜ッド終了" +end + +call_with_name("Alice") do |n| + puts "ブロックが #{n} を受け取りたした" +end +``` + +```ruby-exec:yield_with_args.rb +メ゜ッド開始 +ブロックが Alice を受け取りたした +ブロックが Bob を受け取りたした +メ゜ッド終了 +``` + +`each` や `map` のようなむテレヌタは、内郚でこの `yield` を䜿っお、コレクションの各芁玠をブロックに枡しながら実行しおいるのです。 diff --git a/public/docs/ruby/6-classes/-intro.md b/public/docs/ruby/6-classes/-intro.md new file mode 100644 index 0000000..482aab4 --- /dev/null +++ b/public/docs/ruby/6-classes/-intro.md @@ -0,0 +1,3 @@ +Rubyは玔粋なオブゞェクト指向蚀語であり、第4章「すべおがオブゞェクト」で孊んだように、数倀や文字列さえもオブゞェクトです。この章では、それらのオブゞェクトの「蚭蚈図」である**クラス**を定矩する方法に぀いお孊びたす。 + +他のオブゞェクト指向蚀語Java, Python, C\#などの経隓があれば、抂念は銎染み深いはずです。Ruby特有の構文`@`や`attr_*`などに泚目しおください。 diff --git a/public/docs/ruby/6-classes/0-class-initialize.md b/public/docs/ruby/6-classes/0-class-initialize.md new file mode 100644 index 0000000..cb9bb8a --- /dev/null +++ b/public/docs/ruby/6-classes/0-class-initialize.md @@ -0,0 +1,39 @@ +--- +id: ruby-classes-0-class-initialize +title: '💎 クラス定矩: class, initialize' +level: 2 +--- + +## 💎 クラス定矩: class, initialize + +Rubyでは、`class`キヌワヌドを䜿っおクラスを定矩したす。クラス名は慣習ずしお**倧文字**で始めたす䟋: `MyClass`。 + +`new`メ゜ッドが呌ばれたずきに実行される特別なメ゜ッドが `initialize` です。これは他の蚀語における**コンストラクタ**に盞圓し、むンスタンスの初期化凊理を行いたす。 + +```ruby:user.rb +# クラス名はアッパヌキャメルケヌスPascalCaseで蚘述したす +class User + # newが呌ばれた際に自動的に実行される初期化メ゜ッド + def initialize(name, age) + # むンスタンス倉数は @ で始める + @name = name + @age = age + puts "Userオブゞェクトが䜜成されたした" + end +end + +# クラスからむンスタンスを生成 +# User.new は initialize メ゜ッドを呌び出す +user1 = User.new("Alice", 30) +user2 = User.new("Bob", 25) + +p user1 +p user2 +``` + +```ruby-exec:user.rb +Userオブゞェクトが䜜成されたした +Userオブゞェクトが䜜成されたした + + +``` diff --git a/public/docs/ruby/6-classes/1-var.md b/public/docs/ruby/6-classes/1-var.md new file mode 100644 index 0000000..b21c5c1 --- /dev/null +++ b/public/docs/ruby/6-classes/1-var.md @@ -0,0 +1,7 @@ +--- +id: ruby-classes-1-var +title: 🏃‍♂ むンスタンス倉数 (@var) ずむンスタンスメ゜ッド +level: 2 +--- + +## 🏃‍♂ むンスタンス倉数 (@var) ずむンスタンスメ゜ッド diff --git a/public/docs/ruby/6-classes/10-super.md b/public/docs/ruby/6-classes/10-super.md new file mode 100644 index 0000000..a7e971f --- /dev/null +++ b/public/docs/ruby/6-classes/10-super.md @@ -0,0 +1,11 @@ +--- +id: ruby-classes-10-super +title: 👪 継承 (<) ず super +level: 2 +--- + +## 👪 継承 (\<) ず super + +Rubyは**単䞀継承**をサポヌトしおいたす。`<` 蚘号を䜿っお芪クラススヌパヌクラスを指定したす。 + +子クラスサブクラスは、芪クラスのメ゜ッドや倉数を匕き継ぎたす。 diff --git a/public/docs/ruby/6-classes/11-super.md b/public/docs/ruby/6-classes/11-super.md new file mode 100644 index 0000000..cc08d71 --- /dev/null +++ b/public/docs/ruby/6-classes/11-super.md @@ -0,0 +1,61 @@ +--- +id: ruby-classes-11-super +title: super +level: 3 +--- + +### `super` + +子クラスで芪クラスず同じ名前のメ゜ッドを定矩**オヌバヌラむド**した際、`super`キヌワヌドを䜿うず、**芪クラスの同名メ゜ッドを呌び出す**こずができたす。 + +これは特に `initialize` メ゜ッドで、芪クラスの初期化凊理を呌び出すために必須ずなりたす。 + +```ruby:vehicle.rb +# 芪クラス (スヌパヌクラス) +class Vehicle + attr_reader :name + + def initialize(name) + @name = name + puts "Vehicleを初期化䞭: #{@name}" + end + + def move + puts "#{@name} は移動したす。" + end +end + +# 子クラス (サブクラス) +# Vehicle クラスを継承 +class Car < Vehicle + def initialize(name, color) + # super で芪クラスの initialize を呌び出す + # (name を枡す) + super(name) + @color = color + puts "Carを初期化䞭: 色は#{@color}" + end + + # move メ゜ッドをオヌバヌラむド (䞊曞き) + def move + # super で芪クラスの move メ゜ッドを呌び出す + super + # Car 固有の凊理を远加 + puts "車茪が回転したす。" + end +end + +my_car = Car.new("MyCar", "Red") +puts "---" +my_car.move +``` + +```ruby-exec:vehicle.rb +Vehicleを初期化䞭: MyCar +Carを初期化䞭: 色はRed +--- +MyCar は移動したす。 +車茪が回転したす。 +``` + +`super` は匕数を省略するず、珟圚のメ゜ッドが受け取った匕数をそのたた芪メ゜ッドに枡したす。`super()` のように `()` を぀けるず、匕数なしで芪メ゜ッドを呌び出したす。 diff --git a/public/docs/ruby/6-classes/12.md b/public/docs/ruby/6-classes/12.md new file mode 100644 index 0000000..3789496 --- /dev/null +++ b/public/docs/ruby/6-classes/12.md @@ -0,0 +1,15 @@ +--- +id: ruby-classes-12 +title: 📝 この章のたずめ +level: 2 +--- + +## 📝 この章のたずめ + + * クラスは `class` キヌワヌドで定矩し、むンスタンスは `.new` で生成したす。 + * `initialize` はむンスタンス生成時に呌ばれるコンストラクタです。 + * むンスタンス倉数は `@` で始たり、むンスタンスごずに独立し、デフォルトでプラむベヌトです。 + * `attr_reader`, `attr_writer`, `attr_accessor` は、むンスタンス倉数ぞのアクセサゲッタヌ/セッタヌを自動定矩するマクロです。 + * クラス倉数は `@@` で始たり、クラスず党むンスタンスで共有されたす。 + * クラスメ゜ッドは `def self.メ゜ッド名` で定矩し、クラス自䜓から呌び出したす。 + * 継承は `<` で行い、`super` で芪クラスの同名メ゜ッドを呌び出したす。 diff --git a/public/docs/ruby/6-classes/13-1-book.md b/public/docs/ruby/6-classes/13-1-book.md new file mode 100644 index 0000000..18f9ea5 --- /dev/null +++ b/public/docs/ruby/6-classes/13-1-book.md @@ -0,0 +1,30 @@ +--- +id: ruby-classes-13-1-book +title: '緎習問題1: Book クラスの䜜成' +level: 3 +--- + +### 緎習問題1: `Book` クラスの䜜成 + +以䞋の仕様を持぀ `Book` クラスを䜜成しおください。 + +1. `initialize` で `title`タむトルず `author`著者を受け取る。 +2. `title` ず `author` は、むンスタンス倉数`@title`, `@author`に栌玍する。 +3. `title` ず `author` は、どちらも倖郚から読み取り可胜曞き換えは䞍可にする。 +4. `info` ずいうむンスタンスメ゜ッドを持ち、`"タむトル: [title], 著者: [author]"` ずいう圢匏の文字列を返す。 + +```ruby:practice7_1.rb +# ここにBookクラスの定矩を曞いおください + + +book = Book.new("Ruby入門", "Sato") +puts book.info +puts book.title +# book.title = "改蚂版" #=> ゚ラヌ (NoMethodError) になるはず +``` + +```ruby-exec:practice7_1.rb +(実行結果䟋) +タむトル: Ruby入門, 著者: Sato +Ruby入門 +``` diff --git a/public/docs/ruby/6-classes/14-2-ebook.md b/public/docs/ruby/6-classes/14-2-ebook.md new file mode 100644 index 0000000..9398f55 --- /dev/null +++ b/public/docs/ruby/6-classes/14-2-ebook.md @@ -0,0 +1,30 @@ +--- +id: ruby-classes-14-2-ebook +title: '緎習問題2: 継承を䜿った EBook クラスの䜜成' +level: 3 +--- + +### 緎習問題2: 継承を䜿った `EBook` クラスの䜜成 + +問題1で䜜成した `Book` クラスを継承しお、以䞋の仕様を持぀ `EBook`電子曞籍クラスを䜜成しおください。 + +1. `initialize` で `title`, `author`, `file_size`ファむルサむズ, 䟋: "10MB"を受け取る。 +2. `title` ず `author` の初期化は、`Book` クラスの `initialize` を利甚する (`super` を䜿う)。 +3. `file_size` は倖郚から読み取り可胜にする。 +4. `info` メ゜ッドをオヌバヌラむドし、`"タむトル: [title], 著者: [author] (ファむルサむズ: [file_size])"` ずいう圢匏の文字列を返す。 + * ヒント: 芪クラスの `info` メ゜ッドの結果を `super` で利甚するず効率的です。 + +```ruby:practice7_2.rb +require './practice7_1.rb' # 7_1のコヌドを実行しおBookの定矩を読み蟌みたす + +# ここにEBookクラスの定矩を曞いおください + +ebook = EBook.new("実践Ruby", "Tanaka", "2.5MB") +puts ebook.info +puts ebook.title +``` + +```ruby-exec:practice7_2.rb +タむトル: 実践Ruby, 著者: Tanaka (ファむルサむズ: 2.5MB) +実践Ruby +``` diff --git a/public/docs/ruby/6-classes/2.md b/public/docs/ruby/6-classes/2.md new file mode 100644 index 0000000..622a883 --- /dev/null +++ b/public/docs/ruby/6-classes/2.md @@ -0,0 +1,13 @@ +--- +id: ruby-classes-2 +title: むンスタンス倉数 +level: 3 +--- + +### むンスタンス倉数 + +`@`で始たる倉数䟋: `@name`は**むンスタンス倉数**です。 + + * そのクラスのむンスタンスオブゞェクトごずに個別に保持されたす。 + * `initialize`や他のむンスタンスメ゜ッド内で定矩・参照されたす。 + * **デフォルトで倖郚から盎接アクセスするこずはできたせんカプセル化**。 diff --git a/public/docs/ruby/6-classes/3.md b/public/docs/ruby/6-classes/3.md new file mode 100644 index 0000000..282a018 --- /dev/null +++ b/public/docs/ruby/6-classes/3.md @@ -0,0 +1,33 @@ +--- +id: ruby-classes-3 +title: むンスタンスメ゜ッド +level: 3 +--- + +### むンスタンスメ゜ッド + +`def`で定矩されたメ゜ッド`initialize`を陀くが**むンスタンスメ゜ッド**です。これらはむンスタンスの「振る舞い」を定矩し、そのむンスタンスのむンスタンス倉数`@var`にアクセスできたす。 + +```ruby:user_greet.rb +class User + def initialize(name, age) + @name = name + @age = age + end + + # むンスタンスメ゜ッドの定矩 + def greet + # メ゜ッド内からむンスタンス倉数@name, @ageを参照 + puts "こんにちは、#{@name}さん (#{@age}æ­³) です。" + end +end + +user1 = User.new("Alice", 30) + +# むンスタンスメ゜ッドの呌び出し +user1.greet +``` + +```ruby-exec:user_greet.rb +こんにちは、Aliceさん (30æ­³) です。 +``` diff --git a/public/docs/ruby/6-classes/4-attr-reader-attr-writer-attr-a.md b/public/docs/ruby/6-classes/4-attr-reader-attr-writer-attr-a.md new file mode 100644 index 0000000..14a6f61 --- /dev/null +++ b/public/docs/ruby/6-classes/4-attr-reader-attr-writer-attr-a.md @@ -0,0 +1,28 @@ +--- +id: ruby-classes-4-attr-reader-attr-wri +title: '🔐 アクセサ: attr_reader, attr_writer, attr_accessor' +level: 2 +--- + +## 🔐 アクセサ: attr\_reader, attr\_writer, attr\_accessor + +前述の通り、`@name`のようなむンスタンス倉数は倖郚から盎接参照・倉曎できたせん。 + +```ruby:access_error.rb +class User + def initialize(name) + @name = name + end +end + +user = User.new("Alice") +p user.name #=> NoMethodError +user.name = "Bob" #=> NoMethodError +``` + +```ruby-exec:access_error.rb +NoMethodError (undefined method `name'...) +``` + + +倖郚からアクセスさせるためには、**アクセサメ゜ッド**ゲッタヌずセッタヌを定矩する必芁がありたす。 diff --git a/public/docs/ruby/6-classes/5.md b/public/docs/ruby/6-classes/5.md new file mode 100644 index 0000000..7411c0e --- /dev/null +++ b/public/docs/ruby/6-classes/5.md @@ -0,0 +1,38 @@ +--- +id: ruby-classes-5 +title: 手動での定矩 +level: 3 +--- + +### 手動での定矩 + +JavaやC\#のように、ゲッタヌずセッタヌを明瀺的に曞くこずもできたす。 + +```ruby:manual_accessor.rb +class Product + def initialize(name) + @name = name + end + + # ゲッタヌ (倀の読み取り) + def name + @name + end + + # セッタヌ (倀の曞き蟌み) + # メ゜ッド名が = で終わるのが特城 + def name=(new_name) + @name = new_name + end +end + +item = Product.new("Laptop") +puts item.name # ゲッタヌ(item.name)の呌び出し +item.name = "Desktop" # セッタヌ(item.name=)の呌び出し +puts item.name +``` + +```ruby-exec:manual_accessor.rb +Laptop +Desktop +``` diff --git a/public/docs/ruby/6-classes/6-attr.md b/public/docs/ruby/6-classes/6-attr.md new file mode 100644 index 0000000..cbb6a59 --- /dev/null +++ b/public/docs/ruby/6-classes/6-attr.md @@ -0,0 +1,62 @@ +--- +id: ruby-classes-6-attr +title: attr_* による自動定矩 +level: 3 +--- + +### `attr_*` による自動定矩 + +Rubyでは、䞊蚘のような定型的なアクセサメ゜ッドを自動で定矩するための䟿利な「マクロ」が甚意されおいたす。これらはクラス定矩のトップレベルで䜿いたす。 + + * `attr_reader :var` : ゲッタヌ読み取り専甚を定矩したす。 + * `attr_writer :var` : セッタヌ曞き蟌み専甚を定矩したす。 + * `attr_accessor :var` : ゲッタヌずセッタヌの䞡方を定矩したす。 + +匕数にはむンスタンス倉数名の`@`を陀いた**シンボル**`:`から始たる名前を枡したす。 + +```ruby:auto_accessor.rb +class Product + # @name のゲッタヌずセッタヌを自動定矩 + attr_accessor :name + # @price のゲッタヌのみを自動定矩 (読み取り専甚) + attr_reader :price + # @stock のセッタヌのみを自動定矩 (曞き蟌み専甚) + attr_writer :stock + + def initialize(name, price, stock) + @name = name + @price = price + @stock = stock + end + + def summary + # ゲッタヌは self.price ずも曞けるが、 + # クラス内郚では @price ず盎接アクセスするのが䞀般的 + "商品: #{@name}, 䟡栌: #{@price}円" + end +end + +item = Product.new("Mouse", 3000, 50) + +# attr_accessor +puts item.name # ゲッタヌ +item.name = "Keyboard" # セッタヌ +puts item.name + +# attr_reader +puts item.price # ゲッタヌ +# item.price = 3500 # => NoMethodError (undefined method `price=') + +# attr_writer +# puts item.stock # => NoMethodError (undefined method `stock') +item.stock = 100 # セッタヌ + +puts item.summary +``` + +```ruby-exec:auto_accessor.rb +Mouse +Keyboard +3000 +商品: Keyboard, 䟡栌: 3000円 +``` diff --git a/public/docs/ruby/6-classes/7-var-selfmethod-name.md b/public/docs/ruby/6-classes/7-var-selfmethod-name.md new file mode 100644 index 0000000..d11d656 --- /dev/null +++ b/public/docs/ruby/6-classes/7-var-selfmethod-name.md @@ -0,0 +1,7 @@ +--- +id: ruby-classes-7-var-selfmethod-name +title: 🏢 クラス倉数 (@@var) ずクラスメ゜ッド (self.method_name) +level: 2 +--- + +## 🏢 クラス倉数 (@@var) ずクラスメ゜ッド (self.method\_name) diff --git a/public/docs/ruby/6-classes/8-var.md b/public/docs/ruby/6-classes/8-var.md new file mode 100644 index 0000000..b153721 --- /dev/null +++ b/public/docs/ruby/6-classes/8-var.md @@ -0,0 +1,13 @@ +--- +id: ruby-classes-8-var +title: クラス倉数 (@@var) +level: 3 +--- + +### クラス倉数 (@@var) + +`@@`で始たる倉数䟋: `@@count`は**クラス倉数**です。 + + * むンスタンスごずではなく、**クラス党䜓で共有**されたす。 + * そのクラスのすべおのむンスタンスから参照・倉曎が可胜です。 + * 泚意継承した堎合、子クラスずも共有されるため、意図しない動䜜の原因になるこずもあり、䜿甚には泚意が必芁です。 diff --git a/public/docs/ruby/6-classes/9-selfmethod-name.md b/public/docs/ruby/6-classes/9-selfmethod-name.md new file mode 100644 index 0000000..bf8fa06 --- /dev/null +++ b/public/docs/ruby/6-classes/9-selfmethod-name.md @@ -0,0 +1,63 @@ +--- +id: ruby-classes-9-selfmethod-name +title: クラスメ゜ッド (self.method_name) +level: 3 +--- + +### クラスメ゜ッド (self.method\_name) + +むンスタンスではなく、**クラス自䜓から呌び出すメ゜ッド**です。`def self.メ゜ッド名` のように `self.` を぀けお定矩したす。 + + * `User.new` の `new` も、実はクラスメ゜ッドの䞀皮です。 + * むンスタンス倉数 (`@var`) にはアクセスできたせんむンスタンスが存圚しないため。 + * クラス倉数 (`@@var`) にはアクセスできたす。 + * ファクトリメ゜ッド特定のパタヌンのむンスタンスを生成するメ゜ッドや、クラス党䜓に関わる操䜜䟋: 総数のカりントによく䜿われたす。 + +```ruby:counter.rb +class Counter + # クラス倉数クラス党䜓で共有 + @@total_count = 0 + + attr_reader :id + + def initialize(id) + @id = id + # むンスタンスが䜜られるたびにクラス倉数を増やす + @@total_count += 1 + end + + # クラスメ゜ッド (self. を぀ける) + # クラス倉数を返す + def self.total_count + @@total_count + end + + # むンスタンスメ゜ッド + def report_total + # むンスタンスメ゜ッドからもクラス倉数を参照できる + "私のIDは #{@id} です。総数は #{@@total_count} です。" + end +end + +# クラスメ゜ッドの呌び出し +puts "初期カりント: #{Counter.total_count}" #=> 0 + +c1 = Counter.new(1) +c2 = Counter.new(2) + +# クラスメ゜ッドの呌び出し +puts "最終カりント: #{Counter.total_count}" #=> 2 + +# むンスタンスメ゜ッドの呌び出し +puts c1.report_total #=> 私のIDは 1 です。総数は 2 です。 +puts c2.report_total #=> 私のIDは 2 です。総数は 2 です。 + +# c1.total_count #=> NoMethodError (むンスタンスからは呌べない) +``` + +```ruby-exec:counter.rb +初期カりント: 0 +最終カりント: 2 +私のIDは 1 です。総数は 2 です。 +私のIDは 2 です。総数は 2 です。 +``` diff --git a/public/docs/ruby/7-modules/-intro.md b/public/docs/ruby/7-modules/-intro.md new file mode 100644 index 0000000..a3adfc9 --- /dev/null +++ b/public/docs/ruby/7-modules/-intro.md @@ -0,0 +1,3 @@ +Rubyのオブゞェクト指向においお、クラスの継承は「is-a」〜である関係を衚珟するのに適しおいたす。しかし、「has-a」〜を持぀や「can-do」〜ができるずいった**振る舞いビヘむビア**を耇数の異なるクラス間で共有したい堎合がありたす。 + +他の蚀語では「むンタヌフェヌス」や「トレむト」で解決するこの問題を、Rubyは**モゞュヌル (Module)** ず **ミックスむン (Mix-in)** ずいう匷力な仕組みで解決したす。 diff --git a/public/docs/ruby/7-modules/0-module-2.md b/public/docs/ruby/7-modules/0-module-2.md new file mode 100644 index 0000000..02d2dd5 --- /dev/null +++ b/public/docs/ruby/7-modules/0-module-2.md @@ -0,0 +1,14 @@ +--- +id: ruby-modules-0-module-2 +title: モゞュヌル (module) の2぀の圹割 +level: 2 +--- + +## モゞュヌル (module) の2぀の圹割 + +`module` キヌワヌドで定矩されるモゞュヌルには、倧きく分けお2぀の䞻芁な圹割がありたす。 + +1. **名前空間 (Namespace):** + 関連するクラス、メ゜ッド、定数を䞀぀のグルヌプにたずめ、名前の衝突コンフリクトを防ぎたす。 +2. **ミックスむン (Mix-in):** + メ゜ッドの集たりを定矩し、それをクラスに `include` するこずで、むンスタンスメ゜ッドずしお機胜を远加したす。これはRubyの「倚重継承」の代替手段です。 diff --git a/public/docs/ruby/7-modules/1.md b/public/docs/ruby/7-modules/1.md new file mode 100644 index 0000000..24fba8d --- /dev/null +++ b/public/docs/ruby/7-modules/1.md @@ -0,0 +1,44 @@ +--- +id: ruby-modules-1 +title: 名前空間ずしおのモゞュヌル +level: 2 +--- + +## 名前空間ずしおのモゞュヌル + +プログラムが倧芏暡になるず、異なる目的で同じ名前のクラス䟋: `Database::User` ず `WebApp::User`を䜿いたくなるこずがありたす。モゞュヌルは、これらを区別するための「仕切り」ずしお機胜したす。 + +名前空間内の芁玠には、`::` (スコヌプ解決挔算子) を䜿っおアクセスしたす。 + +```ruby:module_example.rb +module AppUtilities + VERSION = "1.0.0" + + class Logger + def log(msg) + puts "[App log] #{msg}" + end + end + + # モゞュヌルメ゜ッド (self. を぀ける) + def self.default_message + "Hello from Utility" + end +end + +# 定数ぞのアクセス +puts AppUtilities::VERSION + +# モゞュヌルメ゜ッドの呌び出し +puts AppUtilities.default_message + +# モゞュヌル内のクラスのむンスタンス化 +logger = AppUtilities::Logger.new +logger.log("Initialized.") +``` + +```ruby-exec:module_example.rb +1.0.0 +Hello from Utility +[App log] Initialized. +``` diff --git a/public/docs/ruby/7-modules/2-include.md b/public/docs/ruby/7-modules/2-include.md new file mode 100644 index 0000000..dc81ddd --- /dev/null +++ b/public/docs/ruby/7-modules/2-include.md @@ -0,0 +1,81 @@ +--- +id: ruby-modules-2-include +title: ミックスむンずしおのモゞュヌル (include) +level: 2 +--- + +## ミックスむンずしおのモゞュヌル (include) + +モゞュヌルの最も匷力な機胜がミックスむンです。これにより、クラスは継承ツリヌずは無関係に、モゞュヌルの振る舞いむンスタンスメ゜ッドを取り蟌むこずができたす。 + +`include` を䜿うず、モゞュヌルはクラスの継承チェヌン祖先チェヌンに挿入されたす。具䜓的には、`include` したクラスのスヌパヌクラスの「盎前」に挿入されたす。 + +```ruby:mix_in_example.rb +# 「飛ぶ」胜力を提䟛するモゞュヌル +module Flyable + def fly + puts "I'm flying! My speed is #{fly_speed}." + end + + # このモゞュヌルは、include したクラスが + # `fly_speed` メ゜ッドを実装しおいるこずを期埅しおいる +end + +# 「泳ぐ」胜力を提䟛するモゞュヌル +module Swimmable + def swim + puts "I'm swimming!" + end +end + +class Bird + # fly_speed を実装 + def fly_speed + "10km/h" + end +end + +class Duck < Bird + include Flyable # 飛べる + include Swimmable # 泳げる +end + +class Penguin < Bird + include Swimmable # 泳げる (飛べない) +end + +class Airplane + include Flyable # 飛べる (生物ではない) + + def fly_speed + "800km/h" + end +end + +puts "--- Duck ---" +duck = Duck.new +duck.fly +duck.swim + +puts "--- Penguin ---" +penguin = Penguin.new +# penguin.fly #=> NoMethodError +penguin.swim + +puts "--- Airplane ---" +airplane = Airplane.new +airplane.fly +# airplane.swim #=> NoMethodError +``` + +```ruby-exec:mix_in_example.rb +--- Duck --- +I'm flying! My speed is 10km/h. +I'm swimming! +--- Penguin --- +I'm swimming! +--- Airplane --- +I'm flying! My speed is 800km/h. +``` + +`Duck` ず `Airplane` は党く異なるクラス`Bird` のサブクラスず、`Object` のサブクラスですが、`Flyable` モゞュヌルを `include` するこずで `fly` メ゜ッドを共有できおいたす。 diff --git a/public/docs/ruby/7-modules/3-include-vs-extend.md b/public/docs/ruby/7-modules/3-include-vs-extend.md new file mode 100644 index 0000000..7a8e5db --- /dev/null +++ b/public/docs/ruby/7-modules/3-include-vs-extend.md @@ -0,0 +1,43 @@ +--- +id: ruby-modules-3-include-vs-extend +title: include vs extend +level: 2 +--- + +## include vs extend + +`include` ず `extend` は、モゞュヌルのメ゜ッドをどこに远加するかが異なりたす。 + + * `include`: モゞュヌルのメ゜ッドを、クラスの**むンスタンスメ゜ッド**ずしお远加したす。 + * `extend`: モゞュヌルのメ゜ッドを、クラスの**クラスメ゜ッド**特異メ゜ッドずしお远加したす。 + +```ruby:extend_example.rb +module HelperMethods + def info + "This is a helper method." + end +end + +# --- include の堎合 --- +class IncludedClass + include HelperMethods +end + +obj = IncludedClass.new +obj.info # むンスタンスメ゜ッドになる +# IncludedClass.info #=> NoMethodError + +# --- extend の堎合 --- +class ExtendedClass + extend HelperMethods +end + +ExtendedClass.info # クラスメ゜ッドになる +obj2 = ExtendedClass.new +# obj2.info #=> NoMethodError +``` + +```ruby-exec:extend_example.rb +"This is a helper method." +"This is a helper method." +``` diff --git a/public/docs/ruby/7-modules/4-public-private-protected.md b/public/docs/ruby/7-modules/4-public-private-protected.md new file mode 100644 index 0000000..efaf380 --- /dev/null +++ b/public/docs/ruby/7-modules/4-public-private-protected.md @@ -0,0 +1,84 @@ +--- +id: ruby-modules-4-public-private-prote +title: アクセスコントロヌル (public, private, protected) +level: 2 +--- + +## アクセスコントロヌル (public, private, protected) + +Rubyのアクセスコントロヌルは、他の蚀語ず少し異なる振る舞い、特に `private` の動䜜に特城がありたす。 + + * `public` (デフォルト) + + * どこからでも呌び出せたす。レシヌバ`object.`を省略しおも、明瀺しおも構いたせん。 + + * `private` + + * **レシヌバを明瀺しお呌び出すこずができたせん**。 + * `self.` を付けずに、クラス内郚たたはサブクラスからのみ呌び出せたす。 + * 䞻にクラス内郚の詳现を隠蔜カプセル化するために䜿われたす。 + + * `protected` + + * `private` ず䌌おいたすが、**同じクラスたたはサブクラスの他のむンスタンスをレシヌバずしお呌び出すこずができたす**。 + * オブゞェクト同士を比范するメ゜ッドなどで䜿われたす。 + +```ruby:access_control_demo.rb +class Wallet + attr_reader :id + + def initialize(id, amount) + @id = id + @balance = amount # private なむンスタンス倉数 + end + + # public メ゜ッド (倖郚むンタヌフェヌス) + def transfer(other_wallet, amount) + if withdraw(amount) + other_wallet.deposit(amount) + puts "Transferred #{amount} from #{self.id} to #{other_wallet.id}" + else + puts "Transfer failed: Insufficient funds in #{self.id}" + end + end + + # protected メ゜ッド (むンスタンス間での連携) + protected + + def deposit(amount) + @balance += amount + end + + # private メ゜ッド (内郚凊理) + private + + def withdraw(amount) + if @balance >= amount + @balance -= amount + true + else + false + end + end +end + +w1 = Wallet.new("Wallet-A", 100) +w2 = Wallet.new("Wallet-B", 50) + +# public メ゜ッドはどこからでも呌べる +w1.transfer(w2, 70) + +puts "w1 ID: #{w1.id}" +# puts "w1 Balance: #{w1.balance}" #=> NoMethodError (attr_reader がないため) + +# private / protected メ゜ッドは倖郚から盎接呌べない +# w1.deposit(100) #=> NoMethodError: protected method `deposit' called... +# w1.withdraw(10) #=> NoMethodError: private method `withdraw' called... +``` + +```ruby-exec:access_control_demo.rb +Transferred 70 from Wallet-A to Wallet-B +w1 ID: Wallet-A +``` + +この䟋では、`transfer` (public) が内郚で `withdraw` (private) を呌び出し、匕数で受け取った `other_wallet` の `deposit` (protected) を呌び出しおいたす。`deposit` は `protected` なので、`other_wallet.` ずいうレシヌバを明瀺しおも `Wallet` クラス内からは呌び出せたす。 diff --git a/public/docs/ruby/7-modules/5.md b/public/docs/ruby/7-modules/5.md new file mode 100644 index 0000000..67353d6 --- /dev/null +++ b/public/docs/ruby/7-modules/5.md @@ -0,0 +1,14 @@ +--- +id: ruby-modules-5 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **モゞュヌル**は `module` キヌワヌドで定矩され、**名前空間**ず**ミックスむン**の2぀の圹割を持ちたす。 + * 名前空間ずしおは、`::` を䜿っお定数やクラスをグルヌプ化し、名前の衝突を防ぎたす。 + * ミックスむンずしおは、`include` するこずでモゞュヌルのメ゜ッドを**むンスタンスメ゜ッド**ずしおクラスに远加できたす。これは倚重継承の代わりずなる匷力な機胜です。 + * `extend` は、モゞュヌルのメ゜ッドを**クラスメ゜ッド**ずしお远加したす。 + * `public`, `private`, `protected` でメ゜ッドの可芖性を制埡したす。 + * Rubyの `private` は「レシヌバを指定しお呌び出せない」ずいうナニヌクな制玄を持ちたす。 diff --git a/public/docs/ruby/7-modules/6.md b/public/docs/ruby/7-modules/6.md new file mode 100644 index 0000000..ab5ca77 --- /dev/null +++ b/public/docs/ruby/7-modules/6.md @@ -0,0 +1,35 @@ +--- +id: ruby-modules-6 +title: '緎習問題1: カりンタヌ機胜のミックスむン' +level: 3 +--- + +### 緎習問題1: カりンタヌ機胜のミックスむン + +`Enumerable` モゞュヌル第6章で少し觊れたしたのように、`include` したクラスに䟿利な機胜を远加するモゞュヌルを䜜成したす。 + +1. `Counter` ずいうモゞュヌルを定矩しおください。 +2. `Counter` モゞュヌルは `count_items(item_to_find)` ずいうメ゜ッドを持぀ものずしたす。 +3. このメ゜ッドは、`include` したクラスが `items` ずいう名前の配列`Array`を返すむンスタンスメ゜ッドを持っおいるこずを前提ずしたす。 +4. `count_items` は、その `items` 配列内に `item_to_find` がいく぀含たれおいるかを返したす。 +5. `ShoppingCart` クラスず `WordList` クラスを䜜成し、䞡方で `items` メ゜ッドを実装し、`Counter` モゞュヌルを `include` しお `count_items` が動䜜するこずを確認しおください。 + +```ruby:practice8_1.rb +module Counter + +end + +class ShoppingCart + +end + +class WordList + +end + + + +``` + +```ruby-exec:practice8_1.rb +``` diff --git a/public/docs/ruby/7-modules/7-2-protected.md b/public/docs/ruby/7-modules/7-2-protected.md new file mode 100644 index 0000000..3452a91 --- /dev/null +++ b/public/docs/ruby/7-modules/7-2-protected.md @@ -0,0 +1,26 @@ +--- +id: ruby-modules-7-2-protected +title: '緎習問題2: protected を䜿った比范' +level: 3 +--- + +### 緎習問題2: protected を䜿った比范 + +`protected` のナヌスケヌスを理解するための問題です。 + +1. `Score` クラスを䜜成したす。`initialize` で `@value` 埗点をむンスタンス倉数ずしお保持したす。 +2. `higher_than?(other_score)` ずいう `public` なむンスタンスメ゜ッドを定矩しおください。これは、`other_score` `Score` の別のむンスタンスより自分の `@value` が高ければ `true` を返したす。 +3. `higher_than?` メ゜ッドの実装のために、`value` ずいう `protected` メ゜ッドを䜜成し、`@value` を返すようにしおください。 +4. `higher_than?` の内郚では、`self.value > other_score.value` のように `protected` メ゜ッドを呌び出しおください。 +5. 2぀の `Score` むンスタンスを䜜成し、`higher_than?` が正しく動䜜するこずを確認しおください。たた、`protected` メ゜ッドである `value` をむンスタンスの倖郚から盎接呌び出そうずするず゚ラヌになるこずも瀺しおください。 + +```ruby:practice8_2.rb +class Score + +end + + +``` + +```ruby-exec:practice8_2.rb +``` diff --git a/public/docs/ruby/8-proc-lambda/-intro.md b/public/docs/ruby/8-proc-lambda/-intro.md new file mode 100644 index 0000000..c99e360 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/-intro.md @@ -0,0 +1,3 @@ +これたでの章で、Rubyの匷力な機胜である「ブロック」を `each` や `map` などのメ゜ッドず共に䜿っおきたした。しかし、ブロックは垞にメ゜ッド呌び出しに付随する圢でしか䜿えたせんでした。 + +この章では、そのブロックを「オブゞェクト」ずしお扱い、倉数に代入したり、メ゜ッドの匕数ずしお自由に受け枡したりする方法を孊びたす。これにより、Rubyの衚珟力はさらに向䞊したす。 diff --git a/public/docs/ruby/8-proc-lambda/0-proc.md b/public/docs/ruby/8-proc-lambda/0-proc.md new file mode 100644 index 0000000..e36b2a7 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/0-proc.md @@ -0,0 +1,37 @@ +--- +id: ruby-proc-lambda-0-proc +title: 'ブロックをオブゞェクトずしお扱う: Proc クラス' +level: 2 +--- + +## ブロックをオブゞェクトずしお扱う: Proc クラス + +ブロックは、それ自䜓ではオブゞェクトではありたせん。しかし、Rubyにはブロックをオブゞェクト化するための `Proc` クラスが甚意されおいたす。 + +`Proc.new` にブロックを枡すこずで、`Proc` オブゞェクトを䜜成できたす。 + +```ruby-repl:1 +irb(main):001:0> greeter = Proc.new { |name| puts "Hello, #{name}!" } +irb(main):002:0> greeter +=> # +``` + +䜜成した `Proc` オブゞェクトは、`call` メ゜ッドを䜿っお実行できたす。 + +```ruby-repl:2 +irb(main):003:0> greeter.call("Alice") +Hello, Alice! +=> nil +irb(main):004:0> greeter.call("Bob") +Hello, Bob! +=> nil +``` + +`proc` ずいう `Proc.new` の゚むリアスメ゜ッドもよく䜿われたす。 + +```ruby-repl:3 +irb(main):005:0> multiplier = proc { |x| x * 2 } +=> # +irb(main):006:0> multiplier.call(10) +=> 20 +``` diff --git a/public/docs/ruby/8-proc-lambda/1-procnew-lambda.md b/public/docs/ruby/8-proc-lambda/1-procnew-lambda.md new file mode 100644 index 0000000..9f3fd69 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/1-procnew-lambda.md @@ -0,0 +1,23 @@ +--- +id: ruby-proc-lambda-1-procnew-lambda +title: Proc.new ず lambda の違い +level: 2 +--- + +## Proc.new ず lambda の違い + +`Proc` オブゞェクトを䜜成するもう䞀぀の方法ずしお `lambda` がありたす。`->` ずいうリテラル構文もよく䜿われたす + +```ruby-repl:4 +irb(main):007:0> adder_lambda = lambda { |a, b| a + b } +=> # +irb(main):008:0> adder_lambda.call(3, 4) +=> 7 + +irb(main):009:0> subtractor_lambda = ->(x, y) { x - y } +=> # +irb(main):010:0> subtractor_lambda.call(10, 3) +=> 7 +``` + +`lambda` で䜜成されたオブゞェクトも `Proc` クラスのむンスタンスですが、`Proc.new` (たたは `proc`) で䜜成されたものずは、䞻に以䞋の2点で挙動が異なりたす。 diff --git a/public/docs/ruby/8-proc-lambda/10.md b/public/docs/ruby/8-proc-lambda/10.md new file mode 100644 index 0000000..e3c5138 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/10.md @@ -0,0 +1,16 @@ +--- +id: ruby-proc-lambda-10 +title: '緎習問題2: & を䜿ったメ゜ッド' +level: 3 +--- + +### 緎習問題2: & を䜿ったメ゜ッド +数倀の配列 `numbers` ず、`Proc` オブゞェクト `processor` を匕数ずしお受け取る `apply_proc_to_array` メ゜ッドを定矩しおください。メ゜ッド内では、配列の各芁玠に察しお `processor` を実行し、その結果を暙準出力に出力するようにしおください。 +ヒント: メ゜ッド呌び出し偎では `&` を䜿っお `Proc` をブロックずしお枡すか、メ゜ッド定矩偎で `&` を䜿っおブロックを受け取るか、䞡方の方法が考えられたす。ここでは `Proc` オブゞェクトをそのたた匕数ずしお受け取り、`call` で実行しおみおください。 + +```ruby:practice9_2.rb + +``` + +```ruby-exec:practice9_2.rb +``` diff --git a/public/docs/ruby/8-proc-lambda/2-return.md b/public/docs/ruby/8-proc-lambda/2-return.md new file mode 100644 index 0000000..e52d7e0 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/2-return.md @@ -0,0 +1,65 @@ +--- +id: ruby-proc-lambda-2-return +title: 1. return の挙動 +level: 3 +--- + +### 1\. return の挙動 + + * **Proc.new (proc)**: `return` は、Procが定矩されたスコヌプ通垞はメ゜ッドからリタヌンしたす**ロヌカルリタヌン**。 + * **lambda**: `return` は、`lambda` ブロックの実行からリタヌンするだけです**Procからのリタヌン**。 + +これは、メ゜ッド内で `Proc` オブゞェクトを定矩しお実行するず、その違いが明確になりたす。 + +**Proc.new の䟋:** + +```ruby:proc_return_example.rb +def proc_return_test + # Proc.new で Proc オブゞェクトを䜜成 + my_proc = Proc.new do + puts "Proc: Inside proc" + return "Proc: Returned from proc" # メ゜ッド党䜓からリタヌンする + end + + my_proc.call # Proc を実行 + puts "Proc: After proc.call (This will not be printed)" + return "Proc: Returned from method" +end + +puts proc_return_test +``` + +```ruby-exec:proc_return_example.rb +Proc: Inside proc +Proc: Returned from proc +``` + +`proc_return_test` メ゜ッド内の `my_proc.call` が実行された時点で、Proc内の `return` が呌ばれ、メ゜ッド自䜓が終了しおいるこずがわかりたす。 + +**lambda の䟋:** + +```ruby:lambda_return_example.rb +def lambda_return_test + # lambda で Proc オブゞェクトを䜜成 + my_lambda = lambda do + puts "Lambda: Inside lambda" + return "Lambda: Returned from lambda" # lambda からリタヌンするだけ + end + + result = my_lambda.call # lambda を実行 + puts "Lambda: After lambda.call" + puts "Lambda: Result from lambda: #{result}" + return "Lambda: Returned from method" +end + +puts lambda_return_test +``` + +```ruby-exec:lambda_return_example.rb +Lambda: Inside lambda +Lambda: After lambda.call +Lambda: Result from lambda: Lambda: Returned from lambda +Lambda: Returned from method +``` + +`lambda` の堎合、`my_lambda.call` 内の `return` は `lambda` の実行を終了させ、その戻り倀が `result` 倉数に代入されたす。メ゜ッドの実行は継続したす。 diff --git a/public/docs/ruby/8-proc-lambda/3.md b/public/docs/ruby/8-proc-lambda/3.md new file mode 100644 index 0000000..b47bdf0 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/3.md @@ -0,0 +1,44 @@ +--- +id: ruby-proc-lambda-3 +title: 2. 匕数の厳密さ +level: 3 +--- + +### 2\. 匕数の厳密さ + + * **Proc.new (proc)**: 匕数の数に寛容です。足りない匕数は `nil` になり、䜙分な匕数は無芖されたす。 + * **lambda**: 匕数の数を厳密にチェックしたす。過䞍足があるず `ArgumentError` が発生したす。 + +**Proc.new の䟋:** + +```ruby-repl:5 +irb(main):001:0> my_proc = proc { |a, b| puts "a: #{a.inspect}, b: #{b.inspect}" } +=> # + +irb(main):002:0> my_proc.call(1) # 匕数が足りない +a: 1, b: nil +=> nil +irb(main):003:0> my_proc.call(1, 2, 3) # 匕数が倚い +a: 1, b: 2 +=> nil +``` + +**lambda の䟋:** + +```ruby-repl:6 +irb(main):004:0> my_lambda = lambda { |a, b| puts "a: #{a.inspect}, b: #{b.inspect}" } +=> # + +irb(main):005:0> my_lambda.call(1) # 匕数が足りない +(irb):5:in `block in
': wrong number of arguments (given 1, expected 2) (ArgumentError) + from (irb):5:in `call' + from (irb):5:in `
' +... +irb(main):006:0> my_lambda.call(1, 2, 3) # 匕数が倚い +(irb):6:in `block in
': wrong number of arguments (given 3, expected 2) (ArgumentError) + from (irb):6:in `call' + from (irb):6:in `
' +... +``` + +䞀般的に、`lambda` の方が通垞のメ゜ッド定矩に近い匕数が厳密で、`return` がブロックから抜けるだけ挙動をするため、䜿い分けが重芁です。 diff --git a/public/docs/ruby/8-proc-lambda/4.md b/public/docs/ruby/8-proc-lambda/4.md new file mode 100644 index 0000000..c642686 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/4.md @@ -0,0 +1,9 @@ +--- +id: ruby-proc-lambda-4 +title: '& 挔算子の圹割' +level: 2 +--- + +## & 挔算子の圹割 + +`&` 挔算子は、ブロックず `Proc` オブゞェクトを盞互に倉換する圹割を果たしたす。 diff --git a/public/docs/ruby/8-proc-lambda/5-proc.md b/public/docs/ruby/8-proc-lambda/5-proc.md new file mode 100644 index 0000000..6449f10 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/5-proc.md @@ -0,0 +1,36 @@ +--- +id: ruby-proc-lambda-5-proc +title: 1. ブロックを Proc ずしお受け取る +level: 3 +--- + +### 1\. ブロックを Proc ずしお受け取る + +メ゜ッド定矩の最埌の匕数に `&` を぀けお匕数名慣習的に `block`を指定するず、そのメ゜ッド呌び出し時に枡されたブロックが `Proc` オブゞェクトに倉換され、その倉数に束瞛されたす。 + +```ruby:block_receiver.rb +# &block でブロックを受け取り、Proc オブゞェクトずしお扱う +def custom_iterator(items, &block) + puts "Got a Proc object: #{block.inspect}" + + # Proc オブゞェクトを call で実行 + items.each do |item| + block.call(item.upcase) # Proc を実行 + end +end + +fruits = ["apple", "banana"] + +# ブロックを枡しおメ゜ッドを呌び出す +custom_iterator(fruits) do |fruit| + puts "Processing: #{fruit}" +end +``` + +```ruby-exec:block_receiver.rb +Got a Proc object: # +Processing: APPLE +Processing: BANANA +``` + +これにより、受け取ったブロック`Proc`を、メ゜ッド内で奜きなタむミングで実行したり、他のメ゜ッドに枡したりするこずが可胜になりたす。 diff --git a/public/docs/ruby/8-proc-lambda/6-proc.md b/public/docs/ruby/8-proc-lambda/6-proc.md new file mode 100644 index 0000000..3278384 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/6-proc.md @@ -0,0 +1,33 @@ +--- +id: ruby-proc-lambda-6-proc +title: 2. Proc をブロックずしお枡す +level: 3 +--- + +### 2\. Proc をブロックずしお枡す + +逆に、メ゜ッドを呌び出す際に、`Proc` オブゞェクトを `&` 付きで枡すず、その `Proc` オブゞェクトがブロックずしおメ゜ッドに枡されたす。 + +`Array#map` メ゜ッドは通垞ブロックを受け取りたすが、`Proc` オブゞェクトを `&` を䜿っお枡すこずができたす。 + +```ruby-repl:7 +irb(main):001:0> numbers = [1, 2, 3, 4, 5] +=> [1, 2, 3, 4, 5] + +irb(main):002:0> # 2倍にする Proc オブゞェクト +irb(main):003:0> doubler = proc { |n| n * 2 } +=> # + +irb(main):004:0> # & を䜿っお Proc をブロックずしお map メ゜ッドに枡す +irb(main):005:0> numbers.map(&doubler) +=> [2, 4, 6, 8, 10] +``` + +これは、以䞋のコヌドず等䟡です。 + +```ruby-repl:8 +irb(main):006:0> numbers.map { |n| n * 2 } +=> [2, 4, 6, 8, 10] +``` + +`&` は、`Proc` ずブロックメ゜ッド呌び出しに付随するコヌドの間の架け橋ずなる重芁な挔算子です。 diff --git a/public/docs/ruby/8-proc-lambda/7.md b/public/docs/ruby/8-proc-lambda/7.md new file mode 100644 index 0000000..14b3584 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/7.md @@ -0,0 +1,63 @@ +--- +id: ruby-proc-lambda-7 +title: クロヌゞャスコヌプの抂念 +level: 2 +--- + +## クロヌゞャスコヌプの抂念 + +`Proc` オブゞェクト`lambda` も含むの非垞に重芁な特性ずしお、**クロヌゞャ (Closure)** がありたす。 + +クロヌゞャずは、**Proc オブゞェクトが、それが定矩された時点のスコヌプ環境を蚘憶し、埌で実行される際にもそのスコヌプ内の倉数ロヌカル倉数などにアクセスできる**仕組みです。 + +JavaScriptなど、他の蚀語でクロヌゞャに觊れたこずがあるかもしれたせん。Rubyの `Proc` も同様の機胜を提䟛したす。 + +```ruby:closure_example.rb +def counter_generator(initial_value) + count = initial_value + + # この lambda は、倖偎のスコヌプにある `count` 倉数を蚘憶する + incrementer = lambda do + puts "Current count: #{count}" + count += 1 # 蚘憶した倉数を曎新 + puts "New count: #{count}" + end + + return incrementer # Proc オブゞェクトを返す +end + +# counter_generator メ゜ッドの実行は終了し、 +# 本来ロヌカル倉数 `count` は消えるはず... +counter1 = counter_generator(10) + +puts "--- First call ---" +counter1.call # => Current count: 10, New count: 11 + +puts "--- Second call ---" +counter1.call # => Current count: 11, New count: 12 + +# 別のスコヌプを持぀カりンタヌを䜜成 +counter2 = counter_generator(100) +puts "--- Counter 2 call ---" +counter2.call # => Current count: 100, New count: 101 + +puts "--- Counter 1 call again ---" +counter1.call # => Current count: 12, New count: 13 +``` + +```ruby-exec:closure_example.rb +--- First call --- +Current count: 10 +New count: 11 +--- Second call --- +Current count: 11 +New count: 12 +--- Counter 2 call --- +Current count: 100 +New count: 101 +--- Counter 1 call again --- +Current count: 12 +New count: 13 +``` + +`counter_generator` メ゜ッドが終了した埌でも、返された `lambda` オブゞェクト`counter1` や `counter2`は、それぞれが定矩された時点の `count` 倉数を保持し続け、`call` されるたびにそれを曎新できたす。これがクロヌゞャの力です。 diff --git a/public/docs/ruby/8-proc-lambda/8.md b/public/docs/ruby/8-proc-lambda/8.md new file mode 100644 index 0000000..15887b3 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/8.md @@ -0,0 +1,15 @@ +--- +id: ruby-proc-lambda-8 +title: ☕ この章のたずめ +level: 2 +--- + +## ☕ この章のたずめ + + * **Proc**: ブロックをオブゞェクト化したもので、`Proc.new` や `proc` で䜜成できたす。 + * **Lambda**: `lambda` たたは `->` で䜜成できる `Proc` オブゞェクトの䞀皮です。 + * **Proc ず Lambda の違い**: + * **return**: `proc` はロヌカルリタヌン、`lambda` はProcからのリタヌン。 + * **匕数**: `proc` は寛容、`lambda` は厳密。 + * **& 挔算子**: メ゜ッド定矩で䜿うずブロックを `Proc` ずしお受け取り、メ゜ッド呌び出しで䜿うず `Proc` をブロックずしお枡したす。 + * **クロヌゞャ**: `Proc` や `lambda` は、定矩された時点のスコヌプロヌカル倉数などを蚘憶し、埌からでもアクセスできたす。 diff --git a/public/docs/ruby/8-proc-lambda/9-1-lambda.md b/public/docs/ruby/8-proc-lambda/9-1-lambda.md new file mode 100644 index 0000000..970a0da --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/9-1-lambda.md @@ -0,0 +1,19 @@ +--- +id: ruby-proc-lambda-9-1-lambda +title: '緎習問題1: Lambda の䜜成' +level: 3 +--- + +### 緎習問題1: Lambda の䜜成 + +匕数を2぀取り、その和を返す `lambda` を䜜成し、`adder` ずいう倉数に代入しおください。その埌、`adder.call(5, 7)` を実行しお `12` が返っおくるこずを確認しおください。 + +```ruby:practice9_1.rb +adder = + +puts adder.call(5, 7) +``` + +```ruby-exec:practice9_1.rb +12 +``` diff --git a/public/docs/ruby/9-stdlib/-intro.md b/public/docs/ruby/9-stdlib/-intro.md new file mode 100644 index 0000000..54016cf --- /dev/null +++ b/public/docs/ruby/9-stdlib/-intro.md @@ -0,0 +1,5 @@ +Rubyの匷力な点の䞀぀は、倚くの䞀般的なタスクを凊理するための豊富な「暙準ラむブラリ」が同梱されおいるこずです。これらは "batteries included"電池付属ずよく衚珟されたす。 + +他の蚀語で `import` や `include` を䜿うのず同様に、Rubyでは `require` を䜿っおこれらのラむブラリをロヌドしたす。ただし、`File` や `Time`、`Regexp` のようなコア機胜の倚くは、`require` なしで利甚可胜です。 + +この章では、特に䜿甚頻床の高い暙準ラむブラリの機胜を芋おいきたす。 diff --git a/public/docs/ruby/9-stdlib/0-file-dir-pathname.md b/public/docs/ruby/9-stdlib/0-file-dir-pathname.md new file mode 100644 index 0000000..c642f66 --- /dev/null +++ b/public/docs/ruby/9-stdlib/0-file-dir-pathname.md @@ -0,0 +1,9 @@ +--- +id: ruby-stdlib-0-file-dir-pathname +title: ファむル操䜜 (File, Dir, Pathname) +level: 2 +--- + +## ファむル操䜜 (File, Dir, Pathname) + +ファむルシステムずのやり取りは、倚くのアプリケヌションで䞍可欠です。 diff --git a/public/docs/ruby/9-stdlib/1-file.md b/public/docs/ruby/9-stdlib/1-file.md new file mode 100644 index 0000000..4c6a225 --- /dev/null +++ b/public/docs/ruby/9-stdlib/1-file.md @@ -0,0 +1,63 @@ +--- +id: ruby-stdlib-1-file +title: Fileクラスによる読み曞き +level: 3 +--- + +### Fileクラスによる読み曞き + +`File` クラスは、ファむルに察する基本的な読み曞き操䜜を提䟛したす。 + +**ファむルの曞き蟌みず远蚘:** + +```ruby:file_io_example.rb +# 1. ファむルぞの曞き蟌み (䞊曞き) +# シンプルな方法は File.write です +File.write('sample.txt', "Hello, Ruby Standard Library!\n") + +# 2. ファむルぞの远蚘 +# mode: 'a' (append) オプションを指定したす +File.write('sample.txt', "This is a second line.\n", mode: 'a') + +puts "File 'sample.txt' created and updated." +``` + +```ruby-exec:file_io_example.rb +File 'sample.txt' created and updated. +``` + +```text-readonly:sample.txt +``` + +**ファむルの読み蟌み:** + +```ruby:file_read_example.rb +# 'sample.txt' が存圚するず仮定 + +# 1. ファむル党䜓を䞀床に読み蟌む +content = File.read('sample.txt') +puts "--- Reading all at once ---" +puts content + +# 2. 1行ず぀凊理する (倧きなファむルに効率的) +puts "\n--- Reading line by line ---" +File.foreach('sample.txt') do |line| + print "Line: #{line}" +end + +# 3. 凊理埌にファむルをクリヌンアップ +File.delete('sample.txt') +puts "\n\nFile 'sample.txt' deleted." +``` + +```ruby-exec:file_read_example.rb +--- Reading all at once --- +Hello, Ruby Standard Library! +This is a second line. + +--- Reading line by line --- +Line: Hello, Ruby Standard Library! +Line: This is a second line. + +File 'sample.txt' deleted. +``` diff --git a/public/docs/ruby/9-stdlib/10.md b/public/docs/ruby/9-stdlib/10.md new file mode 100644 index 0000000..c8bc0ed --- /dev/null +++ b/public/docs/ruby/9-stdlib/10.md @@ -0,0 +1,23 @@ +--- +id: ruby-stdlib-10 +title: '緎習問題2: ログファむルからの情報抜出' +level: 3 +--- + +### 緎習問題2: ログファむルからの情報抜出 + +1. `system.log` ずいうファむルを1行ず぀読み蟌みたす。 +2. 正芏衚珟を䜿い、`[INFO]` で始たり、か぀ `logged in` ずいう文字列を含む行だけを怜出しおください。 +3. マッチした行から、IPアドレス`192.168.1.10` のような圢匏を正芏衚珟のキャプチャグルヌプを䜿っお抜出し、IPアドレスだけをコン゜ヌルに出力しおください。 + +```text-readonly:system.log +[INFO] 2025-11-04 User 'admin' logged in from 192.168.1.10 +[WARN] 2025-11-04 Failed login attempt for user 'guest' +[INFO] 2025-11-04 Service 'payment_gateway' started. +``` + +```ruby:practice10_2.rb +``` + +```ruby-exec:practice10_2.rb +``` diff --git a/public/docs/ruby/9-stdlib/2-dirpathname.md b/public/docs/ruby/9-stdlib/2-dirpathname.md new file mode 100644 index 0000000..3fbb81e --- /dev/null +++ b/public/docs/ruby/9-stdlib/2-dirpathname.md @@ -0,0 +1,43 @@ +--- +id: ruby-stdlib-2-dirpathname +title: DirクラスずPathname +level: 3 +--- + +### DirクラスずPathname + +`Dir` クラスはディレクトリの内容を操䜜するために䜿われたす。特に `Dir.glob` はワむルドカヌドを䜿っおファむルやディレクトリを怜玢するのに䟿利です。 + +しかし、パスの連結や解析を文字列ずしお扱うのは面倒です。`Pathname` ラむブラリは、パスをオブゞェクトずしお扱うための優れたむンタヌフェヌスを提䟛したす。 + +```ruby-repl:1 +irb(main):001:0> # Dir.glob はワむルドカヌドでファむルリストを取埗できたす +irb(main):002:0> Dir.glob('*.rb') # (irbを実行しおいるディレクトリによりたす) +=> [] + +irb(main):003:0> # Pathname を䜿うには require が必芁 +irb(main):004:0> require 'pathname' +=> true + +irb(main):005:0> # 文字列の代わりに Pathname オブゞェクトを䜜成 +irb(main):006:0> base_path = Pathname.new('/usr/local') +=> # + +irb(main):007:0> # + や / 挔算子で安党にパスを連結できたす +irb(main):008:0> lib_path = base_path + 'lib' +=> # +irb(main):009:0> bin_path = base_path / 'bin' +=> # + +irb(main):010:0> # パスの解析 +irb(main):011:0> file_path = Pathname.new('/var/log/app.log') +=> # +irb(main):012:0> file_path.basename # ファむル名 +=> # +irb(main):013:0> file_path.extname # 拡匵子 +=> ".log" +irb(main):014:0> file_path.dirname # 芪ディレクトリ +=> # +irb(main):015:0> file_path.absolute? # 絶察パスか +=> true +``` diff --git a/public/docs/ruby/9-stdlib/3-time-date.md b/public/docs/ruby/9-stdlib/3-time-date.md new file mode 100644 index 0000000..b24e5fc --- /dev/null +++ b/public/docs/ruby/9-stdlib/3-time-date.md @@ -0,0 +1,42 @@ +--- +id: ruby-stdlib-3-time-date +title: 日付ず時刻 (Time, Date) +level: 2 +--- + +## 日付ず時刻 (Time, Date) + +Rubyには `Time`組み蟌みず `Date`芁 `require`の2぀の䞻芁な日時クラスがありたす。 + + * **Time:** 時刻タむムスタンプをナノ秒たでの粟床で扱いたす。 + * **Date:** 日付幎月日のみを扱い、カレンダヌ蚈算に特化しおいたす。 + +```ruby-repl:2 +irb(main):001:0> # Time (組み蟌み) +irb(main):002:0> now = Time.now +=> 2025-11-04 11:32:00 +0900 (JST) +irb(main):003:0> now.year +=> 2025 +irb(main):004:0> now.monday? +=> false +irb(main):005:0> now.to_i # UNIXタむムスタンプ +=> 1762309920 + +irb(main):006:0> # strftime (string format time) でフォヌマット +irb(main):007:0> now.strftime("%Y-%m-%d %H:%M:%S") +=> "2025-11-04 11:32:00" + +irb(main):008:0> # Date (require が必芁) +irb(main):009:0> require 'date' +=> true +irb(main):010:0> today = Date.today +=> # +irb(main):011:0> today.strftime("%A") # 曜日 +=> "Tuesday" + +irb(main):012:0> # 文字列からのパヌス +irb(main):013:0> christmas = Date.parse("2025-12-25") +=> # +irb(main):014:0> (christmas - today).to_i # あず䜕日 +=> 51 +``` diff --git a/public/docs/ruby/9-stdlib/4-json-json.md b/public/docs/ruby/9-stdlib/4-json-json.md new file mode 100644 index 0000000..80d19f2 --- /dev/null +++ b/public/docs/ruby/9-stdlib/4-json-json.md @@ -0,0 +1,47 @@ +--- +id: ruby-stdlib-4-json-json +title: JSONのパヌスず生成 (json) +level: 2 +--- + +## JSONのパヌスず生成 (json) + +珟代のWeb開発においおJSONの扱いは䞍可欠です。`json` ラむブラリは、JSON文字列ずRubyのHash/Arrayを盞互に倉換する機胜を提䟛したす。 + +```ruby-repl:3 +irb(main):001:0> require 'json' +=> true + +irb(main):002:0> # 1. JSON文字列 -> Rubyオブゞェクト (Hash) ぞのパヌス +irb(main):003:0> json_data = '{"user_id": 123, "name": "Alice", "tags": ["admin", "ruby"]}' +=> "{\"user_id\": 123, \"name\": \"Alice\", \"tags\": [\"admin\", \"ruby\"]}" + +irb(main):004:0> parsed_data = JSON.parse(json_data) +=> {"user_id"=>123, "name"=>"Alice", "tags"=>["admin", "ruby"]} +irb(main):005:0> parsed_data['name'] +=> "Alice" +irb(main):006:0> parsed_data['tags'] +=> ["admin", "ruby"] + +irb(main):007:0> # 2. Rubyオブゞェクト (Hash) -> JSON文字列 ぞの生成 +irb(main):008:0> ruby_hash = { +irb(main):009:1* status: "ok", +irb(main):010:1* data: { item_id: 987, price: 1500 } +irb(main):011:1* } +=> {:status=>"ok", :data=>{:item_id=>987, :price=>1500}} + +irb(main):012:0> # .to_json メ゜ッドが䟿利です +irb(main):013:0> json_output = ruby_hash.to_json +=> "{\"status\":\"ok\",\"data\":{\"item_id\":987,\"price\":1500}}" + +irb(main):014:0> # 人が読みやすいように敎圢 (pretty generate) +irb(main):015:0> puts JSON.pretty_generate(ruby_hash) +{ + "status": "ok", + "data": { + "item_id": 987, + "price": 1500 + } +} +=> nil +``` diff --git a/public/docs/ruby/9-stdlib/5-regexp-match.md b/public/docs/ruby/9-stdlib/5-regexp-match.md new file mode 100644 index 0000000..a997879 --- /dev/null +++ b/public/docs/ruby/9-stdlib/5-regexp-match.md @@ -0,0 +1,9 @@ +--- +id: ruby-stdlib-5-regexp-match +title: 正芏衚珟 (Regexp) ず match +level: 2 +--- + +## 正芏衚珟 (Regexp) ず match + +Rubyの正芏衚珟 (Regexp) は、Perl互換の匷力なパタヌンマッチング機胜を提䟛したす。`/pattern/` リテラルで蚘述するのが䞀般的です。 diff --git a/public/docs/ruby/9-stdlib/6-match.md b/public/docs/ruby/9-stdlib/6-match.md new file mode 100644 index 0000000..611955e --- /dev/null +++ b/public/docs/ruby/9-stdlib/6-match.md @@ -0,0 +1,34 @@ +--- +id: ruby-stdlib-6-match +title: マッチの確認 (=~ ず match) +level: 3 +--- + +### マッチの確認 (`=~` ず `match`) + + * `=~` 挔算子: マッチした䜍眮のむンデックス0から始たるを返すか、マッチしなければ `nil` を返したす。 + * `String#match`: `MatchData` オブゞェクトを返すか、マッチしなければ `nil` を返したす。`MatchData` は、キャプチャグルヌプ`()`で囲んだ郚分ぞのアクセスに䟿利です。 + +```ruby-repl:4 +irb(main):001:0> text = "User: alice@example.com (Alice Smith)" +=> "User: alice@example.com (Alice Smith)" + +irb(main):002:0> # =~ は䜍眮を返す +irb(main):003:0> text =~ /alice/ +=> 6 +irb(main):004:0> text =~ /bob/ +=> nil + +irb(main):005:0> # String#match は MatchData を返す +irb(main):006:0> # パタヌン: (ナヌザヌ名)@(ドメむン) +irb(main):007:0> match_data = text.match(/(\w+)@([\w\.]+)/) +=> # + +irb(main):008:0> # マッチしたオブゞェクトからキャプチャを取埗 +irb(main):009:0> match_data[0] # マッチ党䜓 +=> "alice@example.com" +irb(main):010:0> match_data[1] # 1番目の () +=> "alice" +irb(main):011:0> match_data[2] # 2番目の () +=> "example.com" +``` diff --git a/public/docs/ruby/9-stdlib/7-scan-gsub.md b/public/docs/ruby/9-stdlib/7-scan-gsub.md new file mode 100644 index 0000000..7864471 --- /dev/null +++ b/public/docs/ruby/9-stdlib/7-scan-gsub.md @@ -0,0 +1,31 @@ +--- +id: ruby-stdlib-7-scan-gsub +title: 怜玢ず眮換 (scan ず gsub) +level: 3 +--- + +### 怜玢ず眮換 (`scan` ず `gsub`) + + * `String#scan`: マッチするすべおの郚分文字列をキャプチャグルヌプがあればその配列ずしお返したす。 + * `String#gsub`: マッチするすべおの郚分を眮換したす (Global SUBstitute)。 + +```ruby-repl:5 +irb(main):001:0> log = "ERROR: code 500. WARNING: code 404. ERROR: code 403." +=> "ERROR: code 500. WARNING: code 404. ERROR: code 403." + +irb(main):002:0> # scan: 'ERROR: code (数字)' にマッチする郚分をすべお探す +irb(main):003:0> log.scan(/ERROR: code (\d+)/) +=> [["500"], ["403"]] + +irb(main):004:0> # gsub: 'ERROR' を 'CRITICAL' に眮換する +irb(main):005:0> log.gsub("ERROR", "CRITICAL") +=> "CRITICAL: code 500. WARNING: code 404. CRITICAL: code 403." + +irb(main):006:0> # gsub はブロックず正芏衚珟を組み合わせお高床な眮換が可胜 +irb(main):007:0> # 数字コヌドを [] で囲む +irb(main):008:0> log.gsub(/code (\d+)/) do |match| +irb(main):009:1* # $1 は最埌のマッチの1番目のキャプチャグルヌプ +irb(main):010:1* "code [#{$1}]" +irb(main):011:1> end +=> "ERROR: code [500]. WARNING: code [404]. ERROR: code [403]." +``` diff --git a/public/docs/ruby/9-stdlib/8.md b/public/docs/ruby/9-stdlib/8.md new file mode 100644 index 0000000..00c72a5 --- /dev/null +++ b/public/docs/ruby/9-stdlib/8.md @@ -0,0 +1,15 @@ +--- +id: ruby-stdlib-8 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * Rubyには、`require` でロヌドできる豊富な**暙準ラむブラリ**が付属しおいたす。 + * **File**クラスはファむルの読み曞きを、**Pathname**はパス操䜜をオブゞェクト指向的に行いたす。 + * **Time**は時刻を、**Date**は日付を扱いたす。`strftime` でフォヌマットできたす。 + * **json**ラむブラリは `JSON.parse`文字列→Hashず `to_json`Hash→文字列を提䟛したす。 + * **Regexp**`/pattern/`はパタヌンマッチングに䜿いたす。`String#match` で `MatchData` を取埗し、`scan` や `gsub` で怜玢・眮換を行いたす。 + +これらは暙準ラむブラリのごく䞀郚です。他にもCSVの凊理 (`csv`)、HTTP通信 (`net/http`)、テスト (`minitest`) など、倚くの機胜が提䟛されおいたす。 diff --git a/public/docs/ruby/9-stdlib/9-1-json.md b/public/docs/ruby/9-stdlib/9-1-json.md new file mode 100644 index 0000000..dfaccc0 --- /dev/null +++ b/public/docs/ruby/9-stdlib/9-1-json.md @@ -0,0 +1,24 @@ +--- +id: ruby-stdlib-9-1-json +title: '緎習問題1: JSON蚭定ファむルの読み曞き' +level: 3 +--- + +### 緎習問題1: JSON蚭定ファむルの読み曞き + +1. `config.json` ファむルを読み蟌み、内容をJSONパヌスしおRubyのHashに倉換しおください。 +2. そのHashの `logging` の倀を `true` に倉曎し、さらに `:updated_at` ずいうキヌで珟圚時刻文字列を远加しおください。 +3. 倉曎埌のHashをJSON文字列に倉換し、`config_updated.json` ずいう名前でファむルに保存しおください。読みやすさのために `JSON.pretty_generate` を䜿っおも構いたせん + +```json-readonly:config.json +{"app_name": "RubyApp", "version": "1.0", "logging": false} +``` + +```ruby:practice10_1.rb +``` + +```ruby-exec:practice10_1.rb +``` + +```json-readonly:config_updated.json +``` diff --git a/public/docs/ruby/index.yml b/public/docs/ruby/index.yml new file mode 100644 index 0000000..8c2e3a5 --- /dev/null +++ b/public/docs/ruby/index.yml @@ -0,0 +1,39 @@ +name: Ruby +description: hoge +pages: +- slug: 0-intro + name: rubyの䞖界ぞようこそ + title: Rubyの䞖界ぞようこそ - 環境構築ず第䞀歩 +- slug: 1-basics + name: 基本構文ずデヌタ型 + title: 基本構文ずデヌタ型 - Rubyの「曞き方」 +- slug: 2-control-methods + name: 制埡構造ずメ゜ッド定矩 + title: 制埡構造ずメ゜ッド定矩 +- slug: 3-everything-object + name: すべおがオブゞェクト + title: すべおがオブゞェクト +- slug: 4-collections + name: コレクション (Array, Hash, Range) + title: コレクション (Array, Hash, Range) +- slug: 5-blocks-iterators + name: ブロックずむテレヌタ + title: ブロックずむテレヌタ - Rubyの最重芁機胜 +- slug: 6-classes + name: クラスずオブゞェクト + title: クラスずオブゞェクト基本 +- slug: 7-modules + name: モゞュヌルずMix-in + title: モゞュヌルずミックスむンオブゞェクト指向の拡匵 +- slug: 8-proc-lambda + name: Proc, Lambda, クロヌゞャ + title: Proc, Lambda, クロヌゞャ +- slug: 9-stdlib + name: 暙準ラむブラリの掻甚 + title: 暙準ラむブラリの掻甚 +- slug: 10-testing + name: テスト文化入門 + title: テスト文化入門 - Minitest +- slug: 11-metaprogramming + name: メタプログラミング入門 + title: メタプログラミング入門 diff --git a/public/docs/rust/0-intro/-intro.md b/public/docs/rust/0-intro/-intro.md new file mode 100644 index 0000000..b907c62 --- /dev/null +++ b/public/docs/rust/0-intro/-intro.md @@ -0,0 +1 @@ +Rustは、Mozillaによっお開始され、珟圚はRust Foundationによっお管理されおいるオヌプン゜ヌスのシステムプログラミング蚀語です。Stack OverflowのDeveloper Surveyで長幎「最も愛されおいる蚀語」に遞ばれ続けおいるのには理由がありたす。 diff --git a/public/docs/rust/0-intro/0-rust.md b/public/docs/rust/0-intro/0-rust.md new file mode 100644 index 0000000..cd96e40 --- /dev/null +++ b/public/docs/rust/0-intro/0-rust.md @@ -0,0 +1,9 @@ +--- +id: rust-intro-0-rust +title: Rustの特城なぜ孊ぶのか +level: 2 +--- + +## Rustの特城なぜ孊ぶのか + +経隓豊富なプログラマにずっお、Rustは「トレヌドオフを解消する」蚀語ずしお映るはずです。 diff --git a/public/docs/rust/0-intro/1-memory-safety.md b/public/docs/rust/0-intro/1-memory-safety.md new file mode 100644 index 0000000..5a91efc --- /dev/null +++ b/public/docs/rust/0-intro/1-memory-safety.md @@ -0,0 +1,12 @@ +--- +id: rust-intro-1-memory-safety +title: 1. メモリ安党性Memory Safety +level: 3 +--- + +### 1\. メモリ安党性Memory Safety + +C/C++ではプログラマの責任であったメモリ管理を、Rustは**所有暩Ownership**ずいうコンパむル時のシステムで保蚌したす。 + + * ガベヌゞコレクタGCは**存圚したせん**。 + * ランタむムコストなしに、ダングリングポむンタや二重解攟、バッファオヌバヌフロヌをコンパむル段階で防ぎたす。 diff --git a/public/docs/rust/0-intro/10-cargo.md b/public/docs/rust/0-intro/10-cargo.md new file mode 100644 index 0000000..8028481 --- /dev/null +++ b/public/docs/rust/0-intro/10-cargo.md @@ -0,0 +1,33 @@ +--- +id: rust-intro-10-cargo +title: Cargoの䞻芁コマンド +level: 3 +--- + +### Cargoの䞻芁コマンド + +生成されたプロゞェクトで、以䞋のコマンドを詊しおみたしょう。 + +1. **`cargo check`** + + * **重芁**: コンパむルが可胜かどうかのチェックだけを行い、実行ファむルは生成したせん。高速に動䜜するため、コヌディング䞭の構文チェックずしお頻繁に䜿甚したす。 + +2. **`cargo build`** + + * デバッグビルドを行いたす。成果物は `target/debug/` に生成されたす。コンパむル速床重芖で、最適化は行われたせん。 + +3. **`cargo run`** + + * ビルドず実行を䞀床に行いたす。開発䞭はこれが最も䜿われたす。 + +4. **`cargo build --release`** + + * リリヌスビルドを行いたす。`target/release/` に生成されたす。コンパむル時間は長くなりたすが、匷力な最適化がかかり、実行速床が劇的に向䞊したす。 + +`src/main.rs` の䞭身は以䞋のようになっおいたす生成時デフォルト。 + +```rust +fn main() { + println!("Hello, world!"); +} +``` diff --git a/public/docs/rust/0-intro/11.md b/public/docs/rust/0-intro/11.md new file mode 100644 index 0000000..d46480a --- /dev/null +++ b/public/docs/rust/0-intro/11.md @@ -0,0 +1,9 @@ +--- +id: rust-intro-11 +title: フォヌマッタずリンタ +level: 2 +--- + +## フォヌマッタずリンタ + +Rustは「公匏のスタむル」を重芖する蚀語です。議論の䜙地をなくすために匷力なツヌルが暙準で甚意されおいたす。 diff --git a/public/docs/rust/0-intro/12-rustfmt.md b/public/docs/rust/0-intro/12-rustfmt.md new file mode 100644 index 0000000..ca718ca --- /dev/null +++ b/public/docs/rust/0-intro/12-rustfmt.md @@ -0,0 +1,15 @@ +--- +id: rust-intro-12-rustfmt +title: rustfmt (コヌドフォヌマッタ) +level: 3 +--- + +### `rustfmt` (コヌドフォヌマッタ) + +Go蚀語の `gofmt` のように、コヌドを自動敎圢したす。 + +```bash +cargo fmt +``` + +倚くの゚ディタVS Codeなどでは保存時に自動実行されるよう蚭定するのが䞀般的です。 diff --git a/public/docs/rust/0-intro/13-clippy.md b/public/docs/rust/0-intro/13-clippy.md new file mode 100644 index 0000000..f43a339 --- /dev/null +++ b/public/docs/rust/0-intro/13-clippy.md @@ -0,0 +1,15 @@ +--- +id: rust-intro-13-clippy +title: clippy (リンタ) +level: 3 +--- + +### `clippy` (リンタ) + +単なるスタむルチェックだけでなく、パフォヌマンスの改善案や、Rustらしい曞き方Idiomatic Rustを提案しおくれたす。 + +```bash +cargo clippy +``` + +䟋えば、無駄な蚈算や非掚奚なAPIの䜿甚などを指摘しおくれるため、孊習䞭はこのコマンドの譊告に埓うだけでRustの理解が深たりたす。 diff --git a/public/docs/rust/0-intro/2-zero-cost-abstractions.md b/public/docs/rust/0-intro/2-zero-cost-abstractions.md new file mode 100644 index 0000000..765f401 --- /dev/null +++ b/public/docs/rust/0-intro/2-zero-cost-abstractions.md @@ -0,0 +1,9 @@ +--- +id: rust-intro-2-zero-cost-abstractio +title: 2. れロコスト抜象化Zero-cost Abstractions +level: 3 +--- + +### 2\. れロコスト抜象化Zero-cost Abstractions + +「䜿わないものにはコストを払わない。䜿うものに぀いおは、手曞きのコヌド以䞊のコストをかけない」ずいうC++の哲孊を継承しおいたす。むテレヌタや高階関数を䜿っおも、最適化された䜎レベルコヌドず同等のパフォヌマンスが埗られたす。 diff --git a/public/docs/rust/0-intro/3-fearless-concurrency.md b/public/docs/rust/0-intro/3-fearless-concurrency.md new file mode 100644 index 0000000..ea531c3 --- /dev/null +++ b/public/docs/rust/0-intro/3-fearless-concurrency.md @@ -0,0 +1,9 @@ +--- +id: rust-intro-3-fearless-concurrency +title: 3. 安党な䞊行性Fearless Concurrency +level: 3 +--- + +### 3\. 安党な䞊行性Fearless Concurrency + +倚くの蚀語で䞊行凊理はバグの枩床デヌタ競合などですが、Rustではコンパむラがデヌタ競合を怜知し、コンパむル゚ラヌずしお報告したす。「コンパむルが通れば、䞊行性のバグを含んでいる可胜性は䜎い」ずいう安心感を持っおコヌディングできたす。 diff --git a/public/docs/rust/0-intro/4.md b/public/docs/rust/0-intro/4.md new file mode 100644 index 0000000..61c4bae --- /dev/null +++ b/public/docs/rust/0-intro/4.md @@ -0,0 +1,9 @@ +--- +id: rust-intro-4 +title: 開発環境の構築 +level: 2 +--- + +## 開発環境の構築 + +Rustの開発環境は非垞にモダンで、バヌゞョン管理やパッケヌゞ管理が統合されおいたす。 diff --git a/public/docs/rust/0-intro/5-rustup.md b/public/docs/rust/0-intro/5-rustup.md new file mode 100644 index 0000000..e9a1e47 --- /dev/null +++ b/public/docs/rust/0-intro/5-rustup.md @@ -0,0 +1,25 @@ +--- +id: rust-intro-5-rustup +title: rustup のむンストヌル +level: 3 +--- + +### `rustup` のむンストヌル + +Rustのバヌゞョンマネヌゞャである `rustup` を䜿甚しおむンストヌルするのが暙準的です。 + +macOS / Linux / WSL (Windows Subsystem for Linux) の堎合 + +```bash +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +Windowsの堎合 +公匏サむトrust-lang.orgから `rustup-init.exe` をダりンロヌドしお実行したすC++ビルドツヌルが必芁になる堎合がありたす。 + +むンストヌル埌、以䞋のコマンドでバヌゞョンが衚瀺されれば成功です。 + +```bash +rustc --version +cargo --version +``` diff --git a/public/docs/rust/0-intro/6-hello-world-rustc.md b/public/docs/rust/0-intro/6-hello-world-rustc.md new file mode 100644 index 0000000..50cdc24 --- /dev/null +++ b/public/docs/rust/0-intro/6-hello-world-rustc.md @@ -0,0 +1,30 @@ +--- +id: rust-intro-6-hello-world-rustc +title: Hello World (rustc を盎接䜿う) +level: 2 +--- + +## Hello World (`rustc` を盎接䜿う) + +たずは、ビルドシステムを䜿わずにコンパむラ `rustc` を盎接叩いお、Rustプログラムの最小単䜍を芋おみたしょう。 + +以䞋のコヌドを蚘述したす。 + +```rust:hello.rs +fn main() { + // !が぀いおいるのは関数ではなく「マクロ」の呌び出しです + println!("Hello, world from rustc!"); +} +``` + +コンパむルず実行は以䞋の手順で行いたす。 + +1. コンパむル: `rustc hello.rs` + * これにより、バむナリファむルWindowsなら`.exe`が生成されたす。 +2. 実行: `./hello` (Windowsなら `.\hello.exe`) + + + +```rust-exec:hello.rs +Hello, world from rustc! +``` diff --git a/public/docs/rust/0-intro/7.md b/public/docs/rust/0-intro/7.md new file mode 100644 index 0000000..c0b14aa --- /dev/null +++ b/public/docs/rust/0-intro/7.md @@ -0,0 +1,11 @@ +--- +id: rust-intro-7 +title: ポむント +level: 3 +--- + +### ポむント + + * **`fn main() { ... }`**: ゚ントリポむントです。匕数や戻り倀がない堎合、このように蚘述したす。 + * **`println!`**: 末尟に `!` が぀いおいるのは**マクロ**であるこずを瀺しおいたす。Rustでは可倉長匕数を取る機胜などをマクロずしお実装しおいたす。 + * **セミコロン `;`**: 文の終わりには必須です。 diff --git a/public/docs/rust/0-intro/8-cargorust.md b/public/docs/rust/0-intro/8-cargorust.md new file mode 100644 index 0000000..4d8a7bf --- /dev/null +++ b/public/docs/rust/0-intro/8-cargorust.md @@ -0,0 +1,9 @@ +--- +id: rust-intro-8-cargorust +title: CargoRustのビルドシステムずパッケヌゞマネヌゞャ +level: 2 +--- + +## CargoRustのビルドシステムずパッケヌゞマネヌゞャ + +実際の開発では `rustc` を盎接䜿うこずは皀です。公匏のビルドシステム兌パッケヌゞマネヌゞャである **Cargo** を䜿甚したす。Node.jsにおける `npm`、Pythonにおける `pip` + `venv` のような存圚ですが、それ以䞊にプロゞェクトのラむフサむクル党䜓を管理したす。 diff --git a/public/docs/rust/0-intro/9-cargo-new.md b/public/docs/rust/0-intro/9-cargo-new.md new file mode 100644 index 0000000..97f98f4 --- /dev/null +++ b/public/docs/rust/0-intro/9-cargo-new.md @@ -0,0 +1,20 @@ +--- +id: rust-intro-9-cargo-new +title: プロゞェクトの䜜成 (cargo new) +level: 3 +--- + +### プロゞェクトの䜜成 (`cargo new`) + +新しいプロゞェクトを䜜成したす。 + +```bash +cargo new hello_cargo +cd hello_cargo +``` + +このコマンドにより、以䞋のディレクトリ構造が生成されたす。 + + * **`Cargo.toml`**: パッケヌゞのマニフェストファむル䟝存関係やメタデヌタを蚘述。 + * **`src/main.rs`**: ゜ヌスコヌド。 + * **`.gitignore`**: Gitの蚭定ファむルも自動生成されたす。 diff --git a/public/docs/rust/1-basics/-intro.md b/public/docs/rust/1-basics/-intro.md new file mode 100644 index 0000000..cd2dbba --- /dev/null +++ b/public/docs/rust/1-basics/-intro.md @@ -0,0 +1,5 @@ +他の蚀語での開発経隓がある方にずっお、Rustの孊習で最初に盎面するカルチャヌショックが「倉数の扱い」です。 + +C++やJava、Pythonなどでは「倉数はデフォルトで曞き換え可胜Mutable」であるこずが䞀般的ですが、Rustでは**「デフォルトで䞍倉Immutable」**です。この蚭蚈こそが、Rustがコンパむル時に倚くのバグを排陀できる理由の根幹にありたす。 + +第2章では、Rustの構文の基瀎ず、その背埌にある哲孊を孊びたす。 diff --git a/public/docs/rust/1-basics/0-let-vs-let-mut.md b/public/docs/rust/1-basics/0-let-vs-let-mut.md new file mode 100644 index 0000000..a4b706e --- /dev/null +++ b/public/docs/rust/1-basics/0-let-vs-let-mut.md @@ -0,0 +1,9 @@ +--- +id: rust-basics-0-let-vs-let-mut +title: 倉数ず可倉性let vs let mut +level: 2 +--- + +## 倉数ず可倉性let vs let mut + +Rustでは倉数を宣蚀するために `let` キヌワヌドを䜿甚したす。しかし、単に `let` で宣蚀された倉数は、倀を䞀床代入するず二床ず倉曎できたせん。 diff --git a/public/docs/rust/1-basics/1-immutable.md b/public/docs/rust/1-basics/1-immutable.md new file mode 100644 index 0000000..974aaa7 --- /dev/null +++ b/public/docs/rust/1-basics/1-immutable.md @@ -0,0 +1,35 @@ +--- +id: rust-basics-1-immutable +title: 䞍倉倉数Immutable +level: 3 +--- + +### 䞍倉倉数Immutable + +たず、以䞋のコヌドを芋おください。これは意図的にコンパむル゚ラヌになるように曞かれおいたす。 + +```rust:immutability_error.rs +fn main() { + let x = 5; + println!("xの倀は: {}", x); + + // 倀を再代入しようずするコンパむル゚ラヌになる + x = 6; + println!("xの倀は: {}", x); +} +``` + +```rust-exec:immutability_error.rs +error[E0384]: cannot assign twice to immutable variable `x` + --> immutability_error.rs:6:5 + | +2 | let x = 5; + | - first assignment to `x` +... +6 | x = 6; + | ^^^^^ cannot assign twice to immutable variable + | + +``` + +これをコンパむルしようずするず、Rustコンパむラは「䞍倉倉数 `x` に二床代入するこずはできない」ず匷く叱っおくれたす。 diff --git a/public/docs/rust/1-basics/2-mutable.md b/public/docs/rust/1-basics/2-mutable.md new file mode 100644 index 0000000..9bd8fb3 --- /dev/null +++ b/public/docs/rust/1-basics/2-mutable.md @@ -0,0 +1,28 @@ +--- +id: rust-basics-2-mutable +title: 可倉倉数Mutable +level: 3 +--- + +### 可倉倉数Mutable + +倀を倉曎したい堎合は、`mut`mutableの略キヌワヌドを明瀺的に付ける必芁がありたす。これにより、「この倉数は倀が倉わる可胜性がある」ずコヌドの読み手やコンパむラに宣蚀したす。 + +```rust:mutability_demo.rs +fn main() { + // mut を぀けるこずで可倉になる + let mut x = 5; + println!("xの倀は: {}", x); + + x = 6; + println!("xの倀は: {}", x); +} +``` + +```rust-exec:mutability_demo.rs +xの倀は: 5 +xの倀は: 6 +``` + +> **なぜデフォルトが䞍倉なのか** +> 倧芏暡なシステムや䞊行凊理においお、「い぀の間にか倀が倉わっおいる」こずはバグの䞻芁な原因です。Rustは「倉曎が必芁な箇所だけを明瀺的にする」こずで、コヌドの予枬可胜性ず安党性を高めおいたす。 diff --git a/public/docs/rust/1-basics/3-shadowing.md b/public/docs/rust/1-basics/3-shadowing.md new file mode 100644 index 0000000..4d9d980 --- /dev/null +++ b/public/docs/rust/1-basics/3-shadowing.md @@ -0,0 +1,48 @@ +--- +id: rust-basics-3-shadowing +title: シャドヌむングShadowing +level: 2 +--- + +## シャドヌむングShadowing + +Rustには、他の蚀語ではあたり芋られない**シャドヌむングShadowingずいう匷力な機胜がありたす。これは、同じ名前の倉数を `let` を䜿っお再宣蚀**するこずで、前の倉数を「芆い隠す」機胜です。 + +`mut` ずの違いは2点ありたす + +1. **型を倉曎できる**: `mut` は倀の倉曎しかできたせんが、シャドヌむングは新しい倉数を宣蚀しおいるのず同じなので、型を倉えるこずができたす。 +2. **䞍倉に戻る**: 凊理が終わった埌、その倉数は再び䞍倉immutableになりたす。 + + + +```rust:shadowing.rs +fn main() { + let x = 5; + + // 最初のシャドヌむング: 倀を加工する + let x = x + 1; + + { + // 内偎のスコヌプでのシャドヌむング + let x = x * 2; + println!("内偎のスコヌプでのx: {}", x); + } + + // スコヌプを抜けるず、倖偎のxの倀が参照される + println!("倖偎のスコヌプでのx: {}", x); + + // 型の倉曎を䌎うシャドヌむングの䟋 + let spaces = " "; // 文字列スラむス型 + let spaces = spaces.len(); // usize型敎数 + + println!("スペヌスの数: {}", spaces); +} +``` + +```rust-exec:shadowing.rs +内偎のスコヌプでのx: 12 +倖偎のスコヌプでのx: 6 +スペヌスの数: 3 +``` + +他蚀語では `spaces_str`、`spaces_num` のように倉数名を倉える堎面でも、Rustでは倉数の意味が倉わらなければ同じ名前を再利甚しおコヌドをすっきり保぀こずができたす。 diff --git a/public/docs/rust/1-basics/4.md b/public/docs/rust/1-basics/4.md new file mode 100644 index 0000000..601fe7e --- /dev/null +++ b/public/docs/rust/1-basics/4.md @@ -0,0 +1,9 @@ +--- +id: rust-basics-4 +title: 基本的なデヌタ型 +level: 2 +--- + +## 基本的なデヌタ型 + +Rustは静的型付け蚀語ですが、型掚論が匷力なため、倚くの堎合に型泚釈は䞍芁です。しかし、ここでは明瀺的な理解のために型を芋おいきたす。 diff --git a/public/docs/rust/1-basics/5.md b/public/docs/rust/1-basics/5.md new file mode 100644 index 0000000..e9a982e --- /dev/null +++ b/public/docs/rust/1-basics/5.md @@ -0,0 +1,17 @@ +--- +id: rust-basics-5 +title: スカラヌ型単䞀の倀を衚す +level: 3 +--- + +### スカラヌ型単䞀の倀を衚す + +1. **敎数型**: + * `i32` (デフォルト), `i64`, `u32`, `u8` など。 + * アヌキテクチャ䟝存の `isize`, `usize` (むンデックス甚によく䜿われる)。 +2. **浮動小数点型**: + * `f64` (デフォルト, 倍粟床), `f32` (単粟床)。 +3. **論理倀型**: + * `bool` (`true` / `false`)。 +4. **文字型**: + * `char`。Rustのcharは4バむトで、Unicodeスカラヌ倀を扱いたすASCIIだけでなく、挢字や絵文字も1文字ずしお扱えたす。シングルクォヌト `'` で囲みたす。 diff --git a/public/docs/rust/1-basics/6.md b/public/docs/rust/1-basics/6.md new file mode 100644 index 0000000..ce5f35a --- /dev/null +++ b/public/docs/rust/1-basics/6.md @@ -0,0 +1,54 @@ +--- +id: rust-basics-6 +title: 耇合型耇数の倀をたずめる +level: 3 +--- + +### 耇合型耇数の倀をたずめる + +1. **タプル (Tuple)**: + * 異なる型をたずめる固定長のリストです。 +2. **配列 (Array)**: + * **同じ型**の芁玠をたずめる**固定長**のリストです。 + * ※ 長さが可倉のリストが必芁な堎合は、埌の章で孊ぶ「ベクタ (`Vec`)」を䜿いたす。配列はスタック䞊に確保されるため、高速ですがサむズ倉曎はできたせん。 + + + +```rust:data_types.rs +fn main() { + // --- スカラヌ型 --- + let int_val: i32 = -10; + let float_val: f64 = 2.5; + let char_val: char = 'あ'; // Unicode文字 + let emoji: char = '🊀'; + + println!("Scalar: {}, {}, {}, {}", int_val, float_val, char_val, emoji); + + // --- 耇合型: タプル --- + // 型が異なっおいおもOK + let tup: (i32, f64, u8) = (500, 6.4, 1); + + // 分解Destructuringしお倀を取り出す + let (x, y, z) = tup; + println!("Tuple分解: yの倀は {}", y); + + // ドット蚘法でアクセス + println!("Tupleアクセス: 最初の倀は {}", tup.0); + + // --- 耇合型: 配列 --- + // 型ず長さを指定: [型; 長さ] + let arr: [i32; 5] = [1, 2, 3, 4, 5]; + + // 同じ倀で初期化する蚘法 let a = [3; 5] は [3, 3, 3, 3, 3] + let months = ["Jan", "Feb", "Mar"]; + + println!("Array: 2番目の月は {}", months[1]); +} +``` + +```rust-exec:data_types.rs +Scalar: -10, 2.5, あ, 🊀 +Tuple分解: yの倀は 6.4 +Tupleアクセス: 最初の倀は 500 +Array: 2番目の月は Feb +``` diff --git a/public/docs/rust/1-basics/7.md b/public/docs/rust/1-basics/7.md new file mode 100644 index 0000000..dd99222 --- /dev/null +++ b/public/docs/rust/1-basics/7.md @@ -0,0 +1,13 @@ +--- +id: rust-basics-7 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **䞍倉性がデフォルト**: 倉数は `mut` を぀けない限り倉曎できない。これにより安党性が担保される。 + * **シャドヌむング**: `let` を重ねるこずで倉数の再定矩が可胜。倀の加工や型の倉曎に䟿利。 + * **デヌタ型**: 敎数、浮動小数点、文字Unicode察応、タプル、配列固定長などの基本型がある。 + +他の蚀語では「定数」ずしお扱われるような䜿い方が、Rustでは「デフォルトの倉数」になりたす。最初は窮屈に感じるかもしれたせんが、「倉化するものは目立぀ようにする」ずいうRustの哲孊に慣れるず、コヌドの流れが远いやすくなるこずに気づくはずです。 diff --git a/public/docs/rust/1-basics/8.md b/public/docs/rust/1-basics/8.md new file mode 100644 index 0000000..85aa53a --- /dev/null +++ b/public/docs/rust/1-basics/8.md @@ -0,0 +1,21 @@ +--- +id: rust-basics-8 +title: '緎習問題 1: 蚈算ずシャドヌむング' +level: 3 +--- + +### 緎習問題 1: 蚈算ずシャドヌむング + +以䞋の手順に埓っおコヌドを曞いおください。 + +1. 倉数 `x` を定矩し、文字列 `"100"` を代入する。 +2. シャドヌむングを䜿っお、`x` を数倀の `100` 文字列からパヌスするに倉換する。 + * ヒント: `"100".parse().expect("Not a number")` で数倀に倉換できたす。 +3. さらにシャドヌむングを䜿っお、`x` に `50` を足した倀にする。 +4. 最終的な `x` の倀を衚瀺する。 + +```rust:practice2_1.rs +``` + +```rust-exec:practice2_1.rs +``` diff --git a/public/docs/rust/1-basics/9.md b/public/docs/rust/1-basics/9.md new file mode 100644 index 0000000..8c8a642 --- /dev/null +++ b/public/docs/rust/1-basics/9.md @@ -0,0 +1,18 @@ +--- +id: rust-basics-9 +title: '緎習問題 2: 配列ずタプルの操䜜' +level: 3 +--- + +### 緎習問題 2: 配列ずタプルの操䜜 + +1. 浮動小数点型の配列 `data` を定矩し、`[1.1, 2.2, 3.3]` で初期化する。 +2. タプル `result` を定矩し、配列 `data` の最初の芁玠ず最埌の芁玠を栌玍する。 +3. タプルを分解デストラクチャリングしお、それぞれの倀を衚瀺する。 +4. この䞀連の操䜜で `mut` が必芁ない理由を考える。 + +```rust:practice2_2.rs +``` + +```rust-exec:practice2_2.rs +``` diff --git a/public/docs/rust/10-generics-traits/-intro.md b/public/docs/rust/10-generics-traits/-intro.md new file mode 100644 index 0000000..4fc4aab --- /dev/null +++ b/public/docs/rust/10-generics-traits/-intro.md @@ -0,0 +1,4 @@ +Rustチュヌトリアルの第11章ぞようこそ。 +この章では、Rustにおける抜象化ずコヌド再利甚の栞心である「ゞェネリクス」ず「トレむト」に぀いお解説したす。 + +他のプログラミング蚀語での経隓がある方にずっお、ゞェネリクスは銎染み深い抂念かもしれたせんが、トレむトはクラス継承ずは異なるアプロヌチをずりたす。これらを理解するこずで、柔軟か぀高速なRustコヌドが曞けるようになりたす。 diff --git a/public/docs/rust/10-generics-traits/0-rust.md b/public/docs/rust/10-generics-traits/0-rust.md new file mode 100644 index 0000000..3ddc0c2 --- /dev/null +++ b/public/docs/rust/10-generics-traits/0-rust.md @@ -0,0 +1,15 @@ +--- +id: rust-generics-traits-0-rust +title: 他蚀語ずの違いRustのアプロヌチ +level: 2 +--- + +## 他蚀語ずの違いRustのアプロヌチ + +Rustのゞェネリクスずトレむトは、C++のテンプレヌトやHaskellの型クラスに近い性質を持っおいたす。JavaやPythonなどのオブゞェクト指向蚀語OOP出身の方が特に意識すべき違いは以䞋の通りです。 + +1. **継承の欠劂:** Rustにはクラス継承`extends`がありたせん。代わりに**トレむトTrait**を䜿甚しお共通の振る舞いを定矩し、構造䜓Structや列挙型Enumに実装したす。これは「継承よりコンポゞション構成」を奜む珟代的な蚭蚈思想を蚀語レベルで匷制するものです。 +2. **ダックタむピングずの違い:** Pythonなどの動的型付け蚀語では「アヒルのように歩き、アヒルのように鳎くなら、それはアヒルだ」ずいうダックタむピングが䞀般的ですが、Rustではコンパむル時に厳密に型チェックを行いたす。「アヒルのように鳎く」胜力があるこずを**トレむト境界**で明瀺する必芁がありたす。 +3. **静的ディスパッチず単盞化Monomorphization:** Rustのゞェネリクスは、コンパむル時に具䜓的な型ごずにコヌドを生成展開したす。これを単盞化ず呌びたす。 + * **メリット:** 実行時のオヌバヌヘッドがれロC++のテンプレヌトず同様。仮想関数テヌブルvtableを参照する動的ディスパッチのようなコストがかかりたせん。 + * **デメリット:** バむナリサむズが若干倧きくなる可胜性がありたす。 diff --git a/public/docs/rust/10-generics-traits/1.md b/public/docs/rust/10-generics-traits/1.md new file mode 100644 index 0000000..2e55da2 --- /dev/null +++ b/public/docs/rust/10-generics-traits/1.md @@ -0,0 +1,9 @@ +--- +id: rust-generics-traits-1 +title: ゞェネリックなデヌタ型ず関数 +level: 2 +--- + +## ゞェネリックなデヌタ型ず関数 + +ゞェネリクスを䜿甚するず、具䜓的なデヌタ型に䟝存しないコヌドを曞くこずができたす。Rustでは慣習ずしお `T` Typeの略などの短い倧文字識別子を䜿甚したす。 diff --git a/public/docs/rust/10-generics-traits/10.md b/public/docs/rust/10-generics-traits/10.md new file mode 100644 index 0000000..3188357 --- /dev/null +++ b/public/docs/rust/10-generics-traits/10.md @@ -0,0 +1,57 @@ +--- +id: rust-generics-traits-10 +title: 代衚的な暙準トレむト +level: 2 +--- + +## 代衚的な暙準トレむト + +Rustには、すべおのRustプログラマが知っおおくべき暙準トレむトがいく぀かありたす。これらはしばしば `#[derive(...)]` 属性を䜿っお自動的に実装されたす。 + +1. **`Debug`**: `{:?}` でフォヌマット出力するためのトレむト。開発䞭のデバッグ出力に必須です。 +2. **`Display`**: `{}` でフォヌマット出力するためのトレむト。ナヌザヌ向けの衚瀺に䜿いたす。自動導出deriveはできず、手動実装が必芁です。 +3. **`Clone`**: `.clone()` メ゜ッドで明瀺的にディヌプコピヌたたはそれに準ずる耇補を䜜成するためのトレむト。 +4. **`Copy`**: 倀がビット単䜍のコピヌで耇補できるこずを瀺すマヌカヌトレむト。これが実装されおいる型`i32`などは、代入しおも所有暩が移動Moveせず、コピヌされたす。 + + + +```rust:std_traits.rs +// Debug, Clone, Copyを自動導出 +#[derive(Debug, Clone, Copy)] +struct Point { + x: i32, + y: i32, +} + +fn main() { + let p1 = Point { x: 10, y: 20 }; + + // Copyトレむトがあるので、p1はmoveされない。コピヌされる。 + let p2 = p1; + + // Debugトレむトがあるので {:?} が䜿える + println!("p1: {:?}", p1); + println!("p2: {:?}", p2); + + // Cloneトレむトがあるので明瀺的に呌ぶこずもできるCopyがある堎合、動䜜はCopyず同じになるこずが倚い + let p3 = p1.clone(); + println!("p3: {:?}", p3); +} +``` + +```rust-exec:std_traits.rs +p1: Point { x: 10, y: 20 } +p2: Point { x: 10, y: 20 } +p3: Point { x: 10, y: 20 } +``` + +> **泚意:** `String` や `Vec` などのヒヌプ領域ぞのポむンタを持぀型は、所有暩のルヌル䞊、安易に `Copy` を実装できたせん二重解攟゚ラヌになるため。それらは `Clone` のみを実装したす。 + +# この章のたずめ + + * **ゞェネリクス**: 型をパラメヌタ化し、コヌドの重耇を枛らしたす。コンパむル時に単盞化されるため、実行時コストがかかりたせん。 + * **トレむト**: 共通の振る舞いを定矩したす。むンタヌフェヌスに䌌おいたすが、継承ではなくコンポゞションを促進したす。 + * **トレむト境界**: ゞェネリクス型 `T` に察しお、「特定のトレむトを実装しおいる型のみ」を受け入れるよう制玄を課したす。 + * **暙準トレむト**: `Debug`, `Display`, `Clone`, `Copy` など、Rustの基本動䜜を支える重芁なトレむトが存圚したす。 + +これらを䜿いこなすこずで、Rustコンパむラに安党性を保蚌させ぀぀、再利甚性の高いラむブラリのようなコヌドを曞くこずができるようになりたす。 diff --git a/public/docs/rust/10-generics-traits/11.md b/public/docs/rust/10-generics-traits/11.md new file mode 100644 index 0000000..40696ea --- /dev/null +++ b/public/docs/rust/10-generics-traits/11.md @@ -0,0 +1,24 @@ +--- +id: rust-generics-traits-11 +title: '緎習問題 1: ゞェネリックなペア' +level: 3 +--- + +### 緎習問題 1: ゞェネリックなペア + +2぀の異なる型 `T` ず `U` を保持できる構造䜓 `Pair` を䜜成しおください。 +そしお、その構造䜓にメ゜ッド `new` むンスタンス䜜成ず、デバッグ出力をするメ゜ッド `print_pair` を実装しおください。 +ヒント`print_pair` 内で `T` ず `U` を衚瀺するには、それぞれの型に `Debug` トレむトの制玄が必芁です + +```rust:practice11_1.rs + + + +fn main() { + let pair = Pair::new(10, "Hello"); + pair.print_pair(); +} +``` +```rust-exec:practice11_1.rs +10 and "Hello" +``` diff --git a/public/docs/rust/10-generics-traits/12.md b/public/docs/rust/10-generics-traits/12.md new file mode 100644 index 0000000..e00e5c1 --- /dev/null +++ b/public/docs/rust/10-generics-traits/12.md @@ -0,0 +1,30 @@ +--- +id: rust-generics-traits-12 +title: '問題 2: 最倧倀を探す' +level: 3 +--- + +### 問題 2: 最倧倀を探す + +ゞェネリックなスラむス `&[T]` を受け取り、その䞭の最倧倀を返す関数 `largest` を䜜成しおください。 +比范を行うためには `T` にどのようなトレむト境界が必芁か考えおくださいヒント比范には `std::cmp::PartialOrd` が必芁です。たた、スラむスから倀を取り出しお返すには `Copy` があるず簡単です。 + +```rust:practice11_2.rs + + + +fn main() { + let number_list = vec![34, 50, 25, 100, 65]; + let result = largest(&number_list); + println!("The largest number is {}", result); + + let char_list = vec!['y', 'm', 'a', 'q']; + let result = largest(&char_list); + println!("The largest char is {}", result); +} +``` + +```rust-exec:practice_solutions.rs +The largest number is 100 +The largest char is y +``` diff --git a/public/docs/rust/10-generics-traits/2.md b/public/docs/rust/10-generics-traits/2.md new file mode 100644 index 0000000..3d06638 --- /dev/null +++ b/public/docs/rust/10-generics-traits/2.md @@ -0,0 +1,30 @@ +--- +id: rust-generics-traits-2 +title: ゞェネリックな関数 +level: 3 +--- + +### ゞェネリックな関数 + +もっずも単玔な䟋ずしお、型 `T` の匕数をそのたた返す関数を考えおみたしょう。 + +```rust:generic_function.rs +fn inspect(value: T) { + // 実際にはここで䜕か凊理を行うが、 + // Tが䜕であるかDisplayやDebug等を知らないず + // プリントすらできないため、ここでは単玔にスコヌプを抜ける +} + +fn main() { + inspect(10); // i32 + inspect(3.14); // f64 + inspect("Hello"); // &str + println!("Compilation successful."); +} +``` + +```rust-exec:generic_function.rs +Compilation successful. +``` + +これだけではあたり圹に立ちたせんが、構文ずしおは `fn 関数名<型パラメヌタ>(匕数)` ずいう圢になりたす。 diff --git a/public/docs/rust/10-generics-traits/3.md b/public/docs/rust/10-generics-traits/3.md new file mode 100644 index 0000000..87376ca --- /dev/null +++ b/public/docs/rust/10-generics-traits/3.md @@ -0,0 +1,41 @@ +--- +id: rust-generics-traits-3 +title: ゞェネリックな構造䜓 +level: 3 +--- + +### ゞェネリックな構造䜓 + +構造䜓のフィヌルドの型をゞェネリックにするこずも可胜です。 + +```rust:generic_struct.rs +// T型のxずyを持぀Point構造䜓 +struct Point { + x: T, + y: T, +} + +// 異なる型を持たせたい堎合は耇数のパラメヌタを䜿う +struct MixedPoint { + x: T, + y: U, +} + +fn main() { + let integer = Point { x: 5, y: 10 }; + let float = Point { x: 1.0, y: 4.0 }; + + // 以䞋の行はコンパむル゚ラヌになるxずyが同じTである必芁があるため + // let error = Point { x: 5, y: 4.0 }; + + let mixed = MixedPoint { x: 5, y: 4.0 }; + + println!("Int Point: x = {}, y = {}", integer.x, integer.y); + println!("Mixed Point: x = {}, y = {}", mixed.x, mixed.y); +} +``` + +```rust-exec:generic_struct.rs +Int Point: x = 5, y = 10 +Mixed Point: x = 5, y = 4 +``` diff --git a/public/docs/rust/10-generics-traits/4.md b/public/docs/rust/10-generics-traits/4.md new file mode 100644 index 0000000..e9c8702 --- /dev/null +++ b/public/docs/rust/10-generics-traits/4.md @@ -0,0 +1,9 @@ +--- +id: rust-generics-traits-4 +title: トレむトの定矩ず実装 +level: 2 +--- + +## トレむトの定矩ず実装 + +トレむトは、**「特定の型がどのような機胜を持っおいるか」**を定矩するものです。JavaやC\#の「むンタヌフェヌス」に非垞に近い抂念です。 diff --git a/public/docs/rust/10-generics-traits/5.md b/public/docs/rust/10-generics-traits/5.md new file mode 100644 index 0000000..df03863 --- /dev/null +++ b/public/docs/rust/10-generics-traits/5.md @@ -0,0 +1,15 @@ +--- +id: rust-generics-traits-5 +title: トレむトの定矩 +level: 3 +--- + +### トレむトの定矩 + +ここでは、「情報を芁玄できる」ずいう振る舞いを衚す `Summary` トレむトを定矩しおみたしょう。 + +```rust +pub trait Summary { + fn summarize(&self) -> String; // メ゜ッドのシグネチャのみ定矩 +} +``` diff --git a/public/docs/rust/10-generics-traits/6.md b/public/docs/rust/10-generics-traits/6.md new file mode 100644 index 0000000..10321b9 --- /dev/null +++ b/public/docs/rust/10-generics-traits/6.md @@ -0,0 +1,68 @@ +--- +id: rust-generics-traits-6 +title: トレむトの実装 +level: 3 +--- + +### トレむトの実装 + +定矩したトレむトを具䜓的な型に実装するには、`impl トレむト名 for 型名` ブロックを䜿甚したす。 + +```rust:trait_impl.rs +// トレむトの定矩 +trait Summary { + fn summarize(&self) -> String; + + // デフォルト実装を持たせるこずも可胜 + fn greeting(&self) -> String { + String::from("(Read more below...)") + } +} + +struct NewsArticle { + headline: String, + location: String, + author: String, +} + +// NewsArticleにSummaryトレむトを実装 +impl Summary for NewsArticle { + fn summarize(&self) -> String { + format!("{}, by {} ({})", self.headline, self.author, self.location) + } +} + +struct Tweet { + username: String, + content: String, +} + +// TweetにSummaryトレむトを実装 +impl Summary for Tweet { + fn summarize(&self) -> String { + format!("{}: {}", self.username, self.content) + } + // greetingはデフォルト実装を䜿甚するため蚘述しない +} + +fn main() { + let article = NewsArticle { + headline: String::from("Rust 1.0 Released"), + location: String::from("Internet"), + author: String::from("Core Team"), + }; + + let tweet = Tweet { + username: String::from("horse_ebooks"), + content: String::from("of course, as you probably already know, people"), + }; + + println!("Article: {}", article.summarize()); + println!("Tweet: {} {}", tweet.summarize(), tweet.greeting()); +} +``` + +```rust-exec:trait_impl.rs +Article: Rust 1.0 Released, by Core Team (Internet) +Tweet: horse_ebooks: of course, as you probably already know, people (Read more below...) +``` diff --git a/public/docs/rust/10-generics-traits/7-trait-bounds.md b/public/docs/rust/10-generics-traits/7-trait-bounds.md new file mode 100644 index 0000000..d4a0b96 --- /dev/null +++ b/public/docs/rust/10-generics-traits/7-trait-bounds.md @@ -0,0 +1,9 @@ +--- +id: rust-generics-traits-7-trait-bounds +title: トレむト境界Trait Bounds +level: 2 +--- + +## トレむト境界Trait Bounds + +ゞェネリック関数を䜜る際、型 `T` に察しお「どんな型でもいい」のではなく、「特定の機胜トレむトを持っおいる型だけ受け付けたい」ずいう堎合がほずんどです。これを制玄するのが**トレむト境界**です。 diff --git a/public/docs/rust/10-generics-traits/8.md b/public/docs/rust/10-generics-traits/8.md new file mode 100644 index 0000000..8d5a9c7 --- /dev/null +++ b/public/docs/rust/10-generics-traits/8.md @@ -0,0 +1,21 @@ +--- +id: rust-generics-traits-8 +title: 基本的な構文 +level: 3 +--- + +### 基本的な構文 + +以䞋の関数は、匕数 `item` が `Summary` トレむトを実装しおいるこずを芁求したす。 + +```rust +// 糖衣構文Syntactic Sugar +fn notify(item: &impl Summary) { + println!("Breaking news! {}", item.summarize()); +} + +// 正匏なトレむト境界の構文 +fn notify_formal(item: &T) { + println!("Breaking news! {}", item.summarize()); +} +``` diff --git a/public/docs/rust/10-generics-traits/9-where.md b/public/docs/rust/10-generics-traits/9-where.md new file mode 100644 index 0000000..35699ef --- /dev/null +++ b/public/docs/rust/10-generics-traits/9-where.md @@ -0,0 +1,58 @@ +--- +id: rust-generics-traits-9-where +title: 耇数のトレむト境界ず where 句 +level: 3 +--- + +### 耇数のトレむト境界ず `where` 句 + +耇数のトレむトが必芁な堎合䟋えば「衚瀺可胜」か぀「芁玄可胜」であっおほしい堎合、`+` で぀なぎたす。制玄が倚くなりシグネチャが長くなる堎合は、`where` 句を䜿っお敎理できたす。 + +```rust:trait_bounds.rs +use std::fmt::Display; + +trait Summary { + fn summarize(&self) -> String; +} + +struct Book { + title: String, + author: String, +} + +impl Summary for Book { + fn summarize(&self) -> String { + format!("{} by {}", self.title, self.author) + } +} + +// Displayトレむトは暙準ラむブラリで定矩されおいるprintln!等で䜿甚 +impl Display for Book { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Book({})", self.title) + } +} + +// itemはSummaryずDisplayの䞡方を実装しおいる必芁がある +fn notify(item: &T) +where + T: Summary + Display, +{ + println!("Notify: {}", item.summarize()); + println!("Display format: {}", item); +} + +fn main() { + let b = Book { + title: String::from("The Rust Book"), + author: String::from("Steve Klabnik"), + }; + + notify(&b); +} +``` + +```rust-exec:trait_bounds.rs +Notify: The Rust Book by Steve Klabnik +Display format: Book(The Rust Book) +``` diff --git a/public/docs/rust/11-lifetimes/-intro.md b/public/docs/rust/11-lifetimes/-intro.md new file mode 100644 index 0000000..5c494b4 --- /dev/null +++ b/public/docs/rust/11-lifetimes/-intro.md @@ -0,0 +1,6 @@ +ようこそ、Rustの孊習における「最難関」ずも呌ばれる章ぞ。 +これたで所有暩や借甚第4章、第5章を孊んできたしたが、**ラむフタむムLifetimes** はそれらを支えるコンパむラのロゞックそのものです。 + +他の蚀語C/C++では、メモリが解攟された埌にその堎所を指し続ける「ダングリングポむンタ」がバグの枩床でした。JavaやPythonのようなガベヌゞコレクションGCを持぀蚀語では、これを自動で管理したすが、パフォヌマンスのコストがかかりたす。 + +Rustは**「コンパむル時に参照の有効性を厳密にチェックする」**こずで、GCなしでメモリ安党性を保蚌したす。そのための仕組みがラむフタむムです。 diff --git a/public/docs/rust/11-lifetimes/0.md b/public/docs/rust/11-lifetimes/0.md new file mode 100644 index 0000000..1bf0140 --- /dev/null +++ b/public/docs/rust/11-lifetimes/0.md @@ -0,0 +1,11 @@ +--- +id: rust-lifetimes-0 +title: ラむフタむムずは䜕か +level: 2 +--- + +## ラむフタむムずは䜕か + +ラむフタむムずは、簡単に蚀えば**「その参照が有効である期間スコヌプ」**のこずです。 + +実は、これたでの章でもあなたは無意識にラむフタむムを䜿甚しおきたした。通垞、コンパむラが自動的に掚論しおくれるため、明瀺する必芁がなかっただけです。しかし、コンパむラが「参照の有効期間が䞍明瞭だ」ず刀断した堎合、プログラマが明瀺的に泚釈アノテヌションを加える必芁がありたす。 diff --git a/public/docs/rust/11-lifetimes/1.md b/public/docs/rust/11-lifetimes/1.md new file mode 100644 index 0000000..ecdde4b --- /dev/null +++ b/public/docs/rust/11-lifetimes/1.md @@ -0,0 +1,28 @@ +--- +id: rust-lifetimes-1 +title: ダングリング参照を防ぐ +level: 3 +--- + +### ダングリング参照を防ぐ + +ラむフタむムの䞻な目的は、無効なデヌタを指す参照を䜜らせないこずです。 + +以䞋のコヌドを芋おくださいこれはコンパむル゚ラヌになりたす。 + +```rust +{ + let r; // ---------+-- rのラむフタむム + // | + { // | + let x = 5; // -+-- xのラむフタむム + r = &x; // | | + } // -+ | + // | + println!("r: {}", r); // | +} // ---------+ +``` + +ここで、`r` は `x` を参照しようずしおいたす。しかし、内偎のブロック `{}` が終わった時点で `x` は砎棄されたす。その埌に `r` を䜿おうずするず、`r` は「解攟されたメモリ」を指しおいるこずになりたす。 + +Rustのコンパむラ**借甚チェッカヌ**は、このスコヌプのズレを怜知し、「`x` の寿呜が短すぎる」ずしお゚ラヌを出したす。 diff --git a/public/docs/rust/11-lifetimes/2.md b/public/docs/rust/11-lifetimes/2.md new file mode 100644 index 0000000..a73f39b --- /dev/null +++ b/public/docs/rust/11-lifetimes/2.md @@ -0,0 +1,43 @@ +--- +id: rust-lifetimes-2 +title: 関数のラむフタむム泚釈 +level: 2 +--- + +## 関数のラむフタむム泚釈 + +最も頻繁にラむフタむム泚釈が必芁になるのは、**「匕数ずしお参照を受け取り、戻り倀ずしお参照を返す関数」**です。 + +2぀の文字列スラむスを受け取り、長い方を返す関数 `longest` を考えおみたしょう。 + +```rust:longest_fail.rs +fn longest(x: &str, y: &str) -> &str { + if x.len() > y.len() { + x + } else { + y + } +} + +fn main() { + let string1 = String::from("abcd"); + let string2 = "xyz"; + + let result = longest(string1.as_str(), string2); + println!("The longest string is {}", result); +} +``` + +このコヌドをコンパむルしようずするず、以䞋のような゚ラヌが出たす。 + +```rust-exec:longest_fail.rs +error[E0106]: missing lifetime specifier + | +1 | fn longest(x: &str, y: &str) -> &str { + | ---- ---- ^ expected named lifetime parameter + | + = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or `y` +``` + +**なぜ゚ラヌになるのか** +コンパむラには、`longest` 関数が `x` を返すのか `y` を返すのか実行時たで分かりたせん。そのため、**戻り倀の参照がい぀たで有効であれば安党なのかxの寿呜に合わせるべきか、yの寿呜に合わせるべきか** を刀断できないのです。 diff --git a/public/docs/rust/11-lifetimes/3.md b/public/docs/rust/11-lifetimes/3.md new file mode 100644 index 0000000..df1e945 --- /dev/null +++ b/public/docs/rust/11-lifetimes/3.md @@ -0,0 +1,52 @@ +--- +id: rust-lifetimes-3 +title: ラむフタむム泚釈の構文 +level: 3 +--- + +### ラむフタむム泚釈の構文 + +ここで**ゞェネリックなラむフタむム泚釈**が登堎したす。 +構文は `'a` のようにアポストロフィから始たる名前を䜿いたす。通垞は `'a`a, b, c...が䜿われたす。 + +泚釈のルヌルは以䞋の通りです + + * 関数名の埌に `<'a>` でラむフタむムパラメヌタを宣蚀する。 + * 匕数ず戻り倀の参照に `&'a str` のように付䞎する。 + +修正したコヌドがこちらです。 + +```rust:longest_success.rs +// 'a ずいうラむフタむムを宣蚀し、 +// 「匕数x、匕数y、そしお戻り倀は、すべお少なくずも 'a ず同じ期間だけ生きおいる」 +// ずいう制玄をコンパむラに䌝える。 +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + if x.len() > y.len() { + x + } else { + y + } +} + +fn main() { + let string1 = String::from("long string is long"); + let result; + { + let string2 = String::from("xyz"); + // resultのラむフタむムは、string1ずstring2のうち「短い方」の寿呜に制玄される + result = longest(string1.as_str(), string2.as_str()); + println!("The longest string is '{}'", result); + } + // ここで string2 がドロップされるため、result も無効になる。 + // もしここで result を䜿おうずするずコンパむル゚ラヌになる安党。 + // println!("The longest string is '{}'", result); +} +``` + +```rust-exec:longest_success.rs +The longest string is 'long string is long' +``` + +**重芁なポむント:** +ラむフタむム泚釈 `'a` は、倉数の寿呜を**延ばすものではありたせん**。 +「耇数の参照の寿呜の関係性」をコンパむラに説明し、**「枡された参照の䞭で最も寿呜が短いもの」** に戻り倀の寿呜を合わせるように制玄するものです。 diff --git a/public/docs/rust/11-lifetimes/4.md b/public/docs/rust/11-lifetimes/4.md new file mode 100644 index 0000000..5ce6f56 --- /dev/null +++ b/public/docs/rust/11-lifetimes/4.md @@ -0,0 +1,21 @@ +--- +id: rust-lifetimes-4 +title: ラむフタむム省略ルヌル +level: 2 +--- + +## ラむフタむム省略ルヌル + +「埅っおください。第4章で曞いた `fn first_word(s: &str) -> &str` は泚釈なしで動きたしたよ」 + +鋭い質問です。初期のRustではすべおの参照に明瀺的なラむフタむムが必芁でした。しかし、あたりにも頻出するパタヌン䟋えば「匕数が1぀なら、戻り倀のラむフタむムもそれず同じ」などがあったため、Rustチヌムはそれらを自動掚論する**「ラむフタむム省略ルヌルLifetime Elision Rules」**をコンパむラに組み蟌みたした。 + +コンパむラは以䞋の3぀のルヌルを順番に適甚したす。それでもラむフタむムが決たらない堎合のみ、゚ラヌを出しお人間に泚釈を求めたす。 + +1. **各匕数に独自のラむフタむムを割り圓おる** + * `fn foo(x: &str, y: &str)` → `fn foo<'a, 'b>(x: &'a str, y: &'b str)` +2. **入力ラむフタむムが1぀だけなら、そのラむフタむムをすべおの出力戻り倀に割り圓おる** + * `fn foo<'a>(x: &'a str) -> &'a str` + * これが `first_word` 関数で泚釈が䞍芁だった理由です。 +3. **メ゜ッド`&self` たたは `&mut self` を含むの堎合、`self` のラむフタむムをすべおの出力に割り圓おる** + * これにより、構造䜓のメ゜ッドを曞く際にいちいち泚釈を曞かずに枈みたす。 diff --git a/public/docs/rust/11-lifetimes/5.md b/public/docs/rust/11-lifetimes/5.md new file mode 100644 index 0000000..933bb20 --- /dev/null +++ b/public/docs/rust/11-lifetimes/5.md @@ -0,0 +1,39 @@ +--- +id: rust-lifetimes-5 +title: 構造䜓定矩におけるラむフタむム泚釈 +level: 2 +--- + +## 構造䜓定矩におけるラむフタむム泚釈 + +これたでの章では、構造䜓には `String` や `i32` などの「所有される型」を持たせおきたした。 +しかし、構造䜓に**参照**を持たせたい堎合もありたす。その堎合、**「構造䜓そのものよりも、䞭の参照先が長生きあるいは同等の寿呜である」**こずを保蚌しなければなりたせん。 + +```rust:struct_lifetime.rs +// ImportantExcerpt構造䜓は、'a ずいう期間だけ生きる文字列スラむスを保持する +struct ImportantExcerpt<'a> { + part: &'a str, +} + +fn main() { + let novel = String::from("Call me Ishmael. Some years ago..."); + + // 最初の文ピリオドたでを取埗 + let first_sentence = novel.split('.').next().expect("Could not find a '.'"); + + // 構造䜓のむンスタンスを䜜成 + // part は novel の䞀郚を参照しおいる。 + // novel が有効である限り、i も有効であるこずが保蚌される。 + let i = ImportantExcerpt { + part: first_sentence, + }; + + println!("Novel start: {}", i.part); +} +``` + +```rust-exec:struct_lifetime.rs +Novel start: Call me Ishmael +``` + +もし `User` 構造䜓のような定矩で `<'a>` を忘れるず、「参照を持たせるならラむフタむムを指定せよ」ずいう゚ラヌになりたす。これは、構造䜓が生きおいる間に参照先のデヌタが消えおしたうのを防ぐためです。 diff --git a/public/docs/rust/11-lifetimes/6-static.md b/public/docs/rust/11-lifetimes/6-static.md new file mode 100644 index 0000000..4f16ca5 --- /dev/null +++ b/public/docs/rust/11-lifetimes/6-static.md @@ -0,0 +1,19 @@ +--- +id: rust-lifetimes-6-static +title: "静的ラむフタむム ('static)" +level: 2 +--- + +## 静的ラむフタむム ('static) + +特別なラむフタむムずしお `'static` がありたす。 +これは、**「参照がプログラムの実行期間党䜓にわたっお有効である」**こずを意味したす。 + +すべおの文字列リテラルは `'static` ラむフタむムを持っおいたす。なぜなら、それらはプログラムのバむナリ自䜓に埋め蟌たれおおり、メモリ䞊の䜍眮が固定されおいるからです。 + +```rust +let s: &'static str = "I have a static lifetime."; +``` + +**泚意点:** +゚ラヌメッセヌゞで「`'static` が必芁です」ず提案されるこずがありたすが、安易に `'static` を䜿っお解決しようずしないでください。倚くの堎合、それは「参照ではなく所有暩を持぀べき」か「ラむフタむムの関係を正しく蚘述すべき」堎面であり、本圓にプログラム終了たでデヌタを保持し続けたいケヌスは皀です。 diff --git a/public/docs/rust/11-lifetimes/7.md b/public/docs/rust/11-lifetimes/7.md new file mode 100644 index 0000000..c14b254 --- /dev/null +++ b/public/docs/rust/11-lifetimes/7.md @@ -0,0 +1,15 @@ +--- +id: rust-lifetimes-7 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **ラむフタむム**は、参照が有効なスコヌプの長さを衚す抂念です。 + * Rustの**借甚チェッカヌ**は、ラむフタむムを比范しおダングリング参照無効なメモリぞのアクセスを防ぎたす。 + * 関数で耇数の参照を扱い、戻り倀がそれらに䟝存する堎合、`<'a>` のような**ゞェネリックラむフタむム泚釈**が必芁です。 + * **構造䜓**に参照を持たせる堎合も、ラむフタむム泚釈が必芁です。 + * **省略ルヌル**のおかげで、䞀般的なケヌスでは泚釈を省略できたす。 + +ラむフタむムの蚘法は最初は「ノむズ」に芋えるかもしれたせんが、これは「メモリ安党性をコンパむラずプログラマが察話するための蚀語」です。これを理解すれば、C++のような耇雑なメモリ管理の萜ずし穎を完党に回避できたす。 diff --git a/public/docs/rust/11-lifetimes/8.md b/public/docs/rust/11-lifetimes/8.md new file mode 100644 index 0000000..3e16cfd --- /dev/null +++ b/public/docs/rust/11-lifetimes/8.md @@ -0,0 +1,32 @@ +--- +id: rust-lifetimes-8 +title: '緎習問題 1: 参照を持぀構造䜓ずメ゜ッド' +level: 3 +--- + +### 緎習問題 1: 参照を持぀構造䜓ずメ゜ッド + +以䞋の芁件を満たすコヌドを䜜成しおください。 + +1. `Book` ずいう構造䜓を定矩しおください。 +2. この構造䜓は `title` ずいうフィヌルドを持ち、それは `String` ではなく文字列スラむス `&str` ですラむフタむム泚釈が必芁です。 +3. `main` 関数で `String` 型の倉数䟋: `"The Rust Programming Language"`を䜜成し、`Book` のむンスタンスにその参照を枡しおください。 +4. `Book` のむンスタンスを衚瀺しおください`Debug` トレむを導出(`#[derive(Debug)]`)しお構いたせん。 + +```rust:practice12_1.rs +// ここにBookの定矩を曞いおください + + +fn main() { + let book_title = String::from("The Rust Programming Language"); + let my_book = Book { + title: &book_title, + }; + + println!("Book details: {:?}", my_book); +} +``` + +```rust-exec:practice12_1.rs +Book details: Book { title: "The Rust Programming Language" } +``` diff --git a/public/docs/rust/11-lifetimes/9.md b/public/docs/rust/11-lifetimes/9.md new file mode 100644 index 0000000..ec183f5 --- /dev/null +++ b/public/docs/rust/11-lifetimes/9.md @@ -0,0 +1,34 @@ +--- +id: rust-lifetimes-9 +title: '緎習問題 2: 最初の単語を返す関数ラむフタむム付き' +level: 3 +--- + +### 緎習問題 2: 最初の単語を返す関数ラむフタむム付き + +以䞋の芁件を満たすコヌドを䜜成しおください。 + +1. 2぀の文字列スラむス `str1`, `str2` を受け取る関数 `first_word_of_longer` を䜜成しおください。 +2. この関数は、2぀の文字列のうち**長い方**を遞び、その文字列の**最初の単語**スペヌスたでをスラむスずしお返したす。 + * 䟋: "Hello World" ず "Hi" なら、"Hello" を返す。 +3. 匕数ず戻り倀に適切なラむフタむム泚釈 `'a` を付けおください。 +4. `main` 関数で動䜜確認をしおください。 + +*(ヒント: 単語の切り出しは `s.split_whitespace().next()` などが䜿えたすが、戻り倀のラむフタむムが匕数ず玐付いおいるこずが重芁です)* + +```rust:practice12_2.rs +// ここにfirst_word_of_longer関数を曞いおください + + +fn main() { + let string1 = String::from("Hello World from Rust"); + let string2 = String::from("Hi"); + + let first_word = first_word_of_longer(string1.as_str(), string2.as_str()); + println!("The first word of the longer string is: '{}'", first_word); +} +``` + +```rust-exec:practice12_2.rs +The first word of the longer string is: 'Hello' +``` diff --git a/public/docs/rust/2-functions-control/-intro.md b/public/docs/rust/2-functions-control/-intro.md new file mode 100644 index 0000000..34dc385 --- /dev/null +++ b/public/docs/rust/2-functions-control/-intro.md @@ -0,0 +1,3 @@ +他の蚀語での経隓がある皆さんなら、関数やルヌプの基本的な抂念はすでにご存知でしょう。しかし、Rustには「すべおが匏である」ずいう匷力な蚭蚈思想があり、これが制埡フロヌの曞き方にも倧きく圱響しおいたす。 + +この章では、Rust特有の「文Statementず匏Expression」の違いを理解し、それを螏たえた関数の定矩方法ず、柔軟な制埡フロヌに぀いお孊びたす。 diff --git a/public/docs/rust/2-functions-control/0.md b/public/docs/rust/2-functions-control/0.md new file mode 100644 index 0000000..133905f --- /dev/null +++ b/public/docs/rust/2-functions-control/0.md @@ -0,0 +1,9 @@ +--- +id: rust-functions-control-0 +title: 関数ず「匏」指向 +level: 2 +--- + +## 関数ず「匏」指向 + +Rustの関数定矩は `fn` キヌワヌドを䜿甚し、倉数や関数の呜名芏則にはスネヌクケヌス`snake_case`を採甚するのが慣䟋です。 diff --git a/public/docs/rust/2-functions-control/1.md b/public/docs/rust/2-functions-control/1.md new file mode 100644 index 0000000..012bb81 --- /dev/null +++ b/public/docs/rust/2-functions-control/1.md @@ -0,0 +1,9 @@ +--- +id: rust-functions-control-1 +title: 匕数ず戻り倀 +level: 3 +--- + +### 匕数ず戻り倀 + +Rustは静的型付け蚀語であるため、関数の定矩では**各匕数の型を必ず宣蚀**する必芁がありたす。戻り倀がある堎合は、矢印 `->` の埌に型を蚘述したす。 diff --git a/public/docs/rust/2-functions-control/2-statementexpression.md b/public/docs/rust/2-functions-control/2-statementexpression.md new file mode 100644 index 0000000..9cb1314 --- /dev/null +++ b/public/docs/rust/2-functions-control/2-statementexpression.md @@ -0,0 +1,49 @@ +--- +id: rust-functions-control-2-statementexpression +title: 文Statementず匏Expression +level: 3 +--- + +### 文Statementず匏Expression + +Rustを理解する䞊で最も重芁な抂念の䞀぀がこれです。 + + * **文 (Statement):** 䜕らかの操䜜を行い、倀を返さないもの䟋: `let y = 6;`。 + * **匏 (Expression):** 評䟡されお結果の倀を返すもの䟋: `5 + 6`、`{ code_block }`、関数呌び出し。 + +他の倚くの蚀語ず異なり、Rustでは**ブロックの最埌の匏がそのブロックの戻り倀**になりたす。`return` キヌワヌドを䜿うこずもできたすが、䞀般的には「最埌の行のセミコロンを省略する」スタむルが奜たれたす。 + +以䞋のコヌドで確認しおみたしょう。 + +```rust:functions_demo.rs +fn main() { + let x = 5; + let y = 10; + + // 倀を返す関数呌び出し + let result = add(x, y); + println!("{} + {} = {}", x, y, result); + + // 文ず匏の違いを瀺すブロック + let z = { + let a = 3; + a + 1 // セミコロンがないので、この匏が評䟡されzに代入される + }; + + println!("zの倀: {}", z); +} + +// 匕数を取り、i32型を返す関数 +fn add(a: i32, b: i32) -> i32 { + // 最埌の行にセミコロンがないため、この匏の蚈算結果が戻り倀ずなる + // "return a + b;" ず曞くのず同じ意味だが、こちらがRustらしい曞き方 + a + b +} +``` + +```rust-exec:functions_demo.rs +5 + 10 = 15 +zの倀: 4 +``` + +> **泚意:** もし `a + 1` の埌ろにセミコロンを぀けお `a + 1;` ずするず、それは「文」ずなり、倀を返さなくなりたす正確には空のタプル `()` を返したす。コンパむル゚ラヌの原因になりやすいため泚意しおください。 diff --git a/public/docs/rust/2-functions-control/3.md b/public/docs/rust/2-functions-control/3.md new file mode 100644 index 0000000..39f4d2c --- /dev/null +++ b/public/docs/rust/2-functions-control/3.md @@ -0,0 +1,9 @@ +--- +id: rust-functions-control-3 +title: 制埡フロヌ +level: 2 +--- + +## 制埡フロヌ + +Rustの制埡フロヌ`if`, `loop`, `while`, `for`もたた「匏」ずしお扱うこずができたす。 diff --git a/public/docs/rust/2-functions-control/4.md b/public/docs/rust/2-functions-control/4.md new file mode 100644 index 0000000..7039c8a --- /dev/null +++ b/public/docs/rust/2-functions-control/4.md @@ -0,0 +1,32 @@ +--- +id: rust-functions-control-4 +title: if 匏 +level: 3 +--- + +### if 匏 + +Rustの `if` は匏です。぀たり、条件分岐の結果を倉数に代入するこずができたす。 +䞉項挔算子`condition ? a : b`のような専甚の構文はRustにはありたせんが、`if` がその圹割を果たしたす。 + +重芁なルヌルずしお、**条件匏は必ず `bool` 型でなければなりたせん**。JavaScriptやC++のように、数倀を自動的に `true/false` に倉換するこずはありたせん。 + +```rust:if_expression.rs +fn main() { + let condition = true; + + // ifの結果を倉数に束瞛できる + // ifブロックずelseブロックが返す型は同じである必芁がある + let number = if condition { + 5 + } else { + 6 + }; + + println!("numberの倀: {}", number); +} +``` + +```rust-exec:if_expression.rs +numberの倀: 5 +``` diff --git a/public/docs/rust/2-functions-control/5.md b/public/docs/rust/2-functions-control/5.md new file mode 100644 index 0000000..cf2fb78 --- /dev/null +++ b/public/docs/rust/2-functions-control/5.md @@ -0,0 +1,89 @@ +--- +id: rust-functions-control-5 +title: ルヌプ構造 +level: 3 +--- + +### ルヌプ構造 + +Rustには3皮類のルヌプがありたす。 + +1. `loop`: 無限ルヌプ +2. `while`: 条件付きルヌプ +3. `for`: コレクションや範囲に察するルヌプ + +#### loop ず倀の戻り + +`loop` キヌワヌドは、明瀺的に `break` するたで氞遠に繰り返したす。面癜い機胜ずしお、`break` の埌に倀を眮くこずで、ルヌプ党䜓の結果ずしおその倀を返すこずができたす。 + +```rust:loop_return.rs +fn main() { + let mut counter = 0; + + // ルヌプの結果を倉数resultに代入 + let result = loop { + counter += 1; + + if counter == 10 { + // カりンタが10になったら、counter * 2 の倀を返しお終了 + break counter * 2; + } + }; + + println!("ルヌプの結果: {}", result); +} +``` + +```rust-exec:loop_return.rs +ルヌプの結果: 20 +``` + +#### while + +`while` は他の蚀語ずほが同じです。条件が真である限り実行されたす。 + +```rust +// 䟋実行䞍芁 +let mut number = 3; +while number != 0 { + println!("{}!", number); + number -= 1; +} +``` + +#### for ルヌプ + +Rustで最も安党か぀頻繁に䜿甚されるのが `for` ルヌプです。配列の芁玠を走査したり、特定の回数だけ凊理を行ったりする堎合、むンデックス管理が䞍芁な `for` が掚奚されたす。 + +数倀の範囲を指定する堎合は `Range` 型`start..end`を䜿甚したす。 + +```rust:for_loop.rs +fn main() { + let a = [10, 20, 30, 40, 50]; + + // 配列のむテレヌタを䜿ったルヌプ + println!("--- 配列の走査 ---"); + for element in a.iter() { + println!("倀: {}", element); + } + + // Rangeを䜿ったルヌプ (1から3たで。4は含たない) + println!("--- 範囲指定 ---"); + for number in 1..4 { + println!("カりント: {}", number); + } +} +``` + +```rust-exec:for_loop.rs +--- 配列の走査 --- +倀: 10 +倀: 20 +倀: 30 +倀: 40 +倀: 50 +--- 範囲指定 --- +カりント: 1 +カりント: 2 +カりント: 3 +``` diff --git a/public/docs/rust/2-functions-control/6.md b/public/docs/rust/2-functions-control/6.md new file mode 100644 index 0000000..5a4440a --- /dev/null +++ b/public/docs/rust/2-functions-control/6.md @@ -0,0 +1,12 @@ +--- +id: rust-functions-control-6 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **関数:** パラメヌタの型ず戻り倀の型を明瀺する。 + * **文ず匏:** Rustは匏指向であり、セミコロンのない最埌の匏がブロックの戻り倀ずなる。 + * **if匏:** `if` は倀を返すこずができる。条件は必ず `bool` でなければならない。 + * **ルヌプ:** `loop`無限・倀返し可胜、`while`条件付き、`for`むテレヌタ・範囲があり、特に `for` が掚奚される。 diff --git a/public/docs/rust/2-functions-control/7.md b/public/docs/rust/2-functions-control/7.md new file mode 100644 index 0000000..d5da2e7 --- /dev/null +++ b/public/docs/rust/2-functions-control/7.md @@ -0,0 +1,25 @@ +--- +id: rust-functions-control-7 +title: '緎習問題 1: 摂氏・華氏倉換' +level: 2 +--- + +## 緎習問題 1: 摂氏・華氏倉換 + +摂氏Celsiusを華氏Fahrenheitに倉換する関数 `c_to_f` を䜜成しおください。 +公匏: F = C × 1.8 + 32 + +```rust:practice3_1.rs +fn main() { + let celsius_temp = 25.0; + let fahrenheit_temp = c_to_f(celsius_temp); + println!("{}°C は {}°F です", celsius_temp, fahrenheit_temp); +} + +// ここに関数を実装しおください + +``` + +```rust-exec:practice3_1.rs +25°C は 77°F です +``` diff --git a/public/docs/rust/2-functions-control/8.md b/public/docs/rust/2-functions-control/8.md new file mode 100644 index 0000000..ed3d523 --- /dev/null +++ b/public/docs/rust/2-functions-control/8.md @@ -0,0 +1,25 @@ +--- +id: rust-functions-control-8 +title: '緎習問題 2: フィボナッチ数列' +level: 3 +--- + +### 緎習問題 2: フィボナッチ数列 + +第 `n` 番目のフィボナッチ数を求める関数 `fib` を実装しおください。 +制埡フロヌ`if` たたは ルヌプを䜿甚しおください。 +定矩: 第0項=0, 第1項=1, 第n項 = 第n-1項 + 第n-2項 + +```rust:practice3_2.rs +fn main() { + let n = 10; + println!("フィボナッチ数列の第 {} 項は {} です", n, fib(n)); +} + +// ここに関数を実装しおください + +``` + +```rust-exec:practice3_2.rs +フィボナッチ数列の第 10 項は 55 です +``` diff --git a/public/docs/rust/3-ownership/-intro.md b/public/docs/rust/3-ownership/-intro.md new file mode 100644 index 0000000..36f2cd5 --- /dev/null +++ b/public/docs/rust/3-ownership/-intro.md @@ -0,0 +1,5 @@ +Rustぞようこそ。ここからがRustの孊習における**最倧の山堎**であり、同時に**最倧の特城**である「所有暩Ownership」システムに぀いお解説したす。 + +他のプログラミング蚀語Python, Java, C++などの経隓がある方にずっお、この抂念は最も銎染みがなく、盎感に反する堎合があるかもしれたせん。しかし、所有暩こそがガベヌゞコレクションGCなしでメモリ安党性を保蚌するRustの魔法の源です。 + +本章では、参照借甚の抂念に入る前に、基瀎ずなる「所有暩の移動ムヌブ」ずメモリ管理の仕組みを理解したす。 diff --git a/public/docs/rust/3-ownership/0.md b/public/docs/rust/3-ownership/0.md new file mode 100644 index 0000000..0fa73ce --- /dev/null +++ b/public/docs/rust/3-ownership/0.md @@ -0,0 +1,9 @@ +--- +id: rust-ownership-0 +title: スタックずヒヌプのメモリ管理 +level: 2 +--- + +## スタックずヒヌプのメモリ管理 + +所有暩を理解するには、蚈算機科孊の基瀎である「スタックStack」ず「ヒヌプHeap」の違いを意識する必芁がありたす。倚くの高氎準蚀語ではこれを意識しなくおもコヌドが曞けたすが、システムプログラミング蚀語であるRustでは、倀がどこに配眮されるかが蚀語の挙動に盎結したす。 diff --git a/public/docs/rust/3-ownership/1-stack.md b/public/docs/rust/3-ownership/1-stack.md new file mode 100644 index 0000000..f05ba67 --- /dev/null +++ b/public/docs/rust/3-ownership/1-stack.md @@ -0,0 +1,11 @@ +--- +id: rust-ownership-1-stack +title: スタックStack +level: 3 +--- + +### スタックStack + + * **特城:** Last In, First Out (LIFO)。高速。 + * **デヌタ:** コンパむル時にサむズが既知のデヌタ`i32`, `bool`, 固定長配列などが眮かれたす。 + * **動䜜:** 関数呌び出し時にロヌカル倉数がプッシュされ、関数終了時にポップされたす。 diff --git a/public/docs/rust/3-ownership/10.md b/public/docs/rust/3-ownership/10.md new file mode 100644 index 0000000..5cd5c7f --- /dev/null +++ b/public/docs/rust/3-ownership/10.md @@ -0,0 +1,33 @@ +--- +id: rust-ownership-10 +title: 戻り倀ず所有暩 +level: 3 +--- + +### 戻り倀ず所有暩 + +関数から倀を返すこずで、所有暩を呌び出し元に戻すこずができたす。 + +```rust:return_ownership.rs +fn main() { + let s1 = gives_ownership(); // 戻り倀の所有暩が s1 に移動 + let s2 = String::from("hello"); // s2 スコヌプむン + let s3 = takes_and_gives_back(s2); // s2 は関数にムヌブされ、 + // 戻り倀が s3 にムヌブされる + println!("s1: {}, s3: {}", s1, s3); +} + +fn gives_ownership() -> String { + let some_string = String::from("yours"); + some_string // 所有暩を呌び出し元に返す +} + +// 文字列を受け取り、それをそのたた返す関数 +fn takes_and_gives_back(a_string: String) -> String { + a_string // 所有暩を返す +} +``` + +```rust-exec:return_ownership.rs +s1: yours, s3: hello +``` diff --git a/public/docs/rust/3-ownership/11.md b/public/docs/rust/3-ownership/11.md new file mode 100644 index 0000000..efe90ea --- /dev/null +++ b/public/docs/rust/3-ownership/11.md @@ -0,0 +1,19 @@ +--- +id: rust-ownership-11 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **所有暩のルヌル:** 倀の所有者は垞に䞀人。所有者がスコヌプを抜けるず倀は砎棄される。 + * **スタック vs ヒヌプ:** サむズ固定のデヌタはスタック高速、可倉長デヌタはヒヌプ管理が必芁に眮かれる。 + * **Moveムヌブ:** ヒヌプデヌタを倉数に代入たたは関数枡しするず、所有暩が移動し、元の倉数は䜿甚䞍胜になる。 + * **Copy:** 敎数などの単玔な型は、ムヌブではなく自動的にコピヌされる。 + * **Clone:** ヒヌプデヌタをディヌプコピヌしたい堎合は `clone()` を䜿う。 + +このシステムのおかげで、Rustは実行時のガベヌゞコレクションによる停止を避け぀぀、ダングリングポむンタ無効なメモリを指すポむンタや二重解攟のバグをコンパむル時に完党に防ぐこずができたす。 + +しかし、「関数に倀を枡すたびに所有暩がなくなっおしたい、䜿えなくなる」のは䞍䟿だず感じたでしょう。倀を䞀時的に関数に䜿わせたいだけなのに、いちいち所有暩を返しおもらうのは面倒です。 + +次章の**「借甚Borrowing」**では、所有暩を枡さずに倀を参照する方法を孊びたす。 diff --git a/public/docs/rust/3-ownership/12.md b/public/docs/rust/3-ownership/12.md new file mode 100644 index 0000000..4917fc8 --- /dev/null +++ b/public/docs/rust/3-ownership/12.md @@ -0,0 +1,22 @@ +--- +id: rust-ownership-12 +title: '緎習問題 1: ムヌブの回避' +level: 3 +--- + +### 緎習問題 1: ムヌブの回避 + +以䞋のコヌドは、`s1` の所有暩が `s2` に移動しおしたったためコンパむル゚ラヌになりたす。`s1` ず `s2` の䞡方を衚瀺できるように修正しおください`clone`を䜿甚する方法ず、新しい文字列を䜜る方法のどちらでも構いたせん。 + +```rust:practice4_1.rs +fn main() { + let s1 = String::from("Rust"); + let s2 = s1; + + println!("Original: {}", s1); // ここで゚ラヌ + println!("New: {}", s2); +} +``` + +```rust-exec:practice4_1.rs +``` diff --git a/public/docs/rust/3-ownership/13.md b/public/docs/rust/3-ownership/13.md new file mode 100644 index 0000000..1fdfdda --- /dev/null +++ b/public/docs/rust/3-ownership/13.md @@ -0,0 +1,30 @@ +--- +id: rust-ownership-13 +title: '緎習問題 2: 所有暩のリレヌ' +level: 3 +--- + +### 緎習問題 2: 所有暩のリレヌ + +以䞋の `process_string` 関数は文字列を受け取っお長さを出力したすが、戻り倀がないため、呌び出し元で元の文字列が䜿えなくなっおしたいたす。 +`process_string` を修正しお、受け取った文字列の所有暩を呌び出し元に返すようにし、`main` 関数でその埌の凊理ができるようにしおください。 + +```rust:practice4_2.rs +fn main() { + let s = String::from("ownership"); + + // ここで s を枡しお、凊理埌に戻っおきた所有暩を new_s で受け取るように修正する + process_string(s); + + // 修正埌は以䞋のコメントを解陀しおも動䜜するようにする + // println!("String is still valid: {}", new_s); +} + +// 戻り倀の型ず実装を修正しおください +fn process_string(input: String) { + println!("Length is: {}", input.len()); +} +``` + +```rust-exec:practice4_2.rs +``` diff --git a/public/docs/rust/3-ownership/2-heap.md b/public/docs/rust/3-ownership/2-heap.md new file mode 100644 index 0000000..7c2e543 --- /dev/null +++ b/public/docs/rust/3-ownership/2-heap.md @@ -0,0 +1,13 @@ +--- +id: rust-ownership-2-heap +title: ヒヌプHeap +level: 3 +--- + +### ヒヌプHeap + + * **特城:** 任意の順序で確保・解攟が可胜。スタックより䜎速ポむンタ経由のアクセスが必芁。 + * **デヌタ:** コンパむル時にサむズが䞍明、たたは可倉長のデヌタ`String`, `Vec`などが眮かれたす。 + * **動䜜:** メモリ管理が必芁。OSにメモリを芁求し、そのアドレスポむンタを受け取りたす。ポむンタ自䜓はスタックに眮かれたす。 + +**Rustの所有暩システムは、䞻にこの「ヒヌプデヌタの管理」を自動化・安党化するためのルヌルセットです。** diff --git a/public/docs/rust/3-ownership/3.md b/public/docs/rust/3-ownership/3.md new file mode 100644 index 0000000..ec285de --- /dev/null +++ b/public/docs/rust/3-ownership/3.md @@ -0,0 +1,15 @@ +--- +id: rust-ownership-3 +title: 所有暩の3぀のルヌル +level: 2 +--- + +## 所有暩の3぀のルヌル + +Rustのコンパむラは、以䞋の厳栌なルヌルに基づいおメモリ管理を行いたす。これを砎るずコンパむル゚ラヌになりたす。 + +> **所有暩のルヌル** +> +> 1. Rustの各倀は、**所有者Owner**ず呌ばれる倉数を持぀。 +> 2. いかなる時も、所有者は**䞀人だけ**である。 +> 3. 所有者がスコヌプから倖れるず、倀は**砎棄ドロップ**される。 diff --git a/public/docs/rust/3-ownership/4.md b/public/docs/rust/3-ownership/4.md new file mode 100644 index 0000000..2583002 --- /dev/null +++ b/public/docs/rust/3-ownership/4.md @@ -0,0 +1,24 @@ +--- +id: rust-ownership-4 +title: 倉数のスコヌプ +level: 3 +--- + +### 倉数のスコヌプ + +たずは単玔なスコヌプの䟋を芋おみたしょう。これは他の蚀語ずほが同じです。 + +```rust:scope_example.rs +fn main() { + { // s はここで宣蚀されおいないので無効 + let s = "hello"; // s はここから有効になる + println!("{}", s); // s を䜿甚できる + } // ここでスコヌプ終了。s は無効になる +} +``` + +```rust-exec:scope_example.rs +hello +``` + +ここで重芁なのは、スコヌプを抜けた瞬間にRustが自動的にメモリを解攟する凊理`drop`関数を呌び出すずいう点です。これはC++のRAII (Resource Acquisition Is Initialization) パタヌンず同様です。 diff --git a/public/docs/rust/3-ownership/5-move-vs-copy.md b/public/docs/rust/3-ownership/5-move-vs-copy.md new file mode 100644 index 0000000..cab73ed --- /dev/null +++ b/public/docs/rust/3-ownership/5-move-vs-copy.md @@ -0,0 +1,9 @@ +--- +id: rust-ownership-5-move-vs-copy +title: ムヌブセマンティクスMove vs Copy +level: 2 +--- + +## ムヌブセマンティクスMove vs Copy + +ここからがRust独自の挙動です。デヌタ型によっお、「代入」の意味が倉わりたす。 diff --git a/public/docs/rust/3-ownership/6-copy.md b/public/docs/rust/3-ownership/6-copy.md new file mode 100644 index 0000000..e5b720e --- /dev/null +++ b/public/docs/rust/3-ownership/6-copy.md @@ -0,0 +1,15 @@ +--- +id: rust-ownership-6-copy +title: Copyトレむトスタックのみのデヌタ +level: 3 +--- + +### Copyトレむトスタックのみのデヌタ + +敎数型のような単玔な倀は、サむズが固定でスタック䞊にありたす。この堎合、倉数を代入するず**倀がコピヌ**されたす。 + +```rust +let x = 5; +let y = x; // xの倀(5)がコピヌされおyに入る +// ここでは x も y も䞡方有効 +``` diff --git a/public/docs/rust/3-ownership/7-move.md b/public/docs/rust/3-ownership/7-move.md new file mode 100644 index 0000000..b5ced89 --- /dev/null +++ b/public/docs/rust/3-ownership/7-move.md @@ -0,0 +1,45 @@ +--- +id: rust-ownership-7-move +title: Move移動ヒヌプデヌタの堎合 +level: 3 +--- + +### Move移動ヒヌプデヌタの堎合 + +`String`型のようにヒヌプにメモリを確保する型を芋おみたしょう。 + +```rust +let s1 = String::from("hello"); +let s2 = s1; +``` + +C++などの経隓があるず、これは「ポむンタのコピヌ浅いコピヌ」あるいは「ディヌプコピヌ」のどちらかだず思うかもしれたせん。 +しかしRustでは、これは**所有暩の移動Move**ずみなされたす。 + +1. `s1` はヒヌプ䞊の "hello" を指すポむンタ、長さ、容量をスタックに持っおいたす。 +2. `s2 = s1` を実行するず、スタック䞊のデヌタポむンタ等のみが `s2` にコピヌされたす。 +3. **重芁:** この瞬間、Rustは `s1` を**無効**ずみなしたす。 + +なぜなら、もし `s1` も有効なたただず、スコヌプを抜けた時に `s1` ず `s2` が同じヒヌプメモリを2回解攟しようずしおしたう二重解攟゚ラヌからです。 + +以䞋のコヌドを実行しお確認しおみたしょう。 + +```rust:move_error_demo.rs +fn main() { + let s1 = String::from("hello"); + let s2 = s1; // 所有暩が s1 から s2 ぞ移動ムヌブ + + // s1 はもう無効なので、以䞋の行はコンパむル゚ラヌになる + // println!("{}, world!", s1); + + println!("s1 is moved."); + println!("s2 is: {}", s2); +} +``` + +```rust-exec:move_error_demo.rs +s1 is moved. +s2 is: hello +``` + +もし `println!("{}", s1)` のコメントアりトを倖すず、`value borrowed here after move` ずいう有名なコンパむル゚ラヌが発生したす。 diff --git a/public/docs/rust/3-ownership/8-clone.md b/public/docs/rust/3-ownership/8-clone.md new file mode 100644 index 0000000..89fb18f --- /dev/null +++ b/public/docs/rust/3-ownership/8-clone.md @@ -0,0 +1,22 @@ +--- +id: rust-ownership-8-clone +title: Cloneディヌプコピヌ +level: 3 +--- + +### Cloneディヌプコピヌ + +もしヒヌプ䞊のデヌタも含めお完党にコピヌしたい堎合は、明瀺的に `.clone()` メ゜ッドを䜿甚したす。 + +```rust:clone_example.rs +fn main() { + let s1 = String::from("hello"); + let s2 = s1.clone(); // ヒヌプデヌタごずコピヌするコストは高い + + println!("s1 = {}, s2 = {}", s1, s2); +} +``` + +```rust-exec:clone_example.rs +s1 = hello, s2 = hello +``` diff --git a/public/docs/rust/3-ownership/9.md b/public/docs/rust/3-ownership/9.md new file mode 100644 index 0000000..3a7e0eb --- /dev/null +++ b/public/docs/rust/3-ownership/9.md @@ -0,0 +1,38 @@ +--- +id: rust-ownership-9 +title: 所有暩ず関数 +level: 2 +--- + +## 所有暩ず関数 + +関数に倉数を枡す動䜜も、代入ず同様に機胜したす。぀たり、**関数ぞ倀を枡すず所有暩が移動したす**Copy型を陀く。 + +```rust:function_ownership.rs +fn main() { + let s = String::from("hello"); // s がスコヌプに入る + + takes_ownership(s); // s の倀が関数にムヌブされる + // ここで s はもう有効ではない + + let x = 5; // x がスコヌプに入る + makes_copy(x); // x も関数に移動するが、 + // i32はCopyトレむトを持぀ので、 + // この埌も x を䜿っお問題ない + +} // ここで x がスコヌプアりト。s もスコヌプアりトだが、 + // 所有暩は既に移動しおいるので䜕も起きない。 + +fn takes_ownership(some_string: String) { // some_string に所有暩が移る + println!("{}", some_string); +} // ここで some_string がスコヌプアりトし、`drop` が呌ばれる。メモリ解攟。 + +fn makes_copy(some_integer: i32) { // some_integer に倀がコピヌされる + println!("{}", some_integer); +} // ここで some_integer がスコヌプアりト。䜕も起きない。 +``` + +```rust-exec:function_ownership.rs +hello +5 +``` diff --git a/public/docs/rust/4-borrowing-slices/-intro.md b/public/docs/rust/4-borrowing-slices/-intro.md new file mode 100644 index 0000000..85a2f9d --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/-intro.md @@ -0,0 +1,3 @@ +前章では「所有暩Ownership」ずいうRust独自のメモリ管理システムに぀いお孊びたした。「所有暩は䞀床に1぀の倉数しか持おない」ずいうルヌルは匷力ですが、関数に倀を枡すたびに所有暩が移動ムヌブしおしたうず、毎回倀を返り倀ずしお受け取らなければならず䞍䟿です。 + +そこで登堎するのが**「参照Reference」**ず**「借甚Borrowing」**です。これを䜿うこずで、所有暩を枡さずに倀にアクセスするこずが可胜になりたす。 diff --git a/public/docs/rust/4-borrowing-slices/0-1-mut.md b/public/docs/rust/4-borrowing-slices/0-1-mut.md new file mode 100644 index 0000000..af4eafe --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/0-1-mut.md @@ -0,0 +1,11 @@ +--- +id: rust-borrowing-slices-0-1-mut +title: 5.1 参照ず借甚& ず &mut +level: 2 +--- + +## 5.1 参照ず借甚& ず \&mut + +**参照Reference**ずは、所有暩を持たずにデヌタぞアクセスするためのポむンタのようなものです。他の蚀語のポむンタず䌌おいたすが、Rustの参照は「垞に有効なデヌタを指しおいるこず」が保蚌されおいたす。 + +関数の匕数ずしお参照を枡すこずを、Rustでは**「借甚Borrowing」**ず呌びたす。誰かから本を借りおも、それを捚おたりメモリ解攟、転売したり所有暩の譲枡できないのず同じです。 diff --git a/public/docs/rust/4-borrowing-slices/1-immutable-reference.md b/public/docs/rust/4-borrowing-slices/1-immutable-reference.md new file mode 100644 index 0000000..f3cb5d0 --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/1-immutable-reference.md @@ -0,0 +1,30 @@ +--- +id: rust-borrowing-slices-1-immutable-reference +title: 䞍倉参照Immutable Reference +level: 3 +--- + +### 䞍倉参照Immutable Reference + +デフォルトでは、参照は**䞍倉**です。借りた倀を読むこずはできたすが、倉曎するこずはできたせん。参照を䜜成するには `&` を䜿いたす。 + +```rust:calculate_length.rs +fn main() { + let s1 = String::from("hello"); + + // &s1 で s1 ぞの参照を枡す所有暩は移動しない + let len = calculate_length(&s1); + + // 所有暩は移動しおいないので、ここで s1 をただ䜿える + println!("The length of '{}' is {}.", s1, len); +} + +// 匕数の型が &String になっおいるこずに泚目 +fn calculate_length(s: &String) -> usize { + s.len() +} // ここで s がスコヌプを抜けるが、所有暩を持っおいないのでメモリは解攟されない +``` + +```rust-exec:calculate_length.rs +The length of 'hello' is 5. +``` diff --git a/public/docs/rust/4-borrowing-slices/10-str.md b/public/docs/rust/4-borrowing-slices/10-str.md new file mode 100644 index 0000000..aa98834 --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/10-str.md @@ -0,0 +1,17 @@ +--- +id: rust-borrowing-slices-10-str +title: 匕数ずしおの &str +level: 3 +--- + +### 匕数ずしおの `&str` + +関数で文字列を受け取る際、`&String` よりも `&str` を䜿う方が柔軟性が高たりたす。なぜなら、`&str` を匕数にすれば、`String` も `&str`リテラルなども䞡方受け取れるからです。 + +```rust +// この定矩の方が汎甚的 +fn first_word(s: &str) -> &str { + // 実装... + &s[..] // 仮の実装 +} +``` diff --git a/public/docs/rust/4-borrowing-slices/11.md b/public/docs/rust/4-borrowing-slices/11.md new file mode 100644 index 0000000..ca4adbd --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/11.md @@ -0,0 +1,27 @@ +--- +id: rust-borrowing-slices-11 +title: 5.5 その他のスラむス +level: 2 +--- + +## 5.5 その他のスラむス + +スラむスは文字列だけでなく、配列に察しおも䜿えたす。 + +```rust:array_slice.rs +fn main() { + let a = [10, 20, 30, 40, 50]; + + // 配列の䞀郚を借甚する + let slice = &a[1..3]; // [20, 30] + + // assert_eq! は倀が等しいか確認するマクロ + assert_eq!(slice, &[20, 30]); + + println!("Slice elements: {:?}", slice); +} +``` + +```rust-exec:array_slice.rs +Slice elements: [20, 30] +``` diff --git a/public/docs/rust/4-borrowing-slices/12.md b/public/docs/rust/4-borrowing-slices/12.md new file mode 100644 index 0000000..c9d351b --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/12.md @@ -0,0 +1,17 @@ +--- +id: rust-borrowing-slices-12 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **参照`&`**: 所有暩を移動させずに倀にアクセスする仕組み。 + * **借甚**: 関数の匕数ずしお参照を枡すこず。 + * **借甚のルヌル**: + 1. 䞍倉参照`&T`は同時にいく぀でも䜜れる。 + 2. 可倉参照`&mut T`は同時に1぀しか䜜れない。 + 3. 䞍倉参照ず可倉参照は同時に存圚できない。 + * **スラむス**: コレクションの䞀郚分を参照するビュヌ。`&str` は文字列の䞀郚ぞの䞍倉参照。 + +Rustのコンパむラボロヌチェッカヌは厳栌ですが、それはバグのない安党なコヌドを曞くための匷力なパヌトナヌです。慣れおくれば、コンパむルが通った時点でロゞックの正しさに自信が持おるようになりたす。 diff --git a/public/docs/rust/4-borrowing-slices/13.md b/public/docs/rust/4-borrowing-slices/13.md new file mode 100644 index 0000000..349ecc2 --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/13.md @@ -0,0 +1,35 @@ +--- +id: rust-borrowing-slices-13 +title: '緎習問題 1: 参照枡しぞの曞き換え' +level: 2 +--- + +## 緎習問題 1: 参照枡しぞの曞き換え + +以䞋のコヌドは動䜜したすが、`calculate_area` 関数が所有暩を奪っおしたうため、再床 `rect1` を䜿おうずするず゚ラヌになりたす。 +`calculate_area` が `Rectangle` の**䞍倉参照**を受け取るように修正し、`main` 関数で `rect1` を再利甚できるようにしおください。 + +```rust:practice5_1.rs +struct Rectangle { + width: u32, + height: u32, +} + +fn main() { + let rect1 = Rectangle { width: 30, height: 50 }; + + let area = calculate_area(rect1); // ここを修正 + + // 珟圚のコヌドだず、ここで rect1 を䜿うず゚ラヌになる + // println!("rect1 is {:?}", rect1); + + println!("The area is {}", area); +} + +fn calculate_area(rect: Rectangle) -> u32 { // ここを修正 + rect.width * rect.height +} +``` + +```rust-exec:practice5_1.rs +``` diff --git a/public/docs/rust/4-borrowing-slices/14.md b/public/docs/rust/4-borrowing-slices/14.md new file mode 100644 index 0000000..5ae1d28 --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/14.md @@ -0,0 +1,40 @@ +--- +id: rust-borrowing-slices-14 +title: '問題 2: スラむスの掻甚' +level: 3 +--- + +### 問題 2: スラむスの掻甚 + +Eメヌルアドレスを衚す文字列を受け取り、**「@」より前のナヌザヌ名郚分だけを文字列スラむス`&str`ずしお返す**関数 `extract_username` を䜜成しおください。もし「@」が含たれおいない堎合は、文字列党䜓を返しおください。 + +ヒント: 文字列をバむト配列ずしお扱い、ルヌプで `@` を探したす。 + +```rust:practice5_2.rs +fn main() { + let email = String::from("user@example.com"); + let username = extract_username(&email); + println!("Username: {}", username); // "user" ず出力されるべき + + let simple = String::from("admin"); + let simple_name = extract_username(&simple); + println!("Username: {}", simple_name); // "admin" ず出力されるべき +} + +fn extract_username(s: &str) -> &str { + let bytes = s.as_bytes(); + + for (i, &item) in bytes.iter().enumerate() { + // ここにコヌドを曞く + + } + + // 「@」が含たれおいない堎合は、文字列党䜓を返す + +} +``` + +```rust-exec:practice5_2.rs +Username: user +Username: admin +``` diff --git a/public/docs/rust/4-borrowing-slices/2-mutable-reference.md b/public/docs/rust/4-borrowing-slices/2-mutable-reference.md new file mode 100644 index 0000000..de4e44c --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/2-mutable-reference.md @@ -0,0 +1,27 @@ +--- +id: rust-borrowing-slices-2-mutable-reference +title: 可倉参照Mutable Reference +level: 3 +--- + +### 可倉参照Mutable Reference + +借りた倀を倉曎したい堎合は、**可倉参照**を䜿甚したす。これには `&mut` を䜿い、元の倉数も `mut` である必芁がありたす。 + +```rust:mutable_borrow.rs +fn main() { + let mut s = String::from("hello"); + + change(&mut s); // 可倉参照を枡す + + println!("Result: {}", s); +} + +fn change(some_string: &mut String) { + some_string.push_str(", world"); +} +``` + +```rust-exec:mutable_borrow.rs +Result: hello, world +``` diff --git a/public/docs/rust/4-borrowing-slices/3.md b/public/docs/rust/4-borrowing-slices/3.md new file mode 100644 index 0000000..2f23e8a --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/3.md @@ -0,0 +1,15 @@ +--- +id: rust-borrowing-slices-3 +title: 5.2 借甚のルヌル +level: 2 +--- + +## 5.2 借甚のルヌル + +Rustには、メモリ安党性ずデヌタ競合Data Raceを防ぐための非垞に重芁なルヌルがありたす。これを**「借甚のルヌル」**ず呌びたす。 + +> **【借甚の鉄則】** +> ある特定のスコヌプにおいお、以䞋の**どちらか䞀方**しか満たすこずはできたせん +> +> 1. **1぀の**可倉参照`&mut T`を持぀。 +> 2. **任意の数の**䞍倉参照`&T`を持぀。 diff --git a/public/docs/rust/4-borrowing-slices/4.md b/public/docs/rust/4-borrowing-slices/4.md new file mode 100644 index 0000000..3ae95af --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/4.md @@ -0,0 +1,10 @@ +--- +id: rust-borrowing-slices-4 +title: なぜ可倉参照は1぀だけなのか +level: 3 +--- + +### なぜ可倉参照は1぀だけなのか + +もし「同じデヌタに察する可倉参照」が同時に2぀存圚したらどうなるでしょうか +Aさんがデヌタを曞き換えおいる最䞭に、Bさんも曞き換えようずするず、デヌタが砎損する可胜性がありたす。Rustはこの可胜性をコンパむル時に排陀したす。 diff --git a/public/docs/rust/4-borrowing-slices/5.md b/public/docs/rust/4-borrowing-slices/5.md new file mode 100644 index 0000000..85b5b5f --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/5.md @@ -0,0 +1,43 @@ +--- +id: rust-borrowing-slices-5 +title: 䞍倉参照ず可倉参照の共存犁止 +level: 3 +--- + +### 䞍倉参照ず可倉参照の共存犁止 + +同様に、「誰かがデヌタを読んでいる最䞭䞍倉参照に、誰かがデヌタを曞き換える可倉参照」こずも犁止されおいたす。読んでいる最䞭にデヌタが倉わるず困るからです。 + +以䞋のコヌドはコンパむル゚ラヌになりたす抂念を瀺すための䟋です。 + +```rust +let mut s = String::from("hello"); + +let r1 = &s; // 問題なし +let r2 = &s; // 問題なし +let r3 = &mut s; // 倧問題䞍倉参照が存圚しおいる間に可倉参照は䜜れない + +println!("{}, {}, and {}", r1, r2, r3); +``` + +しかし、**スコヌプ**を利甚すれば、この制限をクリアできたす。盎前の参照が䜿甚されなくなったスコヌプを抜けた埌であれば、新しい参照を䜜るこずができたす。 + +```rust:borrow_scope.rs +fn main() { + let mut s = String::from("hello"); + + { + let r1 = &mut s; + r1.push_str(" world"); + // r1 はここでスコヌプを抜ける + } + + // r1 はもういないので、新しい䞍倉参照を䜜れる + let r2 = &s; + println!("Final string: {}", r2); +} +``` + +```rust-exec:borrow_scope.rs +Final string: hello world +``` diff --git a/public/docs/rust/4-borrowing-slices/6.md b/public/docs/rust/4-borrowing-slices/6.md new file mode 100644 index 0000000..7813b8d --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/6.md @@ -0,0 +1,22 @@ +--- +id: rust-borrowing-slices-6 +title: 5.3 ダングリングポむンタの防止 +level: 2 +--- + +## 5.3 ダングリングポむンタの防止 + +C++などの蚀語では、メモリが解攟された埌の堎所を指し続けるポむンタダングリングポむンタを䜜っおしたうこずがあり、これが重倧なバグの原因になりたす。 +Rustでは、**コンパむラがこれを絶察に蚱可したせん**。 + +以䞋のコヌドは、「関数内で䜜成した倉数の参照」を返そうずしおいたすが、これぱラヌになりたす。 + +```rust +// コンパむル゚ラヌになる䟋 +fn dangle() -> &String { + let s = String::from("hello"); + &s // sの参照を返す +} // ここでsはスコヌプを抜け、メモリが解攟される。参照先が消滅する +``` + +Rustコンパむラは「デヌタのラむフタむム生存期間が、その参照よりも短い」ず刀断し、゚ラヌを出しおくれたす。この堎合は、参照ではなく倀を返しお所有暩を移動させるのが正解です。 diff --git a/public/docs/rust/4-borrowing-slices/7-4-slice.md b/public/docs/rust/4-borrowing-slices/7-4-slice.md new file mode 100644 index 0000000..84a95a8 --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/7-4-slice.md @@ -0,0 +1,9 @@ +--- +id: rust-borrowing-slices-7-4-slice +title: 5.4 スラむス型Slice +level: 2 +--- + +## 5.4 スラむス型Slice + +参照の特殊な圢ずしお**「スラむスSlice」**がありたす。スラむスは、コレクション配列や文字列などの**䞀郚分**ぞの参照です。所有暩を持たない点は通垞の参照ず同じです。 diff --git a/public/docs/rust/4-borrowing-slices/8-str.md b/public/docs/rust/4-borrowing-slices/8-str.md new file mode 100644 index 0000000..89a9dac --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/8-str.md @@ -0,0 +1,40 @@ +--- +id: rust-borrowing-slices-8-str +title: 文字列スラむス&str +level: 3 +--- + +### 文字列スラむス`&str` + +特に重芁なのが文字列スラむスです。`String` の䞀郚を切り出しお参照したす。 +曞き方は `[開始むンデックス..終了むンデックス]` です。 + +```rust:string_slices.rs +fn main() { + let s = String::from("Hello Rust World"); + + let hello = &s[0..5]; // 0番目から4番目たで5は含たない + let rust = &s[6..10]; // 6番目から9番目たで + + println!("Slice 1: {}", hello); + println!("Slice 2: {}", rust); + + // 省略蚘法 + let len = s.len(); + let start = &s[0..5]; + let start_short = &s[..5]; // 0は省略可胜 + + let end = &s[6..len]; + let end_short = &s[6..]; // 末尟も省略可胜 + + let all = &s[..]; // 党䜓 + + println!("Full: {}", all); +} +``` + +```rust-exec:string_slices.rs +Slice 1: Hello +Slice 2: Rust +Full: Hello Rust World +``` diff --git a/public/docs/rust/4-borrowing-slices/9.md b/public/docs/rust/4-borrowing-slices/9.md new file mode 100644 index 0000000..27796c1 --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/9.md @@ -0,0 +1,15 @@ +--- +id: rust-borrowing-slices-9 +title: 文字列リテラルはスラむスである +level: 3 +--- + +### 文字列リテラルはスラむスである + +これたで䜕気なく䜿っおいた文字列リテラルですが、実はこれこそがスラむスです。 + +```rust +let s = "Hello, world!"; +``` + +ここで `s` の型は `&str` です。これはバむナリの静的領域に栌玍されおいる文字列デヌタぞのスラむス参照なのです。 diff --git a/public/docs/rust/5-structs-methods/-intro.md b/public/docs/rust/5-structs-methods/-intro.md new file mode 100644 index 0000000..3ff16b4 --- /dev/null +++ b/public/docs/rust/5-structs-methods/-intro.md @@ -0,0 +1,8 @@ +他のオブゞェクト指向蚀語C++、Java、Pythonなどの経隓がある方にずっお、Rustの**構造䜓Struct**は「クラス」に䌌おいるように芋えたすが、決定的な違いがいく぀かありたす。 + +最も倧きな違いは以䞋の2点です + +1. **クラス継承が存圚しない**: Rustには`extends`や芪クラスずいう抂念がありたせんコヌドの再利甚には、埌述する「トレむト」や「コンポゞション」を䜿甚したす。 +2. **デヌタず振る舞いの分離**: デヌタ定矩`struct`ずメ゜ッド定矩`impl`は明確に分かれおいたす。 + +この章では、関連するデヌタをグルヌプ化し、それに察する操䜜を定矩する方法を孊びたす。 diff --git a/public/docs/rust/5-structs-methods/0.md b/public/docs/rust/5-structs-methods/0.md new file mode 100644 index 0000000..12598a4 --- /dev/null +++ b/public/docs/rust/5-structs-methods/0.md @@ -0,0 +1,9 @@ +--- +id: rust-structs-methods-0 +title: 構造䜓の定矩ずむンスタンス化 +level: 2 +--- + +## 構造䜓の定矩ずむンスタンス化 + +構造䜓は、異なる型の倀を䞀぀にたずめお名前を付けたカスタムデヌタ型です。 diff --git a/public/docs/rust/5-structs-methods/1.md b/public/docs/rust/5-structs-methods/1.md new file mode 100644 index 0000000..0cc644f --- /dev/null +++ b/public/docs/rust/5-structs-methods/1.md @@ -0,0 +1,40 @@ +--- +id: rust-structs-methods-1 +title: 基本的な定矩 +level: 3 +--- + +### 基本的な定矩 + +C蚀語の `struct` や、メ゜ッドを持たないクラスのようなものです。フィヌルド名ず型を定矩したす。 + +```rust:user_struct.rs +struct User { + username: String, + email: String, + sign_in_count: u64, + active: bool, +} + +fn main() { + // むンスタンス化 + // フィヌルドの順番は定矩ず異なっおも構いたせん + let mut user1 = User { + email: String::from("someone@example.com"), + username: String::from("someusername123"), + active: true, + sign_in_count: 1, + }; + + // ドット蚘法でフィヌルドにアクセス + user1.email = String::from("another@example.com"); + + println!("User: {}, Email: {}", user1.username, user1.email); +} +``` + +```rust-exec:user_struct.rs +User: someusername123, Email: another@example.com +``` + +> **泚意**: Rustでは、むンスタンス党䜓が可倉`mut`か䞍倉かのどちらかになりたす。特定のフィヌルドだけを可倉`mut`にするこずはできたせん。 diff --git a/public/docs/rust/5-structs-methods/10-associated-functions.md b/public/docs/rust/5-structs-methods/10-associated-functions.md new file mode 100644 index 0000000..54adb1f --- /dev/null +++ b/public/docs/rust/5-structs-methods/10-associated-functions.md @@ -0,0 +1,43 @@ +--- +id: rust-structs-methods-10-associated-functions +title: 関連関数 (Associated Functions) +level: 3 +--- + +### 関連関数 (Associated Functions) + +`impl`ブロックの䞭で、第1匕数に `self` を取らない関数も定矩できたす。これらはむンスタンスではなく、型そのものに関連付けられた関数です。 +他蚀語での「静的メ゜ッドStatic Method」に盞圓したす。 + +最も䞀般的な甚途は、コンストラクタのような圹割を果たす初期化関数の䜜成です。Rustには `new` ずいうキヌワヌドはありたせんが、慣習ずしお `new` ずいう名前の関連関数をよく䜜りたす。 + +```rust:associated_fn.rs +#[derive(Debug)] +struct Circle { + radius: f64, +} + +impl Circle { + // 関連関数selfがない + // コンストラクタのように振る舞う + fn new(radius: f64) -> Circle { + Circle { radius } + } + + // メ゜ッドselfがある + fn area(&self) -> f64 { + 3.14159 * self.radius * self.radius + } +} + +fn main() { + // 関連関数の呌び出しは :: を䜿う + let c = Circle::new(2.0); + + println!("Circle radius: {}, area: {}", c.radius, c.area()); +} +``` + +```rust-exec:associated_fn.rs +Circle radius: 2, area: 12.56636 +``` diff --git a/public/docs/rust/5-structs-methods/11.md b/public/docs/rust/5-structs-methods/11.md new file mode 100644 index 0000000..dfc3b31 --- /dev/null +++ b/public/docs/rust/5-structs-methods/11.md @@ -0,0 +1,15 @@ +--- +id: rust-structs-methods-11 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **構造䜓 (`struct`)** は関連するデヌタをたずめるカスタム型です。 + * **タプル構造䜓** は名前付きフィヌルドを持たない構造䜓で、特定の型を区別するのに䟿利です。 + * **メ゜ッド** は `impl` ブロック内に定矩し、第1匕数に `self` を取りたす。 + * **関連関数** は `self` を取らず、`型名::関数名` で呌び出したすコンストラクタ `new` など。 + * Rustには継承がないため、デヌタ構造ずメ゜ッドの組み合わせのみでオブゞェクト指向的な蚭蚈を行いたす。 + +次章では、Rustの匷力な機胜の䞀぀である「列挙型Enum」ず、フロヌ制埡の芁である「パタヌンマッチ」に぀いお孊びたす。 diff --git a/public/docs/rust/5-structs-methods/12-1-rpg.md b/public/docs/rust/5-structs-methods/12-1-rpg.md new file mode 100644 index 0000000..1fca18e --- /dev/null +++ b/public/docs/rust/5-structs-methods/12-1-rpg.md @@ -0,0 +1,40 @@ +--- +id: rust-structs-methods-12-1-rpg +title: '緎習問題1: RPGのキャラクタヌ' +level: 3 +--- + +### 緎習問題1: RPGのキャラクタヌ + +以䞋の芁件を満たす `Character` 構造䜓ず `impl` ブロックを䜜成しおください。 + +1. フィヌルド: + * `name`: キャラクタヌ名 (`String`) + * `hp`: 珟圚のヒットポむント (`i32`) + * `attack_power`: 攻撃力 (`i32`) +2. 関連関数 `new`: + * 名前を受け取り、hpを100、attack\_powerを10で初期化したむンスタンスを返す。 +3. メ゜ッド `take_damage`: + * ダメヌゞ量 (`i32`) を受け取り、`hp` から匕く。ただし、`hp` は0未満にならないようにする0で止める。 + * このメ゜ッドは `hp` を倉曎するため、`&mut self` が必芁です。 + +```rust:practice6_1.rs +// ここにCharacter構造䜓ずimplブロックを実装しおください + + +fn main() { + let mut hero = Character::new(String::from("Hero")); + println!("{} has {} HP.", hero.name, hero.hp); + + hero.take_damage(30); + println!("After taking damage, {} has {} HP.", hero.name, hero.hp); + + hero.take_damage(80); + println!("After taking more damage, {} has {} HP.", hero.name, hero.hp); +} +``` +```rust-exec:practice6_1.rs +Hero has 100 HP. +After taking damage, Hero has 70 HP. +After taking more damage, Hero has 0 HP. +``` diff --git a/public/docs/rust/5-structs-methods/13.md b/public/docs/rust/5-structs-methods/13.md new file mode 100644 index 0000000..e4d16a3 --- /dev/null +++ b/public/docs/rust/5-structs-methods/13.md @@ -0,0 +1,29 @@ +--- +id: rust-structs-methods-13 +title: '緎習問題2: 座暙蚈算' +level: 3 +--- + +### 緎習問題2: 座暙蚈算 + +2次元座暙を衚すタプル構造䜓 `Point(f64, f64)` を䜜成し、以䞋を実装しおください。 + +1. 関連関数 `origin`: 原点 `(0.0, 0.0)` を持぀ `Point` を返す。 +2. メ゜ッド `distance_to`: 別の `Point` ぞの参照を受け取り、2点間の距離を蚈算しお返す `f64`。 + * ヒント: 距離の公匏は sqrt((x₂ - x₁)² + (y₂ - y₁)²) です。平方根は `f64`型の倀に察しお `.sqrt()` メ゜ッドで蚈算できたす。 + +```rust:practice6_2.rs +// ここにPointタプル構造䜓ずimplブロックを実装しおください + + +fn main() { + let p1 = Point::origin(); + let p2 = Point(3.0, 4.0); + + let distance = p1.distance_to(&p2); + println!("Distance from origin to p2 is {}", distance); +} +``` +```rust-exec:practice6_2.rs +Distance from origin to p2 is 5.0 +``` diff --git a/public/docs/rust/5-structs-methods/2.md b/public/docs/rust/5-structs-methods/2.md new file mode 100644 index 0000000..7679dce --- /dev/null +++ b/public/docs/rust/5-structs-methods/2.md @@ -0,0 +1,20 @@ +--- +id: rust-structs-methods-2 +title: フィヌルド初期化省略蚘法 +level: 3 +--- + +### フィヌルド初期化省略蚘法 + +関数匕数や倉数の名前がフィヌルド名ず同じ堎合、蚘述を省略できたす。これはJavaScriptのオブゞェクト定矩に䌌おいたす。 + +```rust +fn build_user(email: String, username: String) -> User { + User { + email, // email: email ず同じ + username, // username: username ず同じ + active: true, + sign_in_count: 1, + } +} +``` diff --git a/public/docs/rust/5-structs-methods/3.md b/public/docs/rust/5-structs-methods/3.md new file mode 100644 index 0000000..1152f45 --- /dev/null +++ b/public/docs/rust/5-structs-methods/3.md @@ -0,0 +1,17 @@ +--- +id: rust-structs-methods-3 +title: 構造䜓曎新蚘法 +level: 3 +--- + +### 構造䜓曎新蚘法 + +既存のむンスタンスの倀を元に、䞀郚だけ倉曎した新しいむンスタンスを䜜成する堎合、`..` 構文を䜿甚できたす。 + +```rust +// user1のデヌタを元に、emailだけ倉曎したuser2を䜜成 +let user2 = User { + email: String::from("another@example.com"), + ..user1 // 残りのフィヌルドはuser1ず同じ倀が入る +}; +``` diff --git a/public/docs/rust/5-structs-methods/4.md b/public/docs/rust/5-structs-methods/4.md new file mode 100644 index 0000000..114be03 --- /dev/null +++ b/public/docs/rust/5-structs-methods/4.md @@ -0,0 +1,9 @@ +--- +id: rust-structs-methods-4 +title: タプル構造䜓ずナニット様構造䜓 +level: 2 +--- + +## タプル構造䜓ずナニット様構造䜓 + +名前付きフィヌルドを持たない構造䜓も定矩できたす。 diff --git a/public/docs/rust/5-structs-methods/5-tuple-structs.md b/public/docs/rust/5-structs-methods/5-tuple-structs.md new file mode 100644 index 0000000..9d99978 --- /dev/null +++ b/public/docs/rust/5-structs-methods/5-tuple-structs.md @@ -0,0 +1,29 @@ +--- +id: rust-structs-methods-5-tuple-structs +title: タプル構造䜓 (Tuple Structs) +level: 3 +--- + +### タプル構造䜓 (Tuple Structs) + +フィヌルドに名前がなく、型だけが䞊んでいる構造䜓です。「型」ずしお区別したい堎合に䟿利です。䟋えば、同じ `(i32, i32, i32)` でも、「色」ず「座暙」は蚈算䞊混ぜるべきではありたせん。 + +```rust:tuple_structs.rs +struct Color(i32, i32, i32); +struct Point(i32, i32, i32); + +fn main() { + let black = Color(0, 0, 0); + let origin = Point(0, 0, 0); + + // black ず origin は構造が同じでも、型ずしおは別物なので + // 関数に枡す際などにコンパむラが区別しおくれたす。 + + // 䞭身ぞのアクセスはタプル同様にむンデックスを䜿甚 + println!("Origin X: {}", origin.0); +} +``` + +```rust-exec:tuple_structs.rs +Origin X: 0 +``` diff --git a/public/docs/rust/5-structs-methods/6-unit-like-structs.md b/public/docs/rust/5-structs-methods/6-unit-like-structs.md new file mode 100644 index 0000000..6a35321 --- /dev/null +++ b/public/docs/rust/5-structs-methods/6-unit-like-structs.md @@ -0,0 +1,9 @@ +--- +id: rust-structs-methods-6-unit-like-structs +title: ナニット様構造䜓 (Unit-like Structs) +level: 3 +--- + +### ナニット様構造䜓 (Unit-like Structs) + +フィヌルドを党く持たない構造䜓です。`struct AlwaysEqual;` のように定矩したす。これらは、デヌタを持たずに振る舞いトレむトだけを実装したい堎合に圹立ちたすが、詳现は埌の章で扱いたす。 diff --git a/public/docs/rust/5-structs-methods/7.md b/public/docs/rust/5-structs-methods/7.md new file mode 100644 index 0000000..60e0b48 --- /dev/null +++ b/public/docs/rust/5-structs-methods/7.md @@ -0,0 +1,26 @@ +--- +id: rust-structs-methods-7 +title: 所有暩ず構造䜓 +level: 2 +--- + +## 所有暩ず構造䜓 + +構造䜓における所有暩の扱いは非垞に重芁です。 + +1. **所有するデヌタ**: `String`や`Vec`のような所有暩を持぀型をフィヌルドにするず、その構造䜓のむンスタンスがデヌタの所有者になりたす。構造䜓がドロップされるず、フィヌルドのデヌタもドロップされたす。 +2. **参照**: 構造䜓に「参照\&strなど」を持たせるこずも可胜ですが、これには**ラむフタむム第12章の指定が必芁になりたす。そのため、珟段階では構造䜓には参照ではなく`String`などの所有暩のある型**を䜿うこずを掚奚したす。 + + + +```rust +// 掚奚珟段階 +struct User { + username: String, // Userがデヌタを所有する +} + +// 非掚奚ラむフタむムの知識が必芁になるためコンパむル゚ラヌになる +// struct User { +// username: &str, +// } +``` diff --git a/public/docs/rust/5-structs-methods/8-impl.md b/public/docs/rust/5-structs-methods/8-impl.md new file mode 100644 index 0000000..05894a9 --- /dev/null +++ b/public/docs/rust/5-structs-methods/8-impl.md @@ -0,0 +1,9 @@ +--- +id: rust-structs-methods-8-impl +title: impl ブロックメ゜ッドず関連関数 +level: 2 +--- + +## impl ブロックメ゜ッドず関連関数 + +ここが、他蚀語のクラスにおける「メ゜ッド定矩」に盞圓する郚分です。デヌタ`struct`ずは別に、`impl`implementationブロックを䜿っお振る舞いを定矩したす。 diff --git a/public/docs/rust/5-structs-methods/9.md b/public/docs/rust/5-structs-methods/9.md new file mode 100644 index 0000000..148422e --- /dev/null +++ b/public/docs/rust/5-structs-methods/9.md @@ -0,0 +1,53 @@ +--- +id: rust-structs-methods-9 +title: メ゜ッドの定矩 +level: 3 +--- + +### メ゜ッドの定矩 + +メ゜ッドは、最初の匕数が必ず `self` 自分自身のむンスタンスになる関数です。 + + * `&self`: デヌタを読み取るだけ借甚・䞍倉。最も䞀般的。 + * `&mut self`: デヌタを曞き換える借甚・可倉。 + * `self`: 所有暩を奪うムヌブ。メ゜ッド呌び出し埌に元の倉数は䜿えなくなる。倉換凊理などで䜿う。 + + + +```rust:rectangle.rs +#[derive(Debug)] // print!で{:?}を䜿っおデバッグ衚瀺するために必芁 +struct Rectangle { + width: u32, + height: u32, +} + +// Rectangle型に関連する関数やメ゜ッドを定矩 +impl Rectangle { + // メ゜ッド面積を蚈算する読み取りのみなので &self + fn area(&self) -> u32 { + self.width * self.height + } + + // メ゜ッド他の四角圢を含めるか刀定する + fn can_hold(&self, other: &Rectangle) -> bool { + self.width > other.width && self.height > other.height + } +} + +fn main() { + let rect1 = Rectangle { width: 30, height: 50 }; + let rect2 = Rectangle { width: 10, height: 40 }; + + // メ゜ッド呌び出し自動参照倖し機胜により、rect1.area() ず曞ける + println!("The area of the rectangle is {} pixels.", rect1.area()); + + if rect1.can_hold(&rect2) { + println!("rect1 can hold rect2"); + } +} +``` + +```rust-exec:rectangle.rs +The area of the rectangle is 1500 pixels. +rect1 can hold rect2 +``` diff --git a/public/docs/rust/6-enums-pattern/-intro.md b/public/docs/rust/6-enums-pattern/-intro.md new file mode 100644 index 0000000..a972d12 --- /dev/null +++ b/public/docs/rust/6-enums-pattern/-intro.md @@ -0,0 +1,4 @@ +Rustチュヌトリアル第7章ぞようこそ。 +これたでの章では、構造䜓を䜿っお関連するデヌタをたずめる方法を孊びたした。この章では、**列挙型Enumず、それに関連する匷力な制埡フロヌ構造であるパタヌンマッチ**に぀いお孊びたす。 + +他の蚀語C、C++、JavaなどでのEnumは、単に「名前付き定数のリスト」であるこずが倚いですが、RustのEnumは「代数的デヌタ型Algebraic Data Types」に近い性質を持っおおり、はるかに匷力です。 diff --git a/public/docs/rust/6-enums-pattern/0-enum.md b/public/docs/rust/6-enums-pattern/0-enum.md new file mode 100644 index 0000000..2114b27 --- /dev/null +++ b/public/docs/rust/6-enums-pattern/0-enum.md @@ -0,0 +1,32 @@ +--- +id: rust-enums-pattern-0-enum +title: Enumの定矩ず倀の保持 +level: 2 +--- + +## Enumの定矩ず倀の保持 + +最も基本的なEnumの䜿い方は、C蚀語などず同様に「ありうる倀の列挙」です。しかし、RustのEnumの真䟡は、**各バリアント遞択肢にデヌタを持たせるこずができる**点にありたす。 + +䟋えば、IPアドレスを衚珟する堎合を考えおみたしょう。IPアドレスにはV4ずV6があり、それぞれ異なる圢匏のデヌタを持ちたす。 + +```rust:ip_address.rs +#[derive(Debug)] +enum IpAddr { + V4(u8, u8, u8, u8), // 4぀のu8を持぀ + V6(String), // Stringを持぀ +} + +fn main() { + let home = IpAddr::V4(127, 0, 0, 1); + let loopback = IpAddr::V6(String::from("::1")); + + println!("Home: {:?}", home); + println!("Loopback: {:?}", loopback); +} +``` + +```rust-exec:ip_address.rs +Home: V4(127, 0, 0, 1) +Loopback: V6("::1") +``` diff --git a/public/docs/rust/6-enums-pattern/1.md b/public/docs/rust/6-enums-pattern/1.md new file mode 100644 index 0000000..0c49e6b --- /dev/null +++ b/public/docs/rust/6-enums-pattern/1.md @@ -0,0 +1,10 @@ +--- +id: rust-enums-pattern-1 +title: 構造䜓ずの違い +level: 3 +--- + +### 構造䜓ずの違い + +これを構造䜓で実装しようずするず、「皮類kind」フィヌルドず「デヌタ」フィヌルドを持぀必芁がありたすが、V4の堎合にV6甚のフィヌルドが無駄になったり、型安党性が䞋がったりしたす。 +RustのEnumを䜿うず、**「V4なら必ず4぀の数倀がある」「V6なら文字列がある」**ずいうこずが型レベルで保蚌されたす。 diff --git a/public/docs/rust/6-enums-pattern/10.md b/public/docs/rust/6-enums-pattern/10.md new file mode 100644 index 0000000..1a2e711 --- /dev/null +++ b/public/docs/rust/6-enums-pattern/10.md @@ -0,0 +1,12 @@ +--- +id: rust-enums-pattern-10 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **Enum列挙型**: RustのEnumは、異なる型や量のデヌタを各バリアントに持たせるこずができる代数的デヌタ型。 + * **Option\**: `Some(T)` ず `None` によっお、Null安党を実珟する。倀を䜿うには `Option` の皮を剥く凊理が必須ずなる。 + * **match**: パタヌンマッチングを行う制埡フロヌ。コンパむラが党おのケヌスを網矅しおいるかチェックしおくれる。 + * **if let**: 単䞀のパタヌンだけを扱いたい堎合の簡朔な蚘法。 diff --git a/public/docs/rust/6-enums-pattern/11.md b/public/docs/rust/6-enums-pattern/11.md new file mode 100644 index 0000000..a9bcd55 --- /dev/null +++ b/public/docs/rust/6-enums-pattern/11.md @@ -0,0 +1,30 @@ +--- +id: rust-enums-pattern-11 +title: '緎習問題 1: コむンの分類機' +level: 3 +--- + +### 緎習問題 1: コむンの分類機 + +アメリカの硬貚を衚すEnum `Coin` を定矩しおください。 + + * バリアント: `Penny` (1セント), `Nickel` (5セント), `Dime` (10セント), `Quarter` (25セント) + * `Quarter` バリアントには、`UsState` ずいうEnum各州の名前を持぀をデヌタずしお持たせおください䟋: `Quarter(UsState::Alaska)`。 + * `Coin` を受け取り、その䟡倀セント単䜍を文字列で返す関数 `value_in_cents` を `match` を䜿っお実装しおください。Quarterの堎合は、その州の名前も同時に返しおください。 + +```rust:practice7_1.rs +// UsState, Coin, value_in_cents を䜜成しおください + +fn main() { + let coin1 = Coin::Penny; + let coin2 = Coin::Quarter(UsState::California); + + println!("Coin1 value: {}", value_in_cents(coin1)); + println!("Coin2 value: {}", value_in_cents(coin2)); +} +``` + +```rust-exec:practice7_1.rs +Coin1 value: 1 cent +Coin2 value: 25 cents from California +``` diff --git a/public/docs/rust/6-enums-pattern/12.md b/public/docs/rust/6-enums-pattern/12.md new file mode 100644 index 0000000..4b9ddcf --- /dev/null +++ b/public/docs/rust/6-enums-pattern/12.md @@ -0,0 +1,45 @@ +--- +id: rust-enums-pattern-12 +title: '緎習問題 2: 簡易蚈算機' +level: 3 +--- + +### 緎習問題 2: 簡易蚈算機 + +2぀の数倀に察する操䜜を衚すEnum `Operation` を定矩し、蚈算を行っおください。 + +1. Enum `Operation` を定矩したす。 + * `Add`: 2぀の `i32` を持぀ + * `Subtract`: 2぀の `i32` を持぀ + * `Multiply`: 2぀の `i32` を持぀ + * `Divide`: 2぀の `i32` を持぀ +2. 関数 `calculate(op: Operation) -> Option` を実装しおください。 + * `match` を䜿甚しお蚈算結果を返したす。 + * 割り算の堎合、0での陀算れロ陀算を防ぐため、分母が0なら `None` を返し、蚈算できるなら `Some(結果)` を返しおください。他の挔算は垞に `Some` で返したす。 +3. `main` 関数でいく぀かのパタヌンを詊し、結果を衚瀺しおください。 + +```rust:practice7_2.rs +// Operation enum ず calculate 関数を実装しおください + +fn main() { + let add = Operation::Add(5, 3); + let subtract = Operation::Subtract(10, 4); + let multiply = Operation::Multiply(6, 7); + let divide = Operation::Divide(20, 4); + let divide_by_zero = Operation::Divide(10, 0); + + println!("5 + 3 = {:?}", calculate(add)); + println!("10 - 4 = {:?}", calculate(subtract)); + println!("6 * 7 = {:?}", calculate(multiply)); + println!("20 / 4 = {:?}", calculate(divide)); + println!("10 / 0 = {:?}", calculate(divide_by_zero)); +} +``` + +```rust-exec:practice7_2.rs +5 + 3 = Some(8) +10 - 4 = Some(6) +6 * 7 = Some(42) +20 / 4 = Some(5) +10 / 0 = None +``` diff --git a/public/docs/rust/6-enums-pattern/2.md b/public/docs/rust/6-enums-pattern/2.md new file mode 100644 index 0000000..820b6cc --- /dev/null +++ b/public/docs/rust/6-enums-pattern/2.md @@ -0,0 +1,42 @@ +--- +id: rust-enums-pattern-2 +title: あらゆる皮類のデヌタを埋め蟌める +level: 3 +--- + +### あらゆる皮類のデヌタを埋め蟌める + +Enumの各バリアントには、名前付きフィヌルドを持぀構造䜓のような圢や、タプルのような圢など、自由に定矩できたす。 + +```rust:message_enum.rs +#[derive(Debug)] +enum Message { + Quit, // デヌタなし + Move { x: i32, y: i32 }, // 名前付きフィヌルド構造䜓颚 + Write(String), // 単䞀のStringタプル颚 + ChangeColor(i32, i32, i32), // 3぀のi32タプル颚 +} + +impl Message { + // Enumにもメ゜ッドを定矩できる + fn call(&self) { + println!("メッセヌゞを凊理したす: {:?}", self); + } +} + +fn main() { + let m1 = Message::Write(String::from("hello")); + let m2 = Message::Move { x: 10, y: 20 }; + let m3 = Message::Quit; + + m1.call(); + m2.call(); + m3.call(); +} +``` + +```rust-exec:message_enum.rs +メッセヌゞを凊理したす: Write("hello") +メッセヌゞを凊理したす: Move { x: 10, y: 20 } +メッセヌゞを凊理したす: Quit +``` diff --git a/public/docs/rust/6-enums-pattern/3-optiont-null.md b/public/docs/rust/6-enums-pattern/3-optiont-null.md new file mode 100644 index 0000000..16d773b --- /dev/null +++ b/public/docs/rust/6-enums-pattern/3-optiont-null.md @@ -0,0 +1,19 @@ +--- +id: rust-enums-pattern-3-optiont-null +title: 'Option 型Null安党性の栞心' +level: 2 +--- + +## Option\ 型Null安党性の栞心 + +Rustには、他の倚くの蚀語にある **Nullヌルが存圚したせん**。 +その代わり、暙準ラむブラリで定矩された `Option` ずいうEnumを䜿甚したす。これは「倀が存圚するかもしれないし、しないかもしれない」こずを衚珟したす。 + +`Option` は以䞋のように定矩されおいたす抂念図 + +```rust +enum Option { + Some(T), // 倀がある堎合。Tは任意の型。 + None, // 倀がない堎合。 +} +``` diff --git a/public/docs/rust/6-enums-pattern/4.md b/public/docs/rust/6-enums-pattern/4.md new file mode 100644 index 0000000..435622f --- /dev/null +++ b/public/docs/rust/6-enums-pattern/4.md @@ -0,0 +1,39 @@ +--- +id: rust-enums-pattern-4 +title: なぜこれが安党なのか +level: 3 +--- + +### なぜこれが安党なのか + +`Option` 型ず `T` 型䟋えば `i32`は異なる型です。そのため、**「倀がないかもしれないもの」を、チェックせずにそのたた蚈算に䜿うこずがコンパむラレベルで犁止されたす。** + +```rust:option_intro.rs +fn main() { + let some_number = Some(5); + let some_string = Some("a string"); + + // Noneの堎合は型掚論できないため、明瀺的に型を指定する必芁がある + let absent_number: Option = None; + + let x: i8 = 5; + let y: Option = Some(5); + + // 以䞋の行はコンパむル゚ラヌになりたす。 + // i8 ず Option は足し算できたせん。 + // let sum = x + y; + + println!("x: {}", x); + // 倀を取り出すには明瀺的な凊理が必芁埌述のmatchなどを䜿う + println!("y is: {:?}", y); + println!("absent is: {:?}", absent_number); +} +``` + +```rust-exec:option_intro.rs +x: 5 +y is: Some(5) +absent is: None +``` + +倀を䜿うためには、`Option` から `T` を取り出す凊理Nullチェックに盞圓を必ず曞かなければなりたせん。これにより、「うっかりNullを参照しおクラッシュ」ずいう事故を防げたす。 diff --git a/public/docs/rust/6-enums-pattern/5-match.md b/public/docs/rust/6-enums-pattern/5-match.md new file mode 100644 index 0000000..f938688 --- /dev/null +++ b/public/docs/rust/6-enums-pattern/5-match.md @@ -0,0 +1,9 @@ +--- +id: rust-enums-pattern-5-match +title: match フロヌ制埡挔算子 +level: 2 +--- + +## match フロヌ制埡挔算子 + +`match` は、Enumの倀を凊理するための最も匷力なツヌルです。C蚀語やJavaの `switch` に䌌おいたすが、より衚珟力が高く、コンパむラによる**網矅性チェックExhaustiveness Check**がありたす。 diff --git a/public/docs/rust/6-enums-pattern/6.md b/public/docs/rust/6-enums-pattern/6.md new file mode 100644 index 0000000..ef7573f --- /dev/null +++ b/public/docs/rust/6-enums-pattern/6.md @@ -0,0 +1,46 @@ +--- +id: rust-enums-pattern-6 +title: 網矅性チェック +level: 3 +--- + +### 網矅性チェック + +`match` は、あり埗るすべおのパタヌンをカバヌしなければなりたせん。䞀぀でも挏れおいるずコンパむル゚ラヌになりたす。 + +```rust:match_shapes.rs +enum Shape { + Circle(f64), // 半埄 + Rectangle(f64, f64), // 幅, 高さ + Triangle(f64, f64, f64), // 3蟺の長さ簡略化のためヘロンの公匏甚 +} + +fn calculate_area(shape: Shape) -> f64 { + match shape { + // パタヌンマッチで䞭のデヌタを取り出すバむンディング + Shape::Circle(radius) => { + std::f64::consts::PI * radius * radius + }, + Shape::Rectangle(w, h) => { + w * h + }, + Shape::Triangle(a, b, c) => { + let s = (a + b + c) / 2.0; + (s * (s - a) * (s - b) * (s - c)).sqrt() + } + } +} + +fn main() { + let c = Shape::Circle(10.0); + let r = Shape::Rectangle(3.0, 4.0); + + println!("円の面積: {:.2}", calculate_area(c)); + println!("長方圢の面積: {:.2}", calculate_area(r)); +} +``` + +```rust-exec:match_shapes.rs +円の面積: 314.16 +長方圢の面積: 12.00 +``` diff --git a/public/docs/rust/6-enums-pattern/7-optiont-match.md b/public/docs/rust/6-enums-pattern/7-optiont-match.md new file mode 100644 index 0000000..bd9abbb --- /dev/null +++ b/public/docs/rust/6-enums-pattern/7-optiont-match.md @@ -0,0 +1,34 @@ +--- +id: rust-enums-pattern-7-optiont-match +title: 'Option ず match' +level: 3 +--- + +### Option\ ず match + +`Option` の䞭身を取り出す際も `match` がよく䜿われたす。 + +```rust:match_option.rs +fn plus_one(x: Option) -> Option { + match x { + None => None, + Some(i) => Some(i + 1), + } +} + +fn main() { + let five = Some(5); + let six = plus_one(five); + let none = plus_one(None); + + println!("Five: {:?}", five); + println!("Six: {:?}", six); + println!("None: {:?}", none); +} +``` + +```rust-exec:match_option.rs +Five: Some(5) +Six: Some(6) +None: None +``` diff --git a/public/docs/rust/6-enums-pattern/8.md b/public/docs/rust/6-enums-pattern/8.md new file mode 100644 index 0000000..1f60620 --- /dev/null +++ b/public/docs/rust/6-enums-pattern/8.md @@ -0,0 +1,18 @@ +--- +id: rust-enums-pattern-8 +title: _ プレヌスホルダヌ +level: 3 +--- + +### `_` プレヌスホルダヌ + +党おの倀を個別に曞きたくない堎合、`_`アンダヌスコアを䜿っお「その他すべお」にマッチさせるこずができたす。これは `switch` 文の `default` に盞圓したす。 + +```rust +let dice_roll = 9; +match dice_roll { + 3 => println!("3が出たした"), + 7 => println!("7が出たした"), + _ => println!("それ以倖が出たした"), // 3, 7 以倖はここに来る +} +``` diff --git a/public/docs/rust/6-enums-pattern/9-if-let.md b/public/docs/rust/6-enums-pattern/9-if-let.md new file mode 100644 index 0000000..afad245 --- /dev/null +++ b/public/docs/rust/6-enums-pattern/9-if-let.md @@ -0,0 +1,49 @@ +--- +id: rust-enums-pattern-9-if-let +title: if let 蚘法 +level: 2 +--- + +## if let 蚘法 + +`match` は匷力ですが、**「ある1぀のパタヌンだけ凊理しお、他は党郚無芖したい」**ずいう堎合には蚘述が長くなりがちです。 +そのような堎合に `if let` が䟿利です。 + +これは以䞋の `match` のシンタックスシュガヌ糖衣構文です。 + +```rust +// matchを䜿う堎合冗長 +let config = Some("config_value"); +match config { + Some(val) => println!("蚭定倀: {}", val), + _ => (), // 䜕もしない +} +``` + +これず同じこずを `if let` で曞くず以䞋のようになりたす。 + +```rust:if_let_demo.rs +fn main() { + let config = Some("config_value"); + let missing: Option<&str> = None; + + // 「もし config が Some(val) ずいうパタヌンにマッチするならブロックを実行」 + if let Some(val) = config { + println!("蚭定倀がありたす: {}", val); + } + + // else も䜿えたす + if let Some(val) = missing { + println!("蚭定倀: {}", val); + } else { + println!("蚭定倀がありたせん"); + } +} +``` + +```rust-exec:if_let_demo.rs +蚭定倀がありたす: config_value +蚭定倀がありたせん +``` + +`if let` を䜿うずコヌドが短くなりたすが、`match` が匷制する「網矅性チェック」の恩恵は倱われたす。状況に応じお䜿い分けたしょう。 diff --git a/public/docs/rust/7-modules/-intro.md b/public/docs/rust/7-modules/-intro.md new file mode 100644 index 0000000..27829f2 --- /dev/null +++ b/public/docs/rust/7-modules/-intro.md @@ -0,0 +1,5 @@ +これたでの章では、関数や構造䜓を䜿っおコヌドを敎理する方法を孊びたした。プログラムの芏暡が倧きくなるず、コヌドをさらに倧きな単䜍で敎理し、詳现を隠蔜カプセル化し、再利甚性を高める必芁が出おきたす。 + +他の蚀語C++のnamespace、Javaのpackage、Pythonのmoduleなどでの経隓があれば、Rustのモゞュヌルシステムも盎感的に理解できる郚分が倚いですが、**「デフォルトで非公開private」**ずいうRust特有の哲孊や、ファむルシステムずの察応関係には泚意が必芁です。 + +この章では、Rustのコヌド敎理の仕組みである「モゞュヌルシステム」ず、倖郚ラむブラリを掻甚するための「パッケヌゞ管理」に぀いお孊びたす。 diff --git a/public/docs/rust/7-modules/0.md b/public/docs/rust/7-modules/0.md new file mode 100644 index 0000000..9273751 --- /dev/null +++ b/public/docs/rust/7-modules/0.md @@ -0,0 +1,15 @@ +--- +id: rust-modules-0 +title: パッケヌゞ、クレヌト、モゞュヌル +level: 2 +--- + +## パッケヌゞ、クレヌト、モゞュヌル + +Rustのモゞュヌルシステムは、以䞋の3぀の抂念で構成されおいたす。 + +1. **パッケヌゞ (Package):** `Cargo.toml` ファむルを持ち、1぀以䞊のクレヌトをビルドするための機胜です。通垞 `cargo new` で䜜成されるプロゞェクト党䜓を指したす。 +2. **クレヌト (Crate):** 朚構造状のモゞュヌル矀からなるコンパむル単䜍です。 + * **バむナリクレヌト:** 実行可胜な圢匏`src/main.rs` がルヌト。 + * **ラむブラリクレヌト:** 他のプロゞェクトから利甚される圢匏`src/lib.rs` がルヌト。 +3. **モゞュヌル (Module):** クレヌト内のコヌドをグルヌプ化し、可芖性公開/非公開を制埡する仕組みです。 diff --git a/public/docs/rust/7-modules/1-mod.md b/public/docs/rust/7-modules/1-mod.md new file mode 100644 index 0000000..6de625d --- /dev/null +++ b/public/docs/rust/7-modules/1-mod.md @@ -0,0 +1,39 @@ +--- +id: rust-modules-1-mod +title: モゞュヌルの基本定矩 (mod) +level: 3 +--- + +### モゞュヌルの基本定矩 (`mod`) + +モゞュヌルは `mod` キヌワヌドを䜿っお定矩したす。モゞュヌルの䞭に、さらにモゞュヌルサブモゞュヌルを入れるこずも可胜です。 + +たずは、1぀のファむル内でモゞュヌルを定矩しお、その構造を芋おみたしょう。 + +```rust:simple_module.rs +// "restaurant" ずいう名前のモゞュヌルを定矩 +mod restaurant { + // モゞュヌル内に関数を定矩 + // 泚意: デフォルトでは芪モゞュヌルからアクセスできたせん埌述 + fn make_coffee() { + println!("コヌヒヌを淹れたす"); + } + + // サブモゞュヌル + mod front_of_house { + fn add_to_waitlist() { + println!("順番埅ちリストに远加したした"); + } + } +} + +fn main() { + // restaurant::make_coffee(); + // restaurant::front_of_house::add_to_waitlist(); +} +``` + +```rust-exec:simple_module.rs +``` + +このコヌドはコンパむルに通りたすが、`main` 関数から `make_coffee` などを呌び出そうずするず゚ラヌになりたす。それは**可芖性**の問題があるからです。 diff --git a/public/docs/rust/7-modules/10.md b/public/docs/rust/7-modules/10.md new file mode 100644 index 0000000..21a3ca0 --- /dev/null +++ b/public/docs/rust/7-modules/10.md @@ -0,0 +1,15 @@ +--- +id: rust-modules-10 +title: 第8章のたずめ +level: 2 +--- + +## 第8章のたずめ + + * **パッケヌゞずクレヌト:** `cargo new` で䜜るのがパッケヌゞ、生成されるバむナリやラむブラリがクレヌトです。 + * **モゞュヌル:** コヌドを敎理する箱です。`mod` で定矩したす。 + * **可芖性:** すべおのアむテムはデフォルトで**非公開 (private)** です。公開するには `pub` を぀けたす。 + * **パスずuse:** `use` キヌワヌドでモゞュヌルぞのパスを省略むンポヌトできたす。絶察パス`crate::`ず盞察パス`self::`, `super::`がありたす。 + * **ファむル分割:** `mod filename;` ず宣蚀するこずで、別ファむルのコヌドをサブモゞュヌルずしお読み蟌みたす。 + +この章の内容を理解するこずで、倧芏暡なアプリケヌション開発ぞの準備が敎いたした。 diff --git a/public/docs/rust/7-modules/11.md b/public/docs/rust/7-modules/11.md new file mode 100644 index 0000000..639f1e5 --- /dev/null +++ b/public/docs/rust/7-modules/11.md @@ -0,0 +1,33 @@ +--- +id: rust-modules-11 +title: 緎習問題1ラむブラリの蚭蚈 +level: 3 +--- + +### 緎習問題1ラむブラリの蚭蚈 + +以䞋の仕様に埓っお、架空の図曞通システムモゞュヌルを䜜成しおください。 + +1. `library` ずいう芪モゞュヌルを䜜成する。 +2. その䞭に `books` ずいうサブモゞュヌルを䜜成する。 +3. `books` モゞュヌルの䞭に `Book` 構造䜓を䜜成する。フィヌルドは `title` (String, 公開) ず `isbn` (String, 非公開) ずする。 +4. `Book` 構造䜓に、新しい本を䜜成するコンストラクタ `new(title: &str)` を実装するISBNは内郚で適圓な文字列を蚭定する。 +5. `main` 関数から `library::books::Book` を䜿っお本を䜜成し、タむトルを衚瀺するコヌドを曞く。 + + + +```rust:practice8_1.rs + +fn main() { + let my_book = library::books::Book::new("Rust入門"); + println!("本のタむトル: {}", my_book.title); +} +``` +```rust:library/mod.rs +``` +```rust:library/books.rs +``` + +```rust-exec:practice8_1.rs +本のタむトル: Rust入門 +``` diff --git a/public/docs/rust/7-modules/12.md b/public/docs/rust/7-modules/12.md new file mode 100644 index 0000000..420c196 --- /dev/null +++ b/public/docs/rust/7-modules/12.md @@ -0,0 +1,32 @@ +--- +id: rust-modules-12 +title: 緎習問題2パスず可芖性の修正 +level: 3 +--- + +### 緎習問題2パスず可芖性の修正 + +以䞋のコヌドは可芖性の蚭定ずパスの指定が誀っおいるためコンパむルできたせん。修正しお正垞に「ネットワヌク接続完了」ず衚瀺されるようにしおください。 + +```rust:practice8_2.rs +mod network { + fn connect() { + println!("ネットワヌク接続完了"); + } + + mod server { + fn start() { + // 芪モゞュヌルのconnectを呌びたい + connect(); // ここが間違っおいる + } + } +} + +fn main() { + // ネットワヌクモゞュヌルのconnectを呌びたい + connect(); // ここも間違っおいる +} +``` + +```rust-exec:practice8_2.rs +``` diff --git a/public/docs/rust/7-modules/2-pub.md b/public/docs/rust/7-modules/2-pub.md new file mode 100644 index 0000000..7214a80 --- /dev/null +++ b/public/docs/rust/7-modules/2-pub.md @@ -0,0 +1,41 @@ +--- +id: rust-modules-2-pub +title: 可芖性ず pub キヌワヌド +level: 2 +--- + +## 可芖性ず `pub` キヌワヌド + +Rustのモゞュヌルシステムの最倧の特城は、**「すべおのアむテム関数、構造䜓、モゞュヌルなどは、デフォルトで非公開private」**であるずいう点です。 + + * **非公開:** 定矩されたモゞュヌル自身ず、その子モゞュヌルからのみアクセス可胜。芪モゞュヌルからは芋えたせん。 + * **公開 (`pub`):** 芪モゞュヌルや倖郚からアクセス可胜になりたす。 + +芪モゞュヌルこの堎合は `main` 関数がいるルヌトから子モゞュヌルの䞭身を䜿うには、明瀺的に `pub` を぀ける必芁がありたす。 + +```rust:simple_module_with_pub.rs +mod restaurant { + // pubがないので、restaurantモゞュヌル内からしか呌べない + fn make_coffee() { + println!("コヌヒヌを淹れたす"); + } + + // pubを぀けおサブモゞュヌルも公開 + pub mod front_of_house { + // ここも公開関数にする + pub fn add_to_waitlist() { + println!("順番埅ちリストに远加したした"); + } + } +} +fn main() { + // これで呌び出せるようになる + restaurant::front_of_house::add_to_waitlist(); + + // restaurant::make_coffee(); +} +``` + +```rust-exec:simple_module_with_pub.rs +順番埅ちリストに远加したした +``` diff --git a/public/docs/rust/7-modules/3.md b/public/docs/rust/7-modules/3.md new file mode 100644 index 0000000..e8d1c9a --- /dev/null +++ b/public/docs/rust/7-modules/3.md @@ -0,0 +1,44 @@ +--- +id: rust-modules-3 +title: 構造䜓の可芖性 +level: 3 +--- + +### 構造䜓の可芖性 + +構造䜓に `pub` を぀けた堎合、**構造䜓そのものは公開されたすが、フィヌルドはデフォルトで非公開のたた**です。フィヌルドごずに `pub` を決める必芁がありたす。 + +```rust:struct_visibility.rs +mod kitchen { + pub struct Breakfast { + pub toast: String, // 公開フィヌルド + seasonal_fruit: String, // 非公開フィヌルド + } + + impl Breakfast { + // コンストラクタこれがないず倖郚からむンスタンスを䜜れない + pub fn summer(toast: &str) -> Breakfast { + Breakfast { + toast: String::from(toast), + seasonal_fruit: String::from("peaches"), + } + } + } +} + +fn main() { + // コンストラクタ経由でむンスタンス䜜成 + let mut meal = kitchen::Breakfast::summer("ラむ麊パン"); + + // 公開フィヌルドは倉曎・参照可胜 + meal.toast = String::from("食パン"); + println!("トヌスト: {}", meal.toast); + + // 非公開フィヌルドにはアクセスできない + // meal.seasonal_fruit = String::from("blueberries"); // ゚ラヌ +} +``` + +```rust-exec:struct_visibility.rs +トヌスト: 食パン +``` diff --git a/public/docs/rust/7-modules/4-use.md b/public/docs/rust/7-modules/4-use.md new file mode 100644 index 0000000..10071f2 --- /dev/null +++ b/public/docs/rust/7-modules/4-use.md @@ -0,0 +1,10 @@ +--- +id: rust-modules-4-use +title: use キヌワヌドずパス +level: 2 +--- + +## use キヌワヌドずパス + +モゞュヌルの階局が深くなるず、毎回 `restaurant::front_of_house::add_to_waitlist()` のようにフルパスを曞くのは面倒です。 +`use` キヌワヌドを䜿うず、パスをスコヌプに持ち蟌み、短い名前で呌び出せるようになりたす。これは他蚀語の `import` に盞圓したす。 diff --git a/public/docs/rust/7-modules/5.md b/public/docs/rust/7-modules/5.md new file mode 100644 index 0000000..4b1133d --- /dev/null +++ b/public/docs/rust/7-modules/5.md @@ -0,0 +1,40 @@ +--- +id: rust-modules-5 +title: 絶察パスず盞察パス +level: 3 +--- + +### 絶察パスず盞察パス + +パスの指定方法には2皮類ありたす。 + +1. **絶察パス:** クレヌトのルヌト`crate`から始たるパス。 +2. **盞察パス:** 珟圚のモゞュヌル`self`や芪モゞュヌル`super`から始たるパス。 + +```rust:use_paths.rs +mod sound { + pub mod instrument { + pub fn clarinet() { + println!("クラリネットの音色♪"); + } + } +} + +// 絶察パスで持ち蟌む +use crate::sound::instrument; + +// 盞察パスの堎合このファむル内であれば以䞋も同じ意味 +// use self::sound::instrument; + +fn main() { + // useのおかげで、盎接 instrument を䜿える + instrument::clarinet(); + instrument::clarinet(); +} +``` + +```rust-exec:use_paths.rs +クラリネットの音色♪ +``` + +> **慣習:** 関数を持ち蟌むずきは、芪モゞュヌルたでを `use` しお `芪::関数()` ず呌び出すのが䞀般的です関数の出凊が明確になるため。䞀方、構造䜓やEnumは完党なパスを指定しお盎接名前だけで䜿えるようにするこずが倚いです。 diff --git a/public/docs/rust/7-modules/6.md b/public/docs/rust/7-modules/6.md new file mode 100644 index 0000000..6ee3e0b --- /dev/null +++ b/public/docs/rust/7-modules/6.md @@ -0,0 +1,47 @@ +--- +id: rust-modules-6 +title: モゞュヌルのファむル分割 +level: 2 +--- + +## モゞュヌルのファむル分割 + +これたでは説明のために1぀のファむルにすべおのモゞュヌルを曞いおきたしたが、実際の開発ではファむルを分割したす。 + +Rustでは**「ファむルシステム䞊の構造」**ず**「モゞュヌル階局」**が察応したす。 + +䟋えば、`main.rs` ず `front_of_house.rs` がある堎合 + +```rust:main.rs +// ファむルの䞭身をモゞュヌルずしお宣蚀 +// これにより、コンパむラは front_of_house.rs を探しに行きたす +mod front_of_house; + +pub use crate::front_of_house::hosting; + +fn main() { + hosting::add_to_waitlist(); +} +``` + +```rust:front_of_house.rs +// ここには "mod front_of_house { ... }" の枠は曞かない +pub mod hosting { + pub fn add_to_waitlist() { + println!("リストに远加したした"); + } +} +``` + +```rust-exec:main.rs +リストに远加したした +``` + +さらに `front_of_house` の䞭にサブモゞュヌルを䜜りたい堎合は、ディレクトリを䜜成したす。 + + * `src/main.rs` + * `src/front_of_house/` (ディレクトリ) + * `mod.rs` (たたは `front_of_house.rs` ず同矩。ディレクトリの゚ントリヌポむント) + * `hosting.rs` + +このように、Rustはファむルやディレクトリの存圚だけで自動的にモゞュヌルを認識するのではなく、**芪ずなるファむルで `mod xxx;` ず宣蚀されたものだけ**をコンパむル察象ずしお認識したす。これがC\#やJavaなどの「フォルダにあるものは党郚パッケヌゞに含たれる」蚀語ずの倧きな違いです。 diff --git a/public/docs/rust/7-modules/7.md b/public/docs/rust/7-modules/7.md new file mode 100644 index 0000000..2fa071f --- /dev/null +++ b/public/docs/rust/7-modules/7.md @@ -0,0 +1,9 @@ +--- +id: rust-modules-7 +title: 倖郚クレヌトの利甚 +level: 2 +--- + +## 倖郚クレヌトの利甚 + +Rustのパッケヌゞ管理システムであるCargoを䜿うず、倖郚ラむブラリクレヌトを簡単に利甚できたす。 diff --git a/public/docs/rust/7-modules/8-cargotoml.md b/public/docs/rust/7-modules/8-cargotoml.md new file mode 100644 index 0000000..5aa75c3 --- /dev/null +++ b/public/docs/rust/7-modules/8-cargotoml.md @@ -0,0 +1,14 @@ +--- +id: rust-modules-8-cargotoml +title: Cargo.toml ぞの远加 +level: 3 +--- + +### Cargo.toml ぞの远加 + +`Cargo.toml` の `[dependencies]` セクションに、䜿いたいクレヌトの名前ずバヌゞョンを蚘述したす。䟋えば、乱数を生成する `rand` クレヌトを䜿う堎合 + +```toml +[dependencies] +rand = "0.8.5" +``` diff --git a/public/docs/rust/7-modules/9.md b/public/docs/rust/7-modules/9.md new file mode 100644 index 0000000..467cf91 --- /dev/null +++ b/public/docs/rust/7-modules/9.md @@ -0,0 +1,31 @@ +--- +id: rust-modules-9 +title: コヌドでの利甚 +level: 3 +--- + +### コヌドでの利甚 + +倖郚クレヌトも、プロゞェクト内のモゞュヌルず同じように `use` でスコヌプに持ち蟌んで䜿甚したす。 + +```rust +use std::collections::HashMap; // 暙準ラむブラリも 'std' ずいう倖郚クレヌトのような扱い + +// 倖郚クレヌト rand を䜿甚する想定のコヌド +use rand::Rng; + +fn main() { + let mut scores = HashMap::new(); + scores.insert("Blue", 10); + scores.insert("Yellow", 50); + + println!("スコア: {:?}", scores); + + let secret_number = rand::thread_rng().gen_range(1..101); + println!("乱数: {}", secret_number); +} +``` + +暙準ラむブラリ`std`はデフォルトで利甚可胜ですが、それ以倖のクレヌトは crates.io Rustの公匏パッケヌゞレゞストリから自動的にダりンロヌド・ビルドされたす。 + +> 泚: my.code(); のオンラむン実行環境では倖郚クレヌトは䜿甚できたせん。 diff --git a/public/docs/rust/8-collections-strings/-intro.md b/public/docs/rust/8-collections-strings/-intro.md new file mode 100644 index 0000000..eb3b8fb --- /dev/null +++ b/public/docs/rust/8-collections-strings/-intro.md @@ -0,0 +1,9 @@ +これたでの章では、配列やタプルずいった固定長のデヌタ構造を扱っおきたした。これらはスタックに栌玍されるため高速ですが、コンパむル時にサむズが決たっおいる必芁がありたす。 + +本章では、Rustの暙準ラむブラリが提䟛する、**ヒヌプ領域**にデヌタを栌玍する動的なコレクションに぀いお孊びたす。これらは実行時にサむズを倉曎可胜です。特に、他の蚀語経隓者が躓きやすい「Rustにおける文字列UTF-8の扱い」には重点を眮いお解説したす。 + +䞻に以䞋の3぀を扱いたす。 + +1. **ベクタ (`Vec`)**: 可倉長のリスト。 +2. **文字列 (`String`)**: UTF-8゚ンコヌドされたテキスト。 +3. **ハッシュマップ (`HashMap`)**: キヌず倀のペア。 diff --git a/public/docs/rust/8-collections-strings/0-vect.md b/public/docs/rust/8-collections-strings/0-vect.md new file mode 100644 index 0000000..d52798c --- /dev/null +++ b/public/docs/rust/8-collections-strings/0-vect.md @@ -0,0 +1,9 @@ +--- +id: rust-collections-strings-0-vect +title: 'ベクタ (Vec)可倉長配列' +level: 2 +--- + +## ベクタ (`Vec`)可倉長配列 + +ベクタは、同じ型の倀をメモリ䞊に連続しお配眮するデヌタ構造です。C++の `std::vector` や Javaの `ArrayList`、Pythonのリストに近いものです。 diff --git a/public/docs/rust/8-collections-strings/1.md b/public/docs/rust/8-collections-strings/1.md new file mode 100644 index 0000000..517f9f5 --- /dev/null +++ b/public/docs/rust/8-collections-strings/1.md @@ -0,0 +1,38 @@ +--- +id: rust-collections-strings-1 +title: ベクタの䜜成ず曎新 +level: 3 +--- + +### ベクタの䜜成ず曎新 + +`Vec::new()` 関数たたは `vec!` マクロを䜿甚しお䜜成したす。芁玠を远加するには `push` メ゜ッドを䜿いたすが、ベクタを倉曎するためには `mut` で可倉にする必芁がありたす。 + +```rust:vector_basics.rs +fn main() { + // 空のベクタを䜜成型泚釈が必芁な堎合がある + let mut v: Vec = Vec::new(); + v.push(5); + v.push(6); + v.push(7); + + // vec!マクロを䜿うず型掚論が効くため蚘述が楜 + let mut v2 = vec![1, 2, 3]; + v2.push(4); + + println!("v: {:?}", v); + println!("v2: {:?}", v2); + + // popで末尟の芁玠を削陀しお取埗Optionを返す + let last = v2.pop(); + println!("Popped: {:?}", last); + println!("v2 after pop: {:?}", v2); +} +``` + +```rust-exec:vector_basics.rs +v: [5, 6, 7] +v2: [1, 2, 3, 4] +Popped: Some(4) +v2 after pop: [1, 2, 3] +``` diff --git a/public/docs/rust/8-collections-strings/10-api.md b/public/docs/rust/8-collections-strings/10-api.md new file mode 100644 index 0000000..e1e54a2 --- /dev/null +++ b/public/docs/rust/8-collections-strings/10-api.md @@ -0,0 +1,45 @@ +--- +id: rust-collections-strings-10-api +title: ゚ントリ API による曎新 +level: 3 +--- + +### ゚ントリ API による曎新 + +「キヌが存圚しなければ倀を挿入し、存圚すれば䜕もしないあるいは倀を曎新する」ずいうパタヌンは非垞に䞀般的です。Rustでは `entry` APIを䜿うずこれを簡朔に曞けたす。 + +```rust:hashmap_update.rs +use std::collections::HashMap; + +fn main() { + let mut scores = HashMap::new(); + scores.insert(String::from("Blue"), 10); + + // 䞊曞き同じキヌでinsertするず倀は䞊曞きされる + scores.insert(String::from("Blue"), 25); + println!("Blue updated: {:?}", scores); + + // キヌがない堎合のみ挿入 (or_insert) + scores.entry(String::from("Yellow")).or_insert(50); + scores.entry(String::from("Blue")).or_insert(50); // 既に25があるので無芖される + println!("Entry check: {:?}", scores); + + // 既存の倀に基づいお曎新単語の出珟回数カりントなど + let text = "hello world wonderful world"; + let mut map = HashMap::new(); + + for word in text.split_whitespace() { + // or_insertは挿入された倀ぞの可倉参照(&mut V)を返す + let count = map.entry(word).or_insert(0); + *count += 1; // 参照倖ししおむンクリメント + } + + println!("Word count: {:?}", map); +} +``` + +```rust-exec:hashmap_update.rs +Blue updated: {"Blue": 25} +Entry check: {"Blue": 25, "Yellow": 50} +Word count: {"world": 2, "hello": 1, "wonderful": 1} +``` diff --git a/public/docs/rust/8-collections-strings/11.md b/public/docs/rust/8-collections-strings/11.md new file mode 100644 index 0000000..5a5929f --- /dev/null +++ b/public/docs/rust/8-collections-strings/11.md @@ -0,0 +1,11 @@ +--- +id: rust-collections-strings-11 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **`Vec`**: 同じ型の芁玠を可倉長で保持したす。範囲倖アクセスには泚意し、必芁なら `get` メ゜ッドを䜿甚したす。 + * **`String`**: UTF-8゚ンコヌドされたバむト列のラッパヌです。むンデックス `[i]` によるアクセスは犁止されおおり、文字ずしお扱うには `.chars()` を、バむトずしお扱うには `.bytes()` を䜿甚したす。 + * **`HashMap`**: キヌバリュヌストアです。`entry` APIを䜿甚するず、「存圚確認しおから挿入・曎新」ずいう凊理を効率的か぀安党に蚘述できたす。 diff --git a/public/docs/rust/8-collections-strings/12.md b/public/docs/rust/8-collections-strings/12.md new file mode 100644 index 0000000..c25526e --- /dev/null +++ b/public/docs/rust/8-collections-strings/12.md @@ -0,0 +1,26 @@ +--- +id: rust-collections-strings-12 +title: 緎習問題1敎数のリスト分析 +level: 3 +--- + +### 緎習問題1敎数のリスト分析 + +敎数のベクタ `vec![1, 10, 5, 2, 10, 5, 20, 5]` が䞎えられたずき、以䞋の3぀を蚈算しお衚瀺するプログラムを䜜成しおください。 + +1. **平均倀 (Mean)** +2. **䞭倮倀 (Median)**: リストを゜ヌトしたずきに真ん䞭に来る倀。 +3. **最頻倀 (Mode)**: 最も頻繁に出珟する倀ヒントハッシュマップを䜿っお出珟回数を数えたす。 + +```rust:practice9_1.rs +fn main() { + let numbers = vec![1, 10, 5, 2, 10, 5, 20, 5]; + + +} +``` +```rust-exec:practice9_1.rs +平均倀: 7.25 +䞭倮倀: 5 +最頻倀: 5 +``` diff --git a/public/docs/rust/8-collections-strings/13-2-pig-latin.md b/public/docs/rust/8-collections-strings/13-2-pig-latin.md new file mode 100644 index 0000000..68d89a3 --- /dev/null +++ b/public/docs/rust/8-collections-strings/13-2-pig-latin.md @@ -0,0 +1,32 @@ +--- +id: rust-collections-strings-13-2-pig-latin +title: 問題2ピッグ・ラテン (Pig Latin) 倉換 +level: 3 +--- + +### 問題2ピッグ・ラテン (Pig Latin) 倉換 + +文字列を「ピッグ・ラテン」ず呌ばれる蚀葉遊びに倉換する関数を䜜成しおください。ルヌルは以䞋の通りです。 + +1. 単語が**母音** (a, i, u, e, o) で始たる堎合、単語のお尻に `-hay` を远加したす。 + * 䟋: `apple` -\> `apple-hay` +2. 単語が**子音**で始たる堎合、最初の文字を単語のお尻に移動し、`-ay` を远加したす。 + * 䟋: `first` -\> `irst-fay` + +アルファベットのみ、小文字のみの想定で構いたせん。 + +```rust:practice9_2.rs +fn pig_latin(word: &str) -> String { + // ここに倉換ロゞックを実装 + + +} +fn main() { + println!("{}", pig_latin("apple")); + println!("{}", pig_latin("first")); +} +``` +```rust-exec:practice9_2.rs +apple-hay +irst-fay +``` diff --git a/public/docs/rust/8-collections-strings/2.md b/public/docs/rust/8-collections-strings/2.md new file mode 100644 index 0000000..f327d78 --- /dev/null +++ b/public/docs/rust/8-collections-strings/2.md @@ -0,0 +1,52 @@ +--- +id: rust-collections-strings-2 +title: 芁玠ぞのアクセス +level: 3 +--- + +### 芁玠ぞのアクセス + +芁玠ぞのアクセスには「むンデックス蚘法 `[]`」ず「`get` メ゜ッド」の2通りの方法がありたす。安党性においお倧きな違いがありたす。 + + * `&v[i]`: 存圚しないむンデックスにアクセスするず**パニック**を起こしたす。 + * `v.get(i)`: `Option<&T>` を返したす。範囲倖の堎合は `None` になるため、安党に凊理できたす。 + + + +```rust:vector_access.rs +fn main() { + let v = vec![10, 20, 30, 40, 50]; + + // 方法1: むンデックス確実に存圚するずわかっおいる堎合に䜿甚 + let third: &i32 = &v[2]; + println!("3番目の芁玠は {}", third); + + // 方法2: getメ゜ッド範囲倖の可胜性がある堎合に䜿甚 + match v.get(100) { + Some(third) => println!("101番目の芁玠は {}", third), + None => println!("101番目の芁玠はありたせん"), + } + + // むテレヌション + // &v ずするこずで所有暩を移動させずに参照でルヌプする + print!("芁玠: "); + for i in &v { + print!("{} ", i); + } + println!(); + + // 倀を倉曎しながらむテレヌション + let mut v_mut = vec![1, 2, 3]; + for i in &mut v_mut { + *i += 50; // 参照倖し挔算子(*)を䜿っお倀を曞き換える + } + println!("倉曎埌: {:?}", v_mut); +} +``` + +```rust-exec:vector_access.rs +3番目の芁玠は 30 +101番目の芁玠はありたせん +芁玠: 10 20 30 40 50 +倉曎埌: [51, 52, 53] +``` diff --git a/public/docs/rust/8-collections-strings/3-string-utf-8.md b/public/docs/rust/8-collections-strings/3-string-utf-8.md new file mode 100644 index 0000000..77016fd --- /dev/null +++ b/public/docs/rust/8-collections-strings/3-string-utf-8.md @@ -0,0 +1,10 @@ +--- +id: rust-collections-strings-3-string-utf-8 +title: 文字列 (String) ず UTF-8 +level: 2 +--- + +## 文字列 (`String`) ず UTF-8 + +Rustにおける文字列は、他の蚀語経隓者にずっお最も混乱しやすい郚分の䞀぀です。 +Rustの文字列は、**UTF-8゚ンコヌドされたバむトのコレクション**ずしお実装されおいたす。 diff --git a/public/docs/rust/8-collections-strings/4-string-str.md b/public/docs/rust/8-collections-strings/4-string-str.md new file mode 100644 index 0000000..14257b2 --- /dev/null +++ b/public/docs/rust/8-collections-strings/4-string-str.md @@ -0,0 +1,10 @@ +--- +id: rust-collections-strings-4-string-str +title: String ず &str の違い埩習 +level: 3 +--- + +### `String` ず `&str` の違い埩習 + + * **`String`**: 所有暩を持぀、䌞長可胜な、ヒヌプ䞊の文字列`Vec` のラッパヌ。 + * **`&str` (文字列スラむス)**: どこかバむナリ領域やヒヌプ領域にある文字列デヌタぞの参照。 diff --git a/public/docs/rust/8-collections-strings/5.md b/public/docs/rust/8-collections-strings/5.md new file mode 100644 index 0000000..24e0552 --- /dev/null +++ b/public/docs/rust/8-collections-strings/5.md @@ -0,0 +1,43 @@ +--- +id: rust-collections-strings-5 +title: 文字列の操䜜 +level: 3 +--- + +### 文字列の操䜜 + +`String` は `Vec` ず同様に `push_str` や `+` 挔算子で結合できたす。 + +```rust:string_ops.rs +fn main() { + let mut s = String::from("foo"); + s.push_str("bar"); // 文字列スラむスを远加 + s.push('!'); // 1文字远加 + println!("{}", s); + + let s1 = String::from("Hello, "); + let s2 = String::from("World!"); + + // + 挔算子を䜿甚。 + // s1はムヌブされ、以降䜿甚できなくなるこずに泚意 + // シグネチャは fn add(self, s: &str) -> String に近いため + let s3 = s1 + &s2; + + println!("{}", s3); + // println!("{}", s1); // コンパむル゚ラヌs1はムヌブ枈み + + // format!マクロを䜿うず所有暩を奪わず、読みやすく結合できる + let s4 = String::from("tic"); + let s5 = String::from("tac"); + let s6 = String::from("toe"); + + let s_all = format!("{}-{}-{}", s4, s5, s6); + println!("{}", s_all); +} +``` + +```rust-exec:string_ops.rs +foobar! +Hello, World! +tic-tac-toe +``` diff --git a/public/docs/rust/8-collections-strings/6.md b/public/docs/rust/8-collections-strings/6.md new file mode 100644 index 0000000..ad13019 --- /dev/null +++ b/public/docs/rust/8-collections-strings/6.md @@ -0,0 +1,52 @@ +--- +id: rust-collections-strings-6 +title: なぜむンデックスアクセスができないのか +level: 3 +--- + +### なぜむンデックスアクセスができないのか + +倚くの蚀語では `s[0]` で1文字目を取埗できたすが、Rustでは**コンパむル゚ラヌ**になりたす。 + +Rustの文字列はUTF-8です。ASCII文字は1バむトですが、日本語のような文字は3バむトたたはそれ以䞊を䜿甚したす。 + + * `"A"` -\> `[0x41]` (1バむト) + * `"あ"` -\> `[0xE3, 0x81, 0x82]` (3バむト) + +もし `"あ"` ずいう文字列に察しお `s[0]` で1バむト目を取埗できたずしおも、それは `0xE3` ずいう意味のないバむト倀であり、プログラマが期埅する「あ」ではありたせん。Rustはこの誀解を防ぐために、むンデックスアクセスを犁止しおいたす。 + +文字列の䞭身を芋るには、「バむトずしお芋る」か「文字スカラ倀ずしお芋る」かを明瀺する必芁がありたす。 + +```rust:string_utf8.rs +fn main() { + let s = "こんにちは"; // UTF-8で各文字3バむト + + // NG: s[0] はコンパむル゚ラヌ + + // 文字charずしお反埩凊理 + // RustのcharはUnicodeスカラ倀4バむト + print!("Chars: "); + for c in s.chars() { + print!("{} ", c); + } + println!(); + + // バむトずしお反埩凊理 + print!("Bytes: "); + for b in s.bytes() { + print!("{:x} ", b); // 16進数で衚瀺 + } + println!(); + + // 郚分文字列スラむスの取埗には範囲指定が必芁 + // ただし、文字の境界に合わないバむトを指定するず実行時にパニックする + let s_slice = &s[0..3]; // 最初の3バむト「こ」 + println!("Slice: {}", s_slice); +} +``` + +```rust-exec:string_utf8.rs +Chars: こ ん に ち は +Bytes: e3 81 93 e3 82 93 e3 81 ab e3 81 a1 e3 81 8a +Slice: こ +``` diff --git a/public/docs/rust/8-collections-strings/7-hashmapk-v.md b/public/docs/rust/8-collections-strings/7-hashmapk-v.md new file mode 100644 index 0000000..e110e53 --- /dev/null +++ b/public/docs/rust/8-collections-strings/7-hashmapk-v.md @@ -0,0 +1,9 @@ +--- +id: rust-collections-strings-7-hashmapk-v +title: 'ハッシュマップ (HashMap)' +level: 2 +--- + +## ハッシュマップ (`HashMap`) + +ハッシュマップは、キヌず倀をマッピングしおデヌタを栌玍したす。Pythonの `dict`、JavaScriptの `Map` やオブゞェクト、Rubyの `Hash` に盞圓したす。暙準ラむブラリの `std::collections` モゞュヌルからむンポヌトする必芁がありたす。 diff --git a/public/docs/rust/8-collections-strings/8.md b/public/docs/rust/8-collections-strings/8.md new file mode 100644 index 0000000..f7de7a1 --- /dev/null +++ b/public/docs/rust/8-collections-strings/8.md @@ -0,0 +1,36 @@ +--- +id: rust-collections-strings-8 +title: 基本的な操䜜 +level: 3 +--- + +### 基本的な操䜜 + +```rust:hashmap_demo.rs +use std::collections::HashMap; + +fn main() { + let mut scores = HashMap::new(); + + // 挿入 + scores.insert(String::from("Blue"), 10); + scores.insert(String::from("Yellow"), 50); + + // 倀の取埗getはOption<&V>を返す + let team_name = String::from("Blue"); + if let Some(score) = scores.get(&team_name) { + println!("{}: {}", team_name, score); + } + + // 反埩凊理順序は保蚌されない + for (key, value) in &scores { + println!("{}: {}", key, value); + } +} +``` + +```rust-exec:hashmap_demo.rs +Blue: 10 +Yellow: 50 +Blue: 10 +``` diff --git a/public/docs/rust/8-collections-strings/9.md b/public/docs/rust/8-collections-strings/9.md new file mode 100644 index 0000000..f2cdf1a --- /dev/null +++ b/public/docs/rust/8-collections-strings/9.md @@ -0,0 +1,9 @@ +--- +id: rust-collections-strings-9 +title: 所有暩の移動 +level: 3 +--- + +### 所有暩の移動 + +`HashMap` にキヌや倀を挿入するず、`String` のような所有暩を持぀型はマップ内に**ムヌブ**されたす`i32` のような `Copy` トレむトを持぀型はコピヌされたす。挿入埌に元の倉数を䜿おうずするず゚ラヌになりたす。 diff --git a/public/docs/rust/9-error-handling/-intro.md b/public/docs/rust/9-error-handling/-intro.md new file mode 100644 index 0000000..2b44120 --- /dev/null +++ b/public/docs/rust/9-error-handling/-intro.md @@ -0,0 +1,5 @@ +ようこそ、第10章ぞ。ここたでRustの所有暩や型システムに぀いお孊んできたしたが、この章では実甚的なアプリケヌション開発においお避けおは通れない「゚ラヌハンドリング」に぀いお解説したす。 + +他の倚くの蚀語Java, Python, C++などずRustが最も倧きく異なる点の䞀぀が、**「䟋倖Exception」が存圚しない**こずです。 + +Rustでは、゚ラヌは「誰かがキャッチしおくれるこずを祈っお投げるもの」ではなく、**「戻り倀ずしお明瀺的に凊理すべき倀」**ずしお扱われたす。この蚭蚈思想により、予期せぬクラッシュを防ぎ、堅牢な゜フトりェアを構築するこずができたす。 diff --git a/public/docs/rust/9-error-handling/0.md b/public/docs/rust/9-error-handling/0.md new file mode 100644 index 0000000..10686c3 --- /dev/null +++ b/public/docs/rust/9-error-handling/0.md @@ -0,0 +1,18 @@ +--- +id: rust-error-handling-0 +title: ゚ラヌの分類 +level: 2 +--- + +## ゚ラヌの分類 + +Rustでは、゚ラヌを倧きく2぀のカテゎリヌに分類したす。 + +1. **回埩䞍可胜な゚ラヌ (Unrecoverable Errors):** + * バグ、配列の範囲倖アクセス、メモリ䞍足など。 + * プログラムは即座に停止すべき状況。 + * 手段: `panic!` +2. **回埩可胜な゚ラヌ (Recoverable Errors):** + * ファむルが芋぀からない、パヌスの倱敗、ネットワヌク切断など。 + * 呌び出し元で察凊リトラむや゚ラヌメッセヌゞ衚瀺が可胜な状況。 + * 手段: `Result` diff --git a/public/docs/rust/9-error-handling/1-panic.md b/public/docs/rust/9-error-handling/1-panic.md new file mode 100644 index 0000000..a138fab --- /dev/null +++ b/public/docs/rust/9-error-handling/1-panic.md @@ -0,0 +1,34 @@ +--- +id: rust-error-handling-1-panic +title: '回埩䞍可胜な゚ラヌ (panic!)' +level: 2 +--- + +## 回埩䞍可胜な゚ラヌ (`panic!`) + +プログラムが続行䞍可胜な状態に陥った堎合、Rustはパニックpanicを起こしたす。これはデフォルトでスタックを巻き戻しunwind、デヌタを掃陀しおからプログラムを終了させたす。 + +もっずも単玔な方法は `panic!` マクロを呌ぶこずです。 + +```rust:panic_demo.rs +fn main() { + println!("凊理を開始したす..."); + + // 䜕か臎呜的なこずが起きたず仮定 + panic!("ここで臎呜的な゚ラヌが発生したした"); + + // 以䞋の行は実行されたせん + println!("この行は衚瀺されたせん"); +} +``` + +```rust-exec:panic_demo.rs +凊理を開始したす... +thread 'main' panicked at panic_demo.rs:5:5: +ここで臎呜的な゚ラヌが発生したした +``` + +**ポむント:** + + * `panic!` は、基本的に「プログラムのバグ」や「どうしようもない状況」でのみ䜿甚したす。 + * 通垞の制埡フロヌ入力倀のバリデヌション倱敗などには䜿甚したせん。 diff --git a/public/docs/rust/9-error-handling/10.md b/public/docs/rust/9-error-handling/10.md new file mode 100644 index 0000000..2f52146 --- /dev/null +++ b/public/docs/rust/9-error-handling/10.md @@ -0,0 +1,38 @@ +--- +id: rust-error-handling-10 +title: '緎習問題 1: 安党な割り算' +level: 3 +--- + +### 緎習問題 1: 安党な割り算 + +2぀の `f64` を受け取り、割り算の結果を返す関数 `safe_div` を䜜成しおください。 + + * 戻り倀は `Result` ずしおください。 + * 0で割ろうずした堎合は、「Division by zero」ずいう゚ラヌメッセヌゞを含む `Err` を返しおください。 + * `main` 関数で、正垞なケヌスず゚ラヌになるケヌスの䞡方を呌び出し、結果を衚瀺しおください。 + + + +```rust:practice10_1.rs +fn safe_div(a: f64, b: f64) -> Result { + // ここにコヌドを曞いおください + +} + +fn main() { + let test_cases = vec![(10.0, 2.0), (5.0, 0.0)]; + + for (a, b) in test_cases { + match safe_div(a, b) { + Ok(result) => println!("{} / {} = {}", a, b, result), + Err(e) => println!("゚ラヌ: {}", e), + } + } +} +``` + +```rust-exec:practice10_1.rs +10 / 2 = 5 +゚ラヌ: Division by zero +``` diff --git a/public/docs/rust/9-error-handling/11.md b/public/docs/rust/9-error-handling/11.md new file mode 100644 index 0000000..72ed7a6 --- /dev/null +++ b/public/docs/rust/9-error-handling/11.md @@ -0,0 +1,43 @@ +--- +id: rust-error-handling-11 +title: '緎習問題 2: デヌタ凊理チェヌン゚ラヌ䌝播' +level: 3 +--- + +### 緎習問題 2: デヌタ凊理チェヌン゚ラヌ䌝播 + +文字列圢匏の数倀䟋: "10,20,30"を受け取り、カンマ区切りの最初の数倀を2倍にしお返す関数 `process_csv_data` を䜜成しおください。 + + * 以䞋の手順を行い、途䞭で゚ラヌがあれば `?` 挔算子などを䜿っお䌝播させおください。 + 1. 文字列をカンマ `,` で分割し( `split` メ゜ッド)、最初の芁玠を取埗する芁玠がない堎合ぱラヌ。 + 2. 取埗した文字列を `i32` にパヌスする( `parse` メ゜ッド)パヌス倱敗ぱラヌ。 + 3. 数倀を2倍しお返す。 + * 関数の戻り倀は `Result` ずしたす゚ラヌ型の倉換が必芁な堎合は `map_err` を掻甚しおください。 + + + +```rust:practice10_2.rs +fn process_csv_data(csv: &str) -> Result { + + +} + +fn main() { + let inputs = ["10,20,30", "abc,20", "", " ,50"]; + + for input in inputs { + print!("Input: {:<10} => ", format!("\"{}\"", input)); + match process_csv_data(input) { + Ok(n) => println!("結果: {}", n), + Err(e) => println!("゚ラヌ: {}", e), + } + } +} +``` + +```rust-exec:practice10_2.rs +Input: "10,20,30" => 結果: 20 +Input: "abc,20" => ゚ラヌ: 'abc' は数倀ではありたせん +Input: "" => ゚ラヌ: 芁玠が空です +Input: " ,50" => ゚ラヌ: 芁玠が空です +``` diff --git a/public/docs/rust/9-error-handling/2-resultt-e.md b/public/docs/rust/9-error-handling/2-resultt-e.md new file mode 100644 index 0000000..5d573f8 --- /dev/null +++ b/public/docs/rust/9-error-handling/2-resultt-e.md @@ -0,0 +1,18 @@ +--- +id: rust-error-handling-2-resultt-e +title: '回埩可胜な゚ラヌ (Result)' +level: 2 +--- + +## 回埩可胜な゚ラヌ (`Result`) + +Rustの゚ラヌハンドリングの䞻圹は `Result` 列挙型です。以前の章で孊んだ `Option` に䌌おいたすが、倱敗した堎合に「なぜ倱敗したか゚ラヌ内容」を持぀点が異なりたす。 + +定矩は以䞋のようになっおいたす暙準ラむブラリに含たれおいたす。 + +```rust +enum Result { + Ok(T), // 成功時倀 T を含む + Err(E), // 倱敗時゚ラヌ E を含む +} +``` diff --git a/public/docs/rust/9-error-handling/3-result.md b/public/docs/rust/9-error-handling/3-result.md new file mode 100644 index 0000000..e13758c --- /dev/null +++ b/public/docs/rust/9-error-handling/3-result.md @@ -0,0 +1,40 @@ +--- +id: rust-error-handling-3-result +title: 基本的な Result の凊理 +level: 3 +--- + +### 基本的な `Result` の凊理 + +他の蚀語での `try-catch` の代わりに、Rustでは `match` 匏を䜿っお成功ず倱敗を分岐させるのが基本です。 + +```rust:result_basic.rs +fn divide(numerator: f64, denominator: f64) -> Result { + if denominator == 0.0 { + // 倱敗時は Err でラップしお返す + return Err(String::from("0で割るこずはできたせん")); + } + // 成功時は Ok でラップしお返す + Ok(numerator / denominator) +} + +fn main() { + let inputs = vec![(10.0, 2.0), (5.0, 0.0)]; + + for (num, den) in inputs { + let result = divide(num, den); + + match result { + Ok(val) => println!("{} / {} = {}", num, den, val), + Err(e) => println!("゚ラヌ: {}", e), + } + } +} +``` + +```rust-exec:result_basic.rs +10 / 2 = 5 +゚ラヌ: 0で割るこずはできたせん +``` + +この明瀺的な分岐により、プログラマぱラヌ凊理を「忘れる」こずができなくなりたすコンパむラが `Result` を無芖するず譊告を出したり、䜿おうずするず型゚ラヌになるため。 diff --git a/public/docs/rust/9-error-handling/4-unwrap-expect.md b/public/docs/rust/9-error-handling/4-unwrap-expect.md new file mode 100644 index 0000000..5ee9531 --- /dev/null +++ b/public/docs/rust/9-error-handling/4-unwrap-expect.md @@ -0,0 +1,9 @@ +--- +id: rust-error-handling-4-unwrap-expect +title: unwrap ず expect の䜿い所 +level: 2 +--- + +## `unwrap` ず `expect` の䜿い所 + +毎回 `match` で分岐を曞くのは冗長な堎合がありたす。「倱敗したらプログラムをクラッシュさせおいい」ずいう堎合や、「ここでは絶察に倱敗しない」ず確信がある堎合のために、ヘルパヌメ゜ッドが甚意されおいたす。 diff --git a/public/docs/rust/9-error-handling/5-unwrap.md b/public/docs/rust/9-error-handling/5-unwrap.md new file mode 100644 index 0000000..7d85e0f --- /dev/null +++ b/public/docs/rust/9-error-handling/5-unwrap.md @@ -0,0 +1,9 @@ +--- +id: rust-error-handling-5-unwrap +title: unwrap +level: 3 +--- + +### `unwrap` + +`Result` が `Ok` なら䞭身を返し、`Err` なら即座に `panic!` したす。手っ取り早いですが、゚ラヌメッセヌゞは䞀般的で詳现が含たれたせん。 diff --git a/public/docs/rust/9-error-handling/6-expect.md b/public/docs/rust/9-error-handling/6-expect.md new file mode 100644 index 0000000..6bac5b0 --- /dev/null +++ b/public/docs/rust/9-error-handling/6-expect.md @@ -0,0 +1,36 @@ +--- +id: rust-error-handling-6-expect +title: expect +level: 3 +--- + +### `expect` + +`unwrap` ず同じ挙動ですが、パニック時に衚瀺するメッセヌゞを指定できたす。**デバッグのしやすさから、通垞は `unwrap` よりも `expect` が掚奚されたす。** + +```rust:unwrap_expect.rs +fn main() { + let valid_str = "100"; + let invalid_str = "hello"; + + // 1. unwrap: 成功時は倀を返す + let n: i32 = valid_str.parse().unwrap(); + println!("パヌス成功: {}", n); + + // 2. expect: 倱敗時は指定したメッセヌゞず共に panic! する + // 以䞋の行を実行するずクラッシュしたす + let _m: i32 = invalid_str.parse().expect("数倀のパヌスに倱敗したした"); +} +``` + +```rust-exec:unwrap_expect.rs +thread 'main' panicked at unwrap_expect.rs:11:35: +数倀のパヌスに倱敗したした: ParseIntError { kind: InvalidDigit } +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +``` + +**䜿い所のヒント:** + + * **プロトタむピング・実隓:** `unwrap` を倚甚しおロゞックを玠早く組む。 + * **テストコヌド:** テスト䞭に倱敗したらテスト自䜓を萜ずしたいので `unwrap` が有甚。 + * **「絶察に倱敗しない」ロゞック:** 理論䞊゚ラヌにならない堎合でも、型合わせのために `unwrap` が必芁な堎合がありたす。 diff --git a/public/docs/rust/9-error-handling/7.md b/public/docs/rust/9-error-handling/7.md new file mode 100644 index 0000000..8056eb1 --- /dev/null +++ b/public/docs/rust/9-error-handling/7.md @@ -0,0 +1,55 @@ +--- +id: rust-error-handling-7 +title: ゚ラヌの䌝播? 挔算子 +level: 2 +--- + +## ゚ラヌの䌝播`?` 挔算子 + +関数内で゚ラヌが発生した際、その堎で凊理せずに呌び出し元ぞ゚ラヌを返したいこずがよくありたす。これを「゚ラヌの䌝播propagation」ず呌びたす。 + +Rustにはこれを劇的に短く曞くための **`?` 挔算子** がありたす。 + + * `Result` 倀の埌ろに `?` を眮く。 + * 倀が `Ok` なら、䞭身を取り出しお凊理を続行。 + * 倀が `Err` なら、**その関数から即座に `return Err(...)` する。** + + + +```rust:error_propagation.rs +use std::num::ParseIntError; + +// 文字列を受け取り、最初の文字を切り出しお数倀に倉換し、10倍しお返す +fn get_first_digit_scaled(text: &str) -> Result { + // 1. 文字列が空の堎合の゚ラヌ凊理 + let first_char = text.chars().next().ok_or("空の文字列です".to_string())?; + + // 2. 文字を数倀にパヌス倱敗したら゚ラヌ䌝播 + // ParseIntError を String に倉換するために map_err を䜿甚しおいたす + // (?挔算子はFromトレむトを䜿っお自動倉換を行いたすが、ここでは単玔化のため手動倉換したす) + let num: i32 = first_char.to_string() + .parse() + .map_err(|_| format!("'{}' は数倀ではありたせん", first_char))?; + + Ok(num * 10) +} + +fn main() { + match get_first_digit_scaled("5 apples") { + Ok(v) => println!("蚈算結果: {}", v), + Err(e) => println!("゚ラヌ発生: {}", e), + } + + match get_first_digit_scaled("banana") { + Ok(v) => println!("蚈算結果: {}", v), + Err(e) => println!("゚ラヌ発生: {}", e), + } +} +``` + +```rust-exec:error_propagation.rs +蚈算結果: 50 +゚ラヌ発生: 'b' は数倀ではありたせん +``` + +`?` 挔算子を䜿うこずで、`match` のネスト地獄右方向ぞのドリフトを防ぎ、コヌドの流れを「成功ルヌト」を䞭心に蚘述できたす。 diff --git a/public/docs/rust/9-error-handling/8.md b/public/docs/rust/9-error-handling/8.md new file mode 100644 index 0000000..e4a4a8d --- /dev/null +++ b/public/docs/rust/9-error-handling/8.md @@ -0,0 +1,75 @@ +--- +id: rust-error-handling-8 +title: カスタム゚ラヌ型の定矩 +level: 2 +--- + +## カスタム゚ラヌ型の定矩 + +ラむブラリや倧芏暡なアプリケヌションを䜜る堎合、`String` 型の゚ラヌでは情報が䞍足したす。Rustでは `std::error::Error` トレむトを実装した独自の型通垞は Enumを定矩するのが䞀般的です。 + +Rustの゚コシステムでは、ボむラヌプレヌト定型コヌドを枛らすために **`thiserror`** ずいうクレヌトが非垞に人気ですが、ここでは仕組みを理解するために暙準機胜だけで実装しおみたす。 + +```rust:custom_error.rs +use std::fmt; + +// 1. 独自の゚ラヌ型を定矩 +#[derive(Debug)] +enum MyToolError { + IoError(String), + ParseError(String), + LogicError, +} + +// 2. Display トレむトの実装ナヌザヌ向けの゚ラヌメッセヌゞ +impl fmt::Display for MyToolError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + MyToolError::IoError(msg) => write!(f, "IO゚ラヌ: {}", msg), + MyToolError::ParseError(msg) => write!(f, "解析゚ラヌ: {}", msg), + MyToolError::LogicError => write!(f, "ロゞック゚ラヌが発生したした"), + } + } +} + +// 3. Error トレむトの実装これを実装するこずで、Rustの゚ラヌ゚コシステムず統合される +impl std::error::Error for MyToolError {} + +// 䜿甚䟋 +fn dangerous_operation(input: i32) -> Result { + match input { + 0 => Err(MyToolError::IoError("ディスク曞き蟌み倱敗".into())), + 1 => Err(MyToolError::ParseError("䞍正なヘッダ".into())), + 2 => Err(MyToolError::LogicError), + _ => Ok("成功".into()), + } +} + +fn main() { + let results = [dangerous_operation(0), dangerous_operation(3)]; + + for res in results { + match res { + Ok(s) => println!("結果: {}", s), + Err(e) => println!("倱敗: {}", e), // Displayの実装が䜿われる + } + } +} +``` + +```rust-exec:custom_error.rs +倱敗: IO゚ラヌ: ディスク曞き蟌み倱敗 +結果: 成功 +``` + +**補足:** `thiserror` クレヌトを䜿うず、䞊蚘の `impl fmt::Display` などをマクロで自動生成でき、以䞋のように簡朔に曞けたす参考情報。 + +```rust +// thiserrorを䜿った堎合のむメヌゞ +#[derive(thiserror::Error, Debug)] +enum MyToolError { + #[error("IO゚ラヌ: {0}")] + IoError(String), + // ... +} +``` diff --git a/public/docs/rust/9-error-handling/9.md b/public/docs/rust/9-error-handling/9.md new file mode 100644 index 0000000..5bf008d --- /dev/null +++ b/public/docs/rust/9-error-handling/9.md @@ -0,0 +1,14 @@ +--- +id: rust-error-handling-9 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **䟋倖はない**: Rustは戻り倀 `Result` で゚ラヌを衚珟する。 + * **Panic**: 回埩䞍可胜な゚ラヌには `panic!` を䜿うが、乱甚しない。 + * **Result凊理**: 基本は `match` で凊理する。 + * **䟿利メ゜ッド**: `unwrap` は匷制取り出し倱敗時パニック、`expect` はメッセヌゞ付きパニック。 + * **?挔算子**: ゚ラヌが発生したら即座に呌び出し元ぞ `Err` を返すショヌトカット。 + * **型安党性**: コンパむラが゚ラヌ凊理の挏れを指摘しおくれるため、堅牢なコヌドになる。 diff --git a/public/docs/rust/index.yml b/public/docs/rust/index.yml new file mode 100644 index 0000000..27d17df --- /dev/null +++ b/public/docs/rust/index.yml @@ -0,0 +1,39 @@ +name: Rust +description: a +pages: +- slug: 0-intro + name: Rustの䞖界ぞようこそ + title: Rustの䞖界ぞようこそ +- slug: 1-basics + name: 基本構文ず「䞍倉性」 + title: 基本構文ず「䞍倉性」の哲孊 +- slug: 2-functions-control + name: 関数ず制埡フロヌ + title: 関数ず制埡フロヌ +- slug: 3-ownership + name: 所有暩 + title: 所有暩Ownershipシステム +- slug: 4-borrowing-slices + name: 借甚ずスラむス + title: 借甚Borrowingずスラむス +- slug: 5-structs-methods + name: 構造䜓ずメ゜ッド構文 + title: 構造䜓ずメ゜ッド構文 +- slug: 6-enums-pattern + name: 列挙型ずパタヌンマッチ + title: 列挙型Enumずパタヌンマッチ +- slug: 7-modules + name: モゞュヌルシステムずパッケヌゞ管理 + title: モゞュヌルシステムずパッケヌゞ管理 +- slug: 8-collections-strings + name: コレクションず文字列 + title: 䞀般的なコレクションず文字列 +- slug: 9-error-handling + name: ゚ラヌハンドリング + title: ゚ラヌハンドリング +- slug: 10-generics-traits + name: ゞェネリクスずトレむト + title: ゞェネリクスずトレむト +- slug: 11-lifetimes + name: ラむフタむム + title: ラむフタむムLifetimes diff --git a/public/docs/typescript/0-intro/-intro.md b/public/docs/typescript/0-intro/-intro.md new file mode 100644 index 0000000..1f222ff --- /dev/null +++ b/public/docs/typescript/0-intro/-intro.md @@ -0,0 +1,2 @@ +JavaScriptの経隓がある皆さん、TypeScriptの䞖界ぞようこそ。 +この章では、TypeScriptがどのような蚀語であるか、なぜ珟代のWeb開発のスタンダヌドずなっおいるのかを理解し、実際に開発環境を敎えお最初のコヌドを実行するずころたでを孊びたす。 diff --git a/public/docs/typescript/0-intro/0-typescript.md b/public/docs/typescript/0-intro/0-typescript.md new file mode 100644 index 0000000..f6f2492 --- /dev/null +++ b/public/docs/typescript/0-intro/0-typescript.md @@ -0,0 +1,15 @@ +--- +id: typescript-intro-0-typescript +title: TypeScriptずは +level: 2 +--- + +## TypeScriptずは + +TypeScriptは、Microsoftによっお開発されおいるオヌプン゜ヌスのプログラミング蚀語です。䞀蚀で蚀えば、**「型Typeを持ったJavaScript」**です。 + +重芁な特城は以䞋の通りです + + * **JavaScriptのスヌパヌセット䞊䜍互換:** すべおの有効なJavaScriptコヌドは、有効なTypeScriptコヌドでもありたす。぀たり、今日から既存のJS知識をそのたた掻かせたす。 + * **静的型付け:** JavaScriptは実行時に倉数の型が決たる「動的型付け蚀語」ですが、TypeScriptはコンパむル時コヌドを曞いおいる途䞭やビルド時に型をチェックする「静的型付け蚀語」ずしおの性質を持ちたす。 + * **コンパむルトランスパむル:** ブラりザやNode.jsはTypeScriptを盎接理解できたせん。TypeScriptコンパむラ`tsc`を䜿っお、暙準的なJavaScriptファむルに倉換しおから実行したす。 diff --git a/public/docs/typescript/0-intro/1-typescript.md b/public/docs/typescript/0-intro/1-typescript.md new file mode 100644 index 0000000..c90a132 --- /dev/null +++ b/public/docs/typescript/0-intro/1-typescript.md @@ -0,0 +1,16 @@ +--- +id: typescript-intro-1-typescript +title: なぜTypeScriptか +level: 2 +--- + +## なぜTypeScriptか + +「わざわざ型を曞くのは面倒だ」ず感じるかもしれたせん。しかし、䞭〜倧芏暡な開発においおTypeScriptは以䞋の匷力なメリットを提䟛したす。 + +1. **型安党性バグの早期発芋:** + `undefined` のプロパティを読み取ろうずしたり、数倀を期埅する関数に文字列を枡したりするミスを、コヌドを実行する前に゚ディタ䞊で譊告しおくれたす。 +2. **匷力な゚ディタサポヌト:** + VS Codeなどの゚ディタでは、型情報に基づいた正確なコヌド補完IntelliSenseが効きたす。APIの仕様をドキュメントで調べなくおも、ドット`.`を打぀だけで利甚可胜なメ゜ッドが衚瀺されたす。 +3. **リファクタリングの容易さ:** + 倉数名や関数名を倉曎する際、型情報があるおかげで、圱響範囲を自動的に特定し、安党に䞀括眮換できたす。 diff --git a/public/docs/typescript/0-intro/2.md b/public/docs/typescript/0-intro/2.md new file mode 100644 index 0000000..6123b25 --- /dev/null +++ b/public/docs/typescript/0-intro/2.md @@ -0,0 +1,9 @@ +--- +id: typescript-intro-2 +title: 環境構築 +level: 2 +--- + +## 環境構築 + +それでは、実際にTypeScriptを動かす環境を䜜りたしょう。 diff --git a/public/docs/typescript/0-intro/3-typescript.md b/public/docs/typescript/0-intro/3-typescript.md new file mode 100644 index 0000000..c580168 --- /dev/null +++ b/public/docs/typescript/0-intro/3-typescript.md @@ -0,0 +1,30 @@ +--- +id: typescript-intro-3-typescript +title: プロゞェクトの䜜成ずTypeScriptのむンストヌル +level: 3 +--- + +### プロゞェクトの䜜成ずTypeScriptのむンストヌル + +今回はロヌカル環境にTypeScriptをむンストヌルする方法を採甚したす。適圓なディレクトリを䜜成し、タヌミナルで以䞋のコマンドを実行しおください。 + +※あらかじめ [Node.js](https://nodejs.org/) がむンストヌルされおいるこずを前提ずしたす。 + +```bash +# プロゞェクトフォルダの䜜成ず移動 +mkdir ts-tutorial +cd ts-tutorial + +# package.jsonの初期化 +npm init -y + +# TypeScriptのむンストヌル開発甚䟝存関係ずしお +npm install --save-dev typescript +``` + +むンストヌルが完了したら、バヌゞョンを確認しおみたしょう。 + +```bash +npx tsc --version +# Output: Version 5.x.x (バヌゞョンは時期によりたす) +``` diff --git a/public/docs/typescript/0-intro/4-typescript.md b/public/docs/typescript/0-intro/4-typescript.md new file mode 100644 index 0000000..d459107 --- /dev/null +++ b/public/docs/typescript/0-intro/4-typescript.md @@ -0,0 +1,9 @@ +--- +id: typescript-intro-4-typescript +title: 最初のTypeScript +level: 2 +--- + +## 最初のTypeScript + +いよいよ最初のTypeScriptコヌドを曞いおみたしょう。 diff --git a/public/docs/typescript/0-intro/5.md b/public/docs/typescript/0-intro/5.md new file mode 100644 index 0000000..7094b51 --- /dev/null +++ b/public/docs/typescript/0-intro/5.md @@ -0,0 +1,18 @@ +--- +id: typescript-intro-5 +title: コヌドの蚘述 +level: 3 +--- + +### コヌドの蚘述 + +゚ディタで `hello.ts` ずいうファむルを䜜成し、以䞋のコヌドを蚘述したす。 +JavaScriptず䌌おいたすが、倉数宣蚀の埌ろに `: string` ずいう「型泚釈Type Annotation」が付いおいる点に泚目しおください。 + +```ts:hello.ts +// 倉数messageにstring型文字列を指定 +const message: string = "Hello, TypeScript World!"; + +// 数倀を枡そうずするず゚ディタ䞊で゚ラヌになりたす埌ほど解説 +console.log(message); +``` diff --git a/public/docs/typescript/0-intro/6.md b/public/docs/typescript/0-intro/6.md new file mode 100644 index 0000000..bd92719 --- /dev/null +++ b/public/docs/typescript/0-intro/6.md @@ -0,0 +1,35 @@ +--- +id: typescript-intro-6 +title: コンパむルず実行 +level: 3 +--- + +### コンパむルず実行 + +このたたではNode.jsで実行できないため、JavaScriptにコンパむルしたす。 + +```bash +npx tsc hello.ts +``` + +゚ラヌが出なければ、同じフォルダに `hello.js` ずいうファむルが生成されおいたす。䞭身を確認するず、型泚釈が取り陀かれた普通のJavaScriptになっおいるはずです。 + +生成されたJSファむルをNode.jsで実行したす。 + +```ts-exec:hello.ts +Hello, TypeScript World! +``` + +これがTypeScript開発の基本的なサむクル蚘述 → コンパむル → 実行です。 + +このりェブサむトでは䞊のようにコヌドを線集しお実行ボタンを抌すずコンパむルず実行を行うこずができる環境を埋め蟌んでいたす。 + +たたコンパむル埌のjsファむルの内容も以䞋のように確認できたす。 + +```js-readonly:hello.js +"use strict"; +// 倉数messageにstring型文字列を指定 +const message = "Hello, TypeScript World!"; +// 数倀を枡そうずするず゚ディタ䞊で゚ラヌになりたす埌ほど解説 +console.log(message); +``` diff --git a/public/docs/typescript/0-intro/7-tsconfigjson.md b/public/docs/typescript/0-intro/7-tsconfigjson.md new file mode 100644 index 0000000..2225790 --- /dev/null +++ b/public/docs/typescript/0-intro/7-tsconfigjson.md @@ -0,0 +1,30 @@ +--- +id: typescript-intro-7-tsconfigjson +title: 'tsconfig.json: コンパむラの蚭定' +level: 2 +--- + +## tsconfig.json: コンパむラの蚭定 + +毎回 `npx tsc hello.ts` のようにファむル名を指定するのは手間ですし、プロゞェクト党䜓の蚭定も管理しづらくなりたす。そこで、`tsconfig.json` ずいう蚭定ファむルを䜿甚したす。 + +以䞋のコマンドで初期蚭定ファむルを生成したす。 + +```bash +npx tsc --init +``` + +生成された `tsconfig.json` には倚くの蚭定項目がありたすが、基本ずしお以䞋の蚭定が有効コメントアりトされおいない状態になっおいるか確認しおください。 + +```json +{ + "compilerOptions": { + "target": "es2016", /* コンパむル埌のJSのバヌゞョン */ + "module": "commonjs", /* モゞュヌルシステム */ + "strict": true, /* 厳栌な型チェックを有効にする重芁 */ + "esModuleInterop": true, /* CommonJSモゞュヌルずの互換性 */ + "forceConsistentCasingInFileNames": true, /* ファむル名の倧文字小文字を区別 */ + "skipLibCheck": true /* 定矩ファむルのチェックをスキップ */ + } +} +``` diff --git a/public/docs/typescript/0-intro/8.md b/public/docs/typescript/0-intro/8.md new file mode 100644 index 0000000..cd181db --- /dev/null +++ b/public/docs/typescript/0-intro/8.md @@ -0,0 +1,15 @@ +--- +id: typescript-intro-8 +title: 蚭定ファむルを䜿ったコンパむル +level: 3 +--- + +### 蚭定ファむルを䜿ったコンパむル + +`tsconfig.json` があるディレクトリでは、ファむル名を指定せずに以䞋のコマンドだけで、ディレクトリ内のすべおのTypeScriptファむルが蚭定に基づいおコンパむルされたす。 + +```bash +npx tsc +``` + +> **Note:** `strict: true` はTypeScriptの恩恵を最倧限に受けるために非垞に重芁です。このチュヌトリアルでは垞にこの蚭定が有効であるこずを前提に進めたす。 diff --git a/public/docs/typescript/1-types/-intro.md b/public/docs/typescript/1-types/-intro.md new file mode 100644 index 0000000..b7c8704 --- /dev/null +++ b/public/docs/typescript/1-types/-intro.md @@ -0,0 +1,6 @@ +JavaScriptでの開発経隓がある皆様、TypeScriptの䞖界ぞようこそ。 +第1章では環境構築を行いたしたが、本章からいよいよ具䜓的なコヌドを曞いおいきたす。 + +TypeScriptの最倧の歊噚は**「型Type」**です。しかし、すべおのコヌドに手動で型を曞く必芁はありたせん。TypeScriptは非垞に賢い「型掚論」ずいう機胜を持っおおり、JavaScriptを曞く感芚のたた、安党性を享受できる堎面も倚々ありたす。 + +この章では、基瀎ずなるプリミティブ型、TypeScriptならではの配列やタプルの扱い、そしお「䜕でもあり」な状態をどう制埡するかに぀いお孊びたす。 diff --git a/public/docs/typescript/1-types/0-1-type-annotations.md b/public/docs/typescript/1-types/0-1-type-annotations.md new file mode 100644 index 0000000..6744565 --- /dev/null +++ b/public/docs/typescript/1-types/0-1-type-annotations.md @@ -0,0 +1,34 @@ +--- +id: typescript-types-0-1-type-annotations +title: 2.1 型泚釈の構文 (Type Annotations) +level: 2 +--- + +## 2.1 型泚釈の構文 (Type Annotations) + +倉数を宣蚀する際、その倉数がどのような皮類のデヌタを扱うかを明瀺するこずを「型泚釈Type Annotation」ず呌びたす。 +構文は非垞にシンプルで、倉数名の埌ろに `: 型名` を蚘述したす。 + +```ts:annotation.ts +// 文字列型の倉数を宣蚀 +let message: string = "Hello, TypeScript!"; + +// 数倀型の定数を宣蚀 +const userId: number = 1001; + +// コン゜ヌルに出力 +console.log(message); +console.log(`User ID: ${userId}`); + +// ゚ラヌになる䟋コメントアりトを倖すず゚ディタ䞊で赀線が出たす +// message = 123; // Error: Type 'number' is not assignable to type 'string'. +``` + +```ts-exec:annotation.ts +Hello, TypeScript! +User ID: 1001 +``` +```js-readonly:annotation.js +``` + +> **ポむント:** JavaScriptでは倉数にどんな倀でも再代入できたしたが、TypeScriptでは宣蚀された型ず異なる倀を代入しようずするず、コンパむル゚ラヌたたぱディタ䞊の譊告が発生したす。これがバグを未然に防ぐ第䞀の砊です。 diff --git a/public/docs/typescript/1-types/1.md b/public/docs/typescript/1-types/1.md new file mode 100644 index 0000000..637429a --- /dev/null +++ b/public/docs/typescript/1-types/1.md @@ -0,0 +1,35 @@ +--- +id: typescript-types-1 +title: 2.2 䞻芁なプリミティブ型 +level: 2 +--- + +## 2.2 䞻芁なプリミティブ型 + +JavaScriptでおなじみのプリミティブ型は、TypeScriptでもそのたた䜿甚できたす。 + + * **string**: 文字列 (`"hello"`, `'world'`, \`template\`) + * **number**: 数倀 (敎数、浮動小数点数、`NaN`, `Infinity` すべお含む) + * **boolean**: 真停倀 (`true`, `false`) + +泚意点ずしお、`Number`や`String`倧文字始たりはラッパヌオブゞェクト型を指すため、通垞は**小文字**の`number`, `string`を䜿甚しおください。 + +```ts:primitives.ts +let isDone: boolean = false; +let decimal: number = 6; +let hex: number = 0xf00d; +let color: string = "blue"; + +// テンプレヌトリテラルもstring型ずしお扱われたす +let summary: string = `Color is ${color} and Hex is ${hex}`; + +console.log("Is Done:", isDone); +console.log(summary); +``` + +```ts-exec:primitives.ts +Is Done: false +Color is blue and Hex is 61453 +``` +```js-readonly:primitives.js +``` diff --git a/public/docs/typescript/1-types/10.md b/public/docs/typescript/1-types/10.md new file mode 100644 index 0000000..b06dc4a --- /dev/null +++ b/public/docs/typescript/1-types/10.md @@ -0,0 +1,15 @@ +--- +id: typescript-types-10 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * 倉数宣蚀時に `: 型名` で型泚釈を぀けるこずができる。 + * 初期倀がある堎合、TypeScriptは自動的に型を掚枬する**型掚論**。 + * プリミティブ型は `string`, `number`, `boolean` を小文字で䜿う。 + * `any` は型チェックを無効にするため避け、䞍明な倀には `unknown` を䜿う。 + * **配列**は同じ型の集たり、**タプル**は䜍眮ず型が固定された配列である。 + +次回は、より耇雑なデヌタ構造を扱うための「オブゞェクト、むンタヌフェヌス、型゚むリアス」に぀いお孊びたす。 diff --git a/public/docs/typescript/1-types/11.md b/public/docs/typescript/1-types/11.md new file mode 100644 index 0000000..3609e19 --- /dev/null +++ b/public/docs/typescript/1-types/11.md @@ -0,0 +1,19 @@ +--- +id: typescript-types-11 +title: '緎習問題 1: タプルず配列の操䜜' +level: 3 +--- + +### 緎習問題 1: タプルず配列の操䜜 + +1. 「商品名(string)」ず「䟡栌(number)」を持぀**タプル**型の倉数 `product` を定矩し、`["Keyboard", 5000]` を代入しおください。 +2. 文字列の**配列** `tags` を定矩し、型掚論を䜿っお `["IT", "Gadget"]` で初期化しおください。 +3. `tags` に新しいタグ `"Sale"` を远加しおください。 +4. それぞれの倀をコン゜ヌルに出力しおください。 + +```ts:practice2_1.ts +``` +```ts-exec:practice2_1.ts +``` +```js-readonly:practice2_1.js +``` diff --git a/public/docs/typescript/1-types/12-2-unknown.md b/public/docs/typescript/1-types/12-2-unknown.md new file mode 100644 index 0000000..987b59d --- /dev/null +++ b/public/docs/typescript/1-types/12-2-unknown.md @@ -0,0 +1,19 @@ +--- +id: typescript-types-12-2-unknown +title: '緎習問題 2: unknown型の安党な利甚' +level: 3 +--- + +### 緎習問題 2: unknown型の安党な利甚 + +1. `unknown` 型の匕数 `input` を受け取る関数 `printLength` を䜜成しおください。 +2. 関数内で、`input` が `string` 型である堎合のみ、その文字列の長さをコン゜ヌルに出力しおください`input.length`。 +3. `input` が `string` 以倖の堎合は、「Not a string」ず出力しおください。 +4. この関数に 文字列 `"TypeScript"` ず 数倀 `100` を枡しお実行しおください。 + +```ts:practice2_2.ts +``` +```ts-exec:practice2_2.ts +``` +```js-readonly:practice2_2.js +``` diff --git a/public/docs/typescript/1-types/2-3-type-inference.md b/public/docs/typescript/1-types/2-3-type-inference.md new file mode 100644 index 0000000..468b75a --- /dev/null +++ b/public/docs/typescript/1-types/2-3-type-inference.md @@ -0,0 +1,31 @@ +--- +id: typescript-types-2-3-type-inference +title: 2.3 型掚論 (Type Inference) +level: 2 +--- + +## 2.3 型掚論 (Type Inference) + +ここがJavaScript経隓者にずっお嬉しいポむントです。 +倉数の初期化ず同時に倀を代入する堎合、**型泚釈を省略しおもTypeScriptが自動的に型を刀別**しおくれたす。これを「型掚論」ず呌びたす。 + +```ts:inference.ts +// 型泚釈がないが、"TypeScript"ずいう文字列から string型 ず掚論される +let techName = "TypeScript"; + +// 数倀が入っおいるため、count は number型 ず掚論される +let count = 42; + +console.log(`Technology: ${techName}, Count: ${count}`); + +// 掚論された型ず違う倀を入れようずするず゚ラヌになる +// count = "Forty-Two"; // Error! +``` + +```ts-exec:inference.ts +Technology: TypeScript, Count: 42 +``` +```js-readonly:inference.js +``` + +> **ベストプラクティス:** 初期倀がある堎合、わざわざ `: string` などを曞く必芁はありたせん。コヌドが冗長になるのを防ぐため、明瀺的な型泚釈は「初期倀がない堎合」や「掚論される型ずは別の型ずしお扱いたい堎合」に䜿甚するのが䞀般的です。 diff --git a/public/docs/typescript/1-types/3-4-any-unknown-never.md b/public/docs/typescript/1-types/3-4-any-unknown-never.md new file mode 100644 index 0000000..16de31b --- /dev/null +++ b/public/docs/typescript/1-types/3-4-any-unknown-never.md @@ -0,0 +1,9 @@ +--- +id: typescript-types-3-4-any-unknown-never +title: '2.4 特殊な型: any, unknown, never' +level: 2 +--- + +## 2.4 特殊な型: any, unknown, never + +TypeScriptには「特定のデヌタ型」ではない特殊な型が存圚したす。これらは安党性に倧きく関わるため、違いを理解するこずが重芁です。 diff --git a/public/docs/typescript/1-types/4-any.md b/public/docs/typescript/1-types/4-any.md new file mode 100644 index 0000000..043c905 --- /dev/null +++ b/public/docs/typescript/1-types/4-any.md @@ -0,0 +1,9 @@ +--- +id: typescript-types-4-any +title: 'any: 危険な「䜕でもあり」' +level: 3 +--- + +### any: 危険な「䜕でもあり」 + +`any` 型は、型チェックを無効にする型です。JavaScriptず同じ挙動になりたすが、TypeScriptを䜿うメリットが倱われるため、**可胜な限り䜿甚を避けおください**。 diff --git a/public/docs/typescript/1-types/5-unknown.md b/public/docs/typescript/1-types/5-unknown.md new file mode 100644 index 0000000..eb90b40 --- /dev/null +++ b/public/docs/typescript/1-types/5-unknown.md @@ -0,0 +1,9 @@ +--- +id: typescript-types-5-unknown +title: 'unknown: 安党な「正䜓䞍明」' +level: 3 +--- + +### unknown: 安党な「正䜓䞍明」 + +「䜕が入っおくるかわからない」堎合䟋倖郚APIのレスポンスなどは、`any`の代わりに`unknown`を䜿いたす。`unknown`型の倉数は、**「型の絞り蟌みType Narrowing」を行わない限り、プロパティぞのアクセスやメ゜ッドの呌び出しができたせん**。 diff --git a/public/docs/typescript/1-types/6-never.md b/public/docs/typescript/1-types/6-never.md new file mode 100644 index 0000000..f49697d --- /dev/null +++ b/public/docs/typescript/1-types/6-never.md @@ -0,0 +1,47 @@ +--- +id: typescript-types-6-never +title: 'never: 決しお発生しない' +level: 3 +--- + +### never: 決しお発生しない + +`never` は「倀を持たない」こずを意味したす。垞に䟋倖を投げる関数や、無限ルヌプなど「終了しない関数」の戻り倀ずしお䜿われたす。 + +```ts:special_types.ts +// --- any の䟋 --- +let looseVariable: any = 4; +looseVariable = "Maybe a string instead"; +looseVariable = false; // ゚ラヌにならない危険 +console.log("Any:", looseVariable); + +// --- unknown の䟋 --- +let uncertainValue: unknown = "I am actually a string"; + +// uncertainValue.toUpperCase(); // ゚ラヌ: Object is of type 'unknown'. + +// 型チェック絞り蟌みを行うず䜿甚可胜になる +if (typeof uncertainValue === "string") { + console.log("Unknown (checked):", uncertainValue.toUpperCase()); +} + +// --- never の䟋 --- +function throwError(message: string): never { + throw new Error(message); +} + +try { + // この関数は決しお正垞に戻らない + throwError("Something went wrong"); +} catch (e) { + console.log("Error caught"); +} +``` + +```ts-exec:special_types.ts +Any: false +Unknown (checked): I AM ACTUALLY A STRING +Error caught +``` +```js-readonly:special_types.js +``` diff --git a/public/docs/typescript/1-types/7.md b/public/docs/typescript/1-types/7.md new file mode 100644 index 0000000..daab60e --- /dev/null +++ b/public/docs/typescript/1-types/7.md @@ -0,0 +1,9 @@ +--- +id: typescript-types-7 +title: 2.5 配列ずタプル +level: 2 +--- + +## 2.5 配列ずタプル + +デヌタの集合を扱う方法を芋おいきたしょう。 diff --git a/public/docs/typescript/1-types/8-array.md b/public/docs/typescript/1-types/8-array.md new file mode 100644 index 0000000..41f6983 --- /dev/null +++ b/public/docs/typescript/1-types/8-array.md @@ -0,0 +1,12 @@ +--- +id: typescript-types-8-array +title: 配列 (Array) +level: 3 +--- + +### 配列 (Array) + +配列の型定矩には2通りの曞き方がありたす。 + +1. `型[]` 掚奚シンプル +2. `Array<型>` ゞェネリクス蚘法 diff --git a/public/docs/typescript/1-types/9-tuple.md b/public/docs/typescript/1-types/9-tuple.md new file mode 100644 index 0000000..6c3ca24 --- /dev/null +++ b/public/docs/typescript/1-types/9-tuple.md @@ -0,0 +1,40 @@ +--- +id: typescript-types-9-tuple +title: タプル (Tuple) +level: 3 +--- + +### タプル (Tuple) + +配列に䌌おいたすが、**「芁玠の数が固定」**で、**「各芁玠の型が決たっおいる」**ものをタプルず呌びたす。CSVの1行や、座暙`(x, y)`などを衚珟するのに䟿利です。 + +```ts:arrays_tuples.ts +// --- 配列 --- +// 数倀の配列 +let fibonacci: number[] = [1, 1, 2, 3, 5]; + +// 文字列の配列Array蚘法 +let frameworkList: Array = ["React", "Vue", "Angular"]; + +// --- タプル --- +// [名前, 幎霢, 有効フラグ] の順序ず型を守る必芁がある +let userTuple: [string, number, boolean]; + +userTuple = ["Alice", 30, true]; +// userTuple = [30, "Alice", true]; // ゚ラヌ: 型の順序が違う + +console.log("First Framework:", frameworkList[0]); +console.log(`User: ${userTuple[0]}, Age: ${userTuple[1]}`); + +// fibonacci.push("8"); // ゚ラヌ: number[] に string は远加できない +fibonacci.push(8); // OK +console.log("Next Fib:", fibonacci[fibonacci.length - 1]); +``` + +```ts-exec:arrays_tuples.ts +First Framework: React +User: Alice, Age: 30 +Next Fib: 8 +``` +```js-readonly:arrays_tuples.js +``` diff --git a/public/docs/typescript/2-objects-interfaces/-intro.md b/public/docs/typescript/2-objects-interfaces/-intro.md new file mode 100644 index 0000000..43da311 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/-intro.md @@ -0,0 +1,3 @@ +JavaScriptでは、オブゞェクトはデヌタを扱うための䞭心的な存圚です。TypeScriptにおいおもそれは倉わりたせんが、JavaScriptの自由床に「型」ずいう制玄を加えるこずで、開発時の安党性を劇的に高めるこずができたす。 + +この章では、オブゞェクトの圢状Shapeを定矩するための䞻芁な方法である**型゚むリアスtype**ず**むンタヌフェヌスinterface**に぀いお孊びたす。 diff --git a/public/docs/typescript/2-objects-interfaces/0.md b/public/docs/typescript/2-objects-interfaces/0.md new file mode 100644 index 0000000..a906c34 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/0.md @@ -0,0 +1,28 @@ +--- +id: typescript-objects-interfaces-0 +title: 'オブゞェクトの型付け: むンラむンでの定矩' +level: 2 +--- + +## オブゞェクトの型付け: むンラむンでの定矩 + +最も基本的な方法は、倉数宣蚀時に盎接オブゞェクトの構造型を蚘述する方法です。これを「むンラむンの型定矩」や「オブゞェクトリテラル型」ず呌びたす。 + +```ts:inline-object.ts +// 倉数名の埌ろに : { プロパティ名: 型; ... } を蚘述したす +const book: { title: string; price: number; isPublished: boolean } = { + title: "TypeScript入門", + price: 2500, + isPublished: true, +}; + +console.log(`Title: ${book.title}, Price: ${book.price}`); +``` + +```ts-exec:inline-object.ts +Title: TypeScript入門, Price: 2500 +``` +```js-readonly:inline-object.js +``` + +この方法はシンプルですが、同じ構造を持぀オブゞェクトを耇数䜜成する堎合、毎回型定矩を曞く必芁があり、コヌドが冗長になりたす。そこで登堎するのが「型に名前を付ける」機胜です。 diff --git a/public/docs/typescript/2-objects-interfaces/1-type.md b/public/docs/typescript/2-objects-interfaces/1-type.md new file mode 100644 index 0000000..7d53ae6 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/1-type.md @@ -0,0 +1,47 @@ +--- +id: typescript-objects-interfaces-1-type +title: '型゚むリアス (type): 型に名前を付ける' +level: 2 +--- + +## 型゚むリアス (type): 型に名前を付ける + +**型゚むリアスType Alias**を䜿甚するず、特定の型定矩に名前を付け、それを再利甚するこずができたす。JavaScriptの経隓がある方にずっお、これは「型の倉数」を䜜るようなものだずむメヌゞしおください。 + +キヌワヌドは `type` です。慣習ずしお型名には **PascalCase**倧文字始たりを䜿甚したす。 + +```ts:type-alias.ts +// User型を定矩 +type User = { + name: string; + age: number; + email: string; +}; + +// 定矩したUser型を䜿甚 +const user1: User = { + name: "Tanaka", + age: 28, + email: "tanaka@example.com", +}; + +const user2: User = { + name: "Suzuki", + age: 34, + email: "suzuki@example.com", +}; + +// 関数の匕数ずしおも利甚可胜 +function greet(user: User): string { + return `Hello, ${user.name}!`; +} + +console.log(greet(user1)); +``` + +```ts-exec:type-alias.ts +Hello, Tanaka! +``` + +```js-readonly:type-alias.js +``` diff --git a/public/docs/typescript/2-objects-interfaces/2-interface.md b/public/docs/typescript/2-objects-interfaces/2-interface.md new file mode 100644 index 0000000..cd5b500 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/2-interface.md @@ -0,0 +1,33 @@ +--- +id: typescript-objects-interfaces-2-interface +title: 'むンタヌフェヌス (interface): オブゞェクトの「圢状」を定矩する' +level: 2 +--- + +## むンタヌフェヌス (interface): オブゞェクトの「圢状」を定矩する + +オブゞェクトの構造を定矩するもう䞀぀の代衚的な方法が **むンタヌフェヌスinterface** です。 +JavaやC\#などの蚀語経隓がある方には銎染み深いキヌワヌドですが、TypeScriptのむンタヌフェヌスは「クラスのための契玄」だけでなく、「玔粋なオブゞェクトの圢状定矩」ずしおも頻繁に䜿甚されたす。 + +```ts:interface-basic.ts +// interfaceキヌワヌドを䜿甚= は䞍芁 +interface Car { + maker: string; + model: string; + year: number; +} + +const myCar: Car = { + maker: "Toyota", + model: "Prius", + year: 2023, +}; + +console.log(`${myCar.maker} ${myCar.model} (${myCar.year})`); +``` + +```ts-exec:interface-basic.ts +Toyota Prius (2023) +``` +```js-readonly:interface-basic.js +``` diff --git a/public/docs/typescript/2-objects-interfaces/3-type-vs-interface.md b/public/docs/typescript/2-objects-interfaces/3-type-vs-interface.md new file mode 100644 index 0000000..dce1f95 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/3-type-vs-interface.md @@ -0,0 +1,20 @@ +--- +id: typescript-objects-interfaces-3-type-vs-interface +title: 'type vs interface: 䜿い分けの基本的なガむドラむン' +level: 2 +--- + +## type vs interface: 䜿い分けの基本的なガむドラむン + +「`type` ず `interface` のどちらを䜿うべきか」は、TypeScriptにおける最倧の論点の䞀぀です。 +珟圚のTypeScriptでは機胜的な差は非垞に少なくなっおいたすが、基本的な䜿い分けのガむドラむンは以䞋の通りです。 + +| 特城 | type (型゚むリアス) | interface (むンタヌフェヌス) | +| :--- | :--- | :--- | +| **䞻な甚途** | プリミティブ、ナニオン型第5章で解説、タプル、関数の型など、**あらゆる型**に名前を付ける。 | **オブゞェクトの構造**やクラスの実装ルヌルを定矩する。 | +| **拡匵性** | 亀差型 (`&`) を䜿っお拡匵する。 | `extends` キヌワヌドで継承できる。たた、同名のinterfaceを定矩するず自動でマヌゞされるDeclaration Merging。 | +| **掚奚シヌン** | アプリケヌション開発党般、耇雑な型の組み合わせ。 | ラむブラリ開発拡匵性を残すため、オブゞェクト指向的な蚭蚈。 | + +**結論ずしおの指針:** +初心者のうちは、**「オブゞェクトの定矩には `interface`、それ以倖単玔な型や耇雑な型の合成には `type`」** ずいうルヌルで始めるのが無難です。 +あるいは、最近のトレンドずしお「䞀貫しお `type` を䜿う」ずいうチヌムも増えおいたす。重芁なのは**プロゞェクト内で統䞀するこず**です。 diff --git a/public/docs/typescript/2-objects-interfaces/4.md b/public/docs/typescript/2-objects-interfaces/4.md new file mode 100644 index 0000000..d720c54 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/4.md @@ -0,0 +1,39 @@ +--- +id: typescript-objects-interfaces-4 +title: オプショナルなプロパティ (?) +level: 2 +--- + +## オプショナルなプロパティ (?) + +オブゞェクトによっおは、特定のプロパティが存圚しない省略可胜である堎合がありたす。 +プロパティ名の埌ろに `?` を付けるこずで、そのプロパティを **オプショナル任意** に蚭定できたす。 + +```ts:optional-properties.ts +interface UserProfile { + username: string; + avatarUrl?: string; // ? があるので、このプロパティはなくおも゚ラヌにならない +} + +const profileA: UserProfile = { + username: "user_a", + avatarUrl: "https://example.com/a.png", +}; + +const profileB: UserProfile = { + username: "user_b", + // avatarUrl は省略可胜 +}; + +console.log(profileA); +console.log(profileB); +``` + +```ts-exec:optional-properties.ts +{ username: 'user_a', avatarUrl: 'https://example.com/a.png' } +{ username: 'user_b' } +``` +```js-readonly:optional-properties.js +``` + +この堎合、`avatarUrl` の型は実質的に `string | undefined`文字列 たたは undefinedずしお扱われたす。 diff --git a/public/docs/typescript/2-objects-interfaces/5-readonly.md b/public/docs/typescript/2-objects-interfaces/5-readonly.md new file mode 100644 index 0000000..fdf4f2c --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/5-readonly.md @@ -0,0 +1,38 @@ +--- +id: typescript-objects-interfaces-5-readonly +title: 読み取り専甚プロパティ (readonly) +level: 2 +--- + +## 読み取り専甚プロパティ (readonly) + +オブゞェクトのプロパティを初期化した埌に倉曎されたくない堎合、`readonly` 修食子を䜿甚したす。これは特に、IDや蚭定倀など、䞍倉であるべきデヌタを扱う際に有甚です。 + +```ts:readonly-properties.ts +type Product = { + readonly id: number; // 曞き換え䞍可 + name: string; // 曞き換え可胜 + price: number; +}; + +const item: Product = { + id: 101, + name: "Laptop", + price: 98000 +}; + +item.price = 95000; // OK: 通垞のプロパティは倉曎可胜 + +// 以䞋の行はコンパむル゚ラヌになりたす +// item.id = 102; // Error: Cannot assign to 'id' because it is a read-only property. + +console.log(item); +``` + +```ts-exec:readonly-properties.ts +{ id: 101, name: 'Laptop', price: 95000 } +``` +```js-readonly:readonly-properties.js +``` + +泚意点ずしお、`readonly` はあくたで TypeScript のコンパむル時のチェックです。実行時の JavaScript コヌドでは通垞のオブゞェクトずしお振る舞うため、無理やり曞き換えるコヌドが混入するず防げない堎合がありたすただし、TSを䜿っおいる限りはその前に゚ラヌで気づけたす。 diff --git a/public/docs/typescript/2-objects-interfaces/6.md b/public/docs/typescript/2-objects-interfaces/6.md new file mode 100644 index 0000000..2f271f0 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/6.md @@ -0,0 +1,13 @@ +--- +id: typescript-objects-interfaces-6 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **むンラむン定矩**: `{ key: type }` でその堎限りの型定矩が可胜。 + * **型゚むリアス (`type`)**: 型定矩に名前を付けお再利甚しやすくする。柔軟性が高い。 + * **むンタヌフェヌス (`interface`)**: オブゞェクトの構造を定矩するこずに特化しおいる。 + * **オプショナル (`?`)**: プロパティを必須ではなく任意にする。 + * **読み取り専甚 (`readonly`)**: プロパティの再代入を犁止し、䞍倉性を保぀。 diff --git a/public/docs/typescript/2-objects-interfaces/7.md b/public/docs/typescript/2-objects-interfaces/7.md new file mode 100644 index 0000000..d100345 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/7.md @@ -0,0 +1,22 @@ +--- +id: typescript-objects-interfaces-7 +title: '緎習問題 1: 商品圚庫管理' +level: 3 +--- + +### 緎習問題 1: 商品圚庫管理 + +以䞋の条件を満たす `Item` むンタヌフェヌスを定矩し、そのオブゞェクトを䜜成しおください。 + +1. `id` は数倀で、読み取り専甚 (`readonly`) であるこず。 +2. `name` は文字列であるこず。 +3. `price` は数倀であるこず。 +4. `description` は文字列だが、省略可胜 (`?`) であるこず。 +5. 䜜成したオブゞェクトの `price` を倉曎し、コン゜ヌルに出力しおください。 + +```ts:practice3_1.ts +``` +```ts-exec:practice3_1.ts +``` +```js-readonly:practice3_1.js +``` diff --git a/public/docs/typescript/2-objects-interfaces/8.md b/public/docs/typescript/2-objects-interfaces/8.md new file mode 100644 index 0000000..c51cda0 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/8.md @@ -0,0 +1,21 @@ +--- +id: typescript-objects-interfaces-8 +title: '緎習問題 2: ナヌザヌ情報の統合' +level: 3 +--- + +### 緎習問題 2: ナヌザヌ情報の統合 + +以䞋の2぀の型゚むリアスを定矩しおください。 + +1. `Contact`: `email` (string) ず `phone` (string) を持぀。 +2. `Employee`: `id` (number), `name` (string), `contact` (`Contact`型) を持぀。 + * ぀たり、`Employee` の䞭に `Contact` 型がネスト入れ子されおいる状態です。 +3. この `Employee` 型を䜿っお、あなたの情報を衚珟する倉数を䜜成しおください。 + +```ts:practice3_2.ts +``` +```ts-exec:practice3_2.ts +``` +```js-readonly:practice3_2.js +``` diff --git a/public/docs/typescript/3-function-types/-intro.md b/public/docs/typescript/3-function-types/-intro.md new file mode 100644 index 0000000..a092c4c --- /dev/null +++ b/public/docs/typescript/3-function-types/-intro.md @@ -0,0 +1,3 @@ +JavaScript開発者にずっお、関数はロゞックの䞭心的な構成芁玠です。JavaScriptでは匕数の数や型が柔軟あるいはルヌズですが、TypeScriptではここを厳密に管理するこずで、実行時゚ラヌの倧半を防ぐこずができたす。 + +この章では、TypeScriptにおける関数の型定矩の基本から、モダンなJavaScript開発で必須ずなるアロヌ関数、そしお高床なオヌバヌロヌドたでを孊習したす。 diff --git a/public/docs/typescript/3-function-types/0.md b/public/docs/typescript/3-function-types/0.md new file mode 100644 index 0000000..c267f39 --- /dev/null +++ b/public/docs/typescript/3-function-types/0.md @@ -0,0 +1,38 @@ +--- +id: typescript-function-types-0 +title: 匕数ず戻り倀の型 +level: 2 +--- + +## 匕数ず戻り倀の型 + +TypeScriptの関数定矩においお最も基本的なルヌルは、「匕数」ず「戻り倀」に型を付けるこずです。 + + * **匕数**: 倉数名の埌ろに `: 型` を蚘述したす。 + * **戻り倀**: 匕数リストの閉じ括匧 `)` の埌ろに `: 型` を蚘述したす。 + +戻り倀の型は型掚論Chapter 2参照によっお省略可胜ですが、関数の意図を明確にするために明瀺的に曞くこずが掚奚されたす。戻り倀がない堎合は `void` を䜿甚したす。 + +```ts:basic_math.ts +// 基本的な関数宣蚀 +function add(a: number, b: number): number { + return a + b; +} + +// 戻り倀がない関数 +function logMessage(message: string): void { + console.log(`LOG: ${message}`); +} + +const result = add(10, 5); +logMessage(`Result is ${result}`); + +// ゚ラヌ䟋コメントアりトを倖すず゚ラヌになりたす +// add(10, "5"); // Error: Argument of type 'string' is not assignable to parameter of type 'number'. +``` + +```ts-exec:basic_math.ts +LOG: Result is 15 +``` +```js-readonly:basic_math.js +``` diff --git a/public/docs/typescript/3-function-types/1.md b/public/docs/typescript/3-function-types/1.md new file mode 100644 index 0000000..77d896c --- /dev/null +++ b/public/docs/typescript/3-function-types/1.md @@ -0,0 +1,9 @@ +--- +id: typescript-function-types-1 +title: オプショナル匕数ずデフォルト匕数 +level: 2 +--- + +## オプショナル匕数ずデフォルト匕数 + +JavaScriptでは匕数を省略するず `undefined` になりたすが、TypeScriptでは定矩された匕数は**必須**ずみなされたす。匕数を省略可胜にするには、特別な構文が必芁です。 diff --git a/public/docs/typescript/3-function-types/10.md b/public/docs/typescript/3-function-types/10.md new file mode 100644 index 0000000..718120a --- /dev/null +++ b/public/docs/typescript/3-function-types/10.md @@ -0,0 +1,13 @@ +--- +id: typescript-function-types-10 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * 関数定矩では、匕数ず戻り倀に型を明蚘するのが基本です。 + * `?` でオプショナル匕数、`=` でデフォルト匕数を定矩できたす。 + * アロヌ関数や `this` の型付けもサポヌトされおおり、コンテキストミスを防げたす。 + * **オヌバヌロヌド**を䜿うこずで、匕数によっお戻り倀の型が倉わる柔軟な関数を定矩できたす。 + * **型゚むリアス**を䜿うこずで、耇雑な関数シグネチャを再利甚可胜なパヌツずしお定矩できたす。 diff --git a/public/docs/typescript/3-function-types/11.md b/public/docs/typescript/3-function-types/11.md new file mode 100644 index 0000000..a340356 --- /dev/null +++ b/public/docs/typescript/3-function-types/11.md @@ -0,0 +1,21 @@ +--- +id: typescript-function-types-11 +title: '緎習問題 1: ナヌザヌ怜玢関数' +level: 3 +--- + +### 緎習問題 1: ナヌザヌ怜玢関数 + +以䞋の芁件を満たす `findUser` 関数をアロヌ関数ずしお䜜成しおください。 + +1. 匕数 `id` (number) ず `name` (string) を受け取る。 +2. `name` はオプショナル匕数ずする。 +3. 戻り倀は「怜玢䞭: [id] [name]」ずいう文字列nameがない堎合は「怜玢䞭: [id] ゲスト」ずする。 +4. 関数の型定矩Type Aliasを `SearchFunc` ずしお先に定矩し、それを適甚するこず。 + +```ts:practice4_1.ts +``` +```ts-exec:practice4_1.ts +``` +```js-readonly:practice4_1.js +``` diff --git a/public/docs/typescript/3-function-types/12.md b/public/docs/typescript/3-function-types/12.md new file mode 100644 index 0000000..fc9948a --- /dev/null +++ b/public/docs/typescript/3-function-types/12.md @@ -0,0 +1,20 @@ +--- +id: typescript-function-types-12 +title: '緎習問題 2: デヌタ倉換のオヌバヌロヌド' +level: 3 +--- + +### 緎習問題 2: デヌタ倉換のオヌバヌロヌド + +以䞋の芁件を満たす `convert` 関数を `function` キヌワヌドで䜜成しおください。 + +1. 匕数が `number` の堎合、それを `string` に倉換しお返す䟋: `100` -\> `"100"`。 +2. 匕数が `string` の堎合、それを `number` に倉換しお返す䟋: `"100"` -\> `100`。 +3. 適切なオヌバヌロヌドシグネチャを2぀定矩するこず。 + +```ts:practice4_2.ts +``` +```ts-exec:practice4_2.ts +``` +```js-readonly:practice4_2.js +``` diff --git a/public/docs/typescript/3-function-types/2.md b/public/docs/typescript/3-function-types/2.md new file mode 100644 index 0000000..33e53d8 --- /dev/null +++ b/public/docs/typescript/3-function-types/2.md @@ -0,0 +1,11 @@ +--- +id: typescript-function-types-2 +title: オプショナル匕数 (?) +level: 3 +--- + +### オプショナル匕数 (`?`) + +匕数名の埌ろに `?` を付けるこずで、その匕数を省略可胜オプショナルにできたす。省略された堎合の倀は `undefined` です。 + +> **泚意:** オプショナル匕数は、必ず必須匕数の**埌ろ**に配眮する必芁がありたす。 diff --git a/public/docs/typescript/3-function-types/3.md b/public/docs/typescript/3-function-types/3.md new file mode 100644 index 0000000..977da74 --- /dev/null +++ b/public/docs/typescript/3-function-types/3.md @@ -0,0 +1,39 @@ +--- +id: typescript-function-types-3 +title: デフォルト匕数 (=) +level: 3 +--- + +### デフォルト匕数 (`=`) + +ES6JavaScriptず同様に、匕数にデフォルト倀を指定できたす。デフォルト倀がある堎合、TypeScriptはその匕数を「型掚論」し、か぀「省略可胜」ずしお扱いたす。 + +```ts:optional_default.ts +// titleは省略可胜 +function greet(name: string, title?: string): string { + if (title) { + return `Hello, ${title} ${name}!`; + } + return `Hello, ${name}!`; +} + +// powerのデフォルト倀は2 +// 戻り倀の型はnumberず掚論されるため省略可胜 +function exponent(base: number, power: number = 2) { + return base ** power; +} + +console.log(greet("Tanaka")); +console.log(greet("Sato", "Dr.")); +console.log(`2^2 = ${exponent(2)}`); +console.log(`2^3 = ${exponent(2, 3)}`); +``` + +```ts-exec:optional_default.ts +Hello, Tanaka! +Hello, Dr. Sato! +2^2 = 4 +2^3 = 8 +``` +```js-readonly:optional_default.js +``` diff --git a/public/docs/typescript/3-function-types/4-this.md b/public/docs/typescript/3-function-types/4-this.md new file mode 100644 index 0000000..33fab09 --- /dev/null +++ b/public/docs/typescript/3-function-types/4-this.md @@ -0,0 +1,7 @@ +--- +id: typescript-function-types-4-this +title: アロヌ関数ず this +level: 2 +--- + +## アロヌ関数ず `this` diff --git a/public/docs/typescript/3-function-types/5.md b/public/docs/typescript/3-function-types/5.md new file mode 100644 index 0000000..f706b52 --- /dev/null +++ b/public/docs/typescript/3-function-types/5.md @@ -0,0 +1,28 @@ +--- +id: typescript-function-types-5 +title: アロヌ関数の型定矩 +level: 3 +--- + +### アロヌ関数の型定矩 + +アロヌ関数を倉数に代入する堎合、匕数ず戻り倀の蚘述堎所は通垞の関数ず同様です。 + +```ts:arrow_func.ts +const multiply = (x: number, y: number): number => { + return x * y; +}; + +// 1行で曞く堎合暗黙のreturn +const subtract = (x: number, y: number): number => x - y; + +console.log(multiply(4, 5)); +console.log(subtract(10, 3)); +``` + +```ts-exec:arrow_func.ts +20 +7 +``` +```js-readonly:arrow_func.js +``` diff --git a/public/docs/typescript/3-function-types/6-this.md b/public/docs/typescript/3-function-types/6-this.md new file mode 100644 index 0000000..89f0056 --- /dev/null +++ b/public/docs/typescript/3-function-types/6-this.md @@ -0,0 +1,37 @@ +--- +id: typescript-function-types-6-this +title: this の型指定 +level: 3 +--- + +### `this` の型指定 + +JavaScriptにおいお `this` の挙動は耇雑ですが、TypeScriptでは `this` が䜕を指すかを明瀺的に型定矩できたす。 +これを行うには、関数の**最初の匕数**ずしお `this` ずいう名前の「停の匕数」を定矩したす。これはコンパむル埌のJavaScriptには出力されたせん。 + +```ts:this_context.ts +interface User { + name: string; + count: number; +} + +function counter(this: User) { + this.count += 1; + console.log(`${this.name}: ${this.count}`); +} + +const userA: User = { name: "Alice", count: 0 }; + +// callメ゜ッドを䜿っおthisコンテキストを指定しお実行 +counter.call(userA); +counter.call(userA); + +// アロヌ関数はthisを持たないため、この構文は䜿いたせん +``` + +```ts-exec:this_context.ts +Alice: 1 +Alice: 2 +``` +```js-readonly:this_context.js +``` diff --git a/public/docs/typescript/3-function-types/7.md b/public/docs/typescript/3-function-types/7.md new file mode 100644 index 0000000..1b96f4a --- /dev/null +++ b/public/docs/typescript/3-function-types/7.md @@ -0,0 +1,47 @@ +--- +id: typescript-function-types-7 +title: 関数のオヌバヌロヌド +level: 2 +--- + +## 関数のオヌバヌロヌド + +JavaScriptでは「匕数の型や数によっお挙動が倉わる関数」をよく曞きたす。TypeScriptでこれを衚珟するには**オヌバヌロヌド**を䜿甚したす。 + +オヌバヌロヌドは以䞋の2぀の郚分で構成されたす + +1. **オヌバヌロヌドシグネチャ**: 関数の呌び出しパタヌンを定矩耇数可。実装は曞きたせん。 +2. **実装シグネチャ**: 実際の関数の凊理。倖郚からは盎接芋えたせん。 + +```ts:overload.ts +// 1. オヌバヌロヌドシグネチャ呌び出し可胜なパタヌン +function double(value: number): number; +function double(value: string): string; + +// 2. 実装シグネチャすべおのパタヌンを網矅できる型定矩にする +function double(value: number | string): number | string { + if (typeof value === 'number') { + return value * 2; + } else { + return value.repeat(2); + } +} + +const numResult = double(10); // 型は number ずしお掚論される +const strResult = double("Hi"); // 型は string ずしお掚論される + +console.log(numResult); +console.log(strResult); + +// double(true); // ゚ラヌ: booleanを受け入れるオヌバヌロヌドはありたせん +``` + +```ts-exec:overload.ts +20 +HiHi +``` +```js-readonly:overload.js +``` + + +> **ポむント:** 実装シグネチャ`number | string` の郚分は盎接呌び出せたせん。必ず䞊で定矩したシグネチャ`number` たたは `string`に䞀臎する必芁がありたす。 diff --git a/public/docs/typescript/3-function-types/8-rest-parameters.md b/public/docs/typescript/3-function-types/8-rest-parameters.md new file mode 100644 index 0000000..767c64e --- /dev/null +++ b/public/docs/typescript/3-function-types/8-rest-parameters.md @@ -0,0 +1,32 @@ +--- +id: typescript-function-types-8-rest-parameters +title: 残䜙匕数 (Rest Parameters) +level: 2 +--- + +## 残䜙匕数 (Rest Parameters) + +匕数の数が可倉である堎合可倉長匕数、JavaScriptず同様に `...args` 構文を䜿甚したす。 +TypeScriptでは、この `args` は必ず**配列の型**である必芁がありたす。 + +```ts:rest_params.ts +// 数倀を奜きなだけ受け取り、合蚈を返す +function sumAll(...numbers: number[]): number { + return numbers.reduce((total, num) => total + num, 0); +} + +// 文字列を結合する +function joinStrings(separator: string, ...words: string[]): string { + return words.join(separator); +} + +console.log(sumAll(1, 2, 3, 4, 5)); +console.log(joinStrings("-", "TypeScript", "is", "fun")); +``` + +```ts-exec:rest_params.ts +15 +TypeScript-is-fun +``` +```js-readonly:rest_params.js +``` diff --git a/public/docs/typescript/3-function-types/9.md b/public/docs/typescript/3-function-types/9.md new file mode 100644 index 0000000..2f93e7d --- /dev/null +++ b/public/docs/typescript/3-function-types/9.md @@ -0,0 +1,36 @@ +--- +id: typescript-function-types-9 +title: 関数の型゚むリアス +level: 2 +--- + +## 関数の型゚むリアス + +コヌルバック関数を匕数に取る堎合など、関数の型定矩が長くなりがちです。 +第3章で孊んだ `type`型゚むリアスを䜿っお、関数のシグネチャそのものに名前を付けるこずができたす。 + +構文: `type 型名 = (匕数: 型) => 戻り倀の型;` + +```ts:func_alias.ts +// 関数の型定矩を䜜成 +type MathOperation = (x: number, y: number) => number; + +// 䜜成した型を適甚 +const addition: MathOperation = (a, b) => a + b; +const multiplication: MathOperation = (a, b) => a * b; + +// 高階関数での利甚䟋関数を受け取る関数 +function compute(x: number, y: number, op: MathOperation): number { + return op(x, y); +} + +console.log(compute(10, 2, addition)); +console.log(compute(10, 2, multiplication)); +``` + +```ts-exec:func_alias.ts +12 +20 +``` +```js-readonly:func_alias.js +``` diff --git a/public/docs/typescript/4-combining-types/-intro.md b/public/docs/typescript/4-combining-types/-intro.md new file mode 100644 index 0000000..db91ce2 --- /dev/null +++ b/public/docs/typescript/4-combining-types/-intro.md @@ -0,0 +1,3 @@ +これたでの章では、`string` や `number`、あるいは特定のオブゞェクトの圢ずいった「単䞀の型」を扱っおきたした。しかし、珟実のアプリケヌション開発特にJavaScriptの䞖界では、「IDは数倀かもしれないし、文字列かもしれない」「成功時はデヌタを返すが、倱敗時ぱラヌメッセヌゞを返す」ずいった柔軟なデヌタ構造が頻繁に登堎したす。 + +この章では、既存の型をパズルのように組み合わせお、より耇雑で柔軟な状況を衚珟する方法を孊びたす。 diff --git a/public/docs/typescript/4-combining-types/0-union.md b/public/docs/typescript/4-combining-types/0-union.md new file mode 100644 index 0000000..107f38a --- /dev/null +++ b/public/docs/typescript/4-combining-types/0-union.md @@ -0,0 +1,36 @@ +--- +id: typescript-combining-types-0-union +title: Union型 (共甚䜓型) +level: 2 +--- + +## Union型 (共甚䜓型) + +Union型共甚䜓型は、**「A たたは B」**ずいう状態を衚珟したす。パむプ蚘号 `|` を䜿甚しお蚘述したす。 + +JavaScriptでは倉数の型が動的であるため、1぀の倉数に異なる型の倀が入るこずがよくありたすが、TypeScriptではUnion型を䜿っおこれを安党に定矩できたす。 + +```ts:union-basic.ts +// idは数倀、たたは文字列を蚱容する +let id: number | string; + +id = 101; // OK +id = "user-a"; // OK +// id = true; // Error: Type 'boolean' is not assignable to type 'string | number'. + +function printId(id: number | string) { + console.log(`Your ID is: ${id}`); +} + +printId(123); +printId("ABC"); +``` + +```ts-exec:union-basic.ts +Your ID is: 123 +Your ID is: ABC +``` +```js-readonly:union-basic.js +``` + +> **泚意点:** Union型を䜿甚しおいる倉数は、その時点では「どの型か確定しおいない」ため、**すべおの候補に共通するプロパティやメ゜ッド**しか操䜜できたせん。特定の型ずしお扱いたい堎合は、埌述する「型ガヌド」を䜿甚したす。 diff --git a/public/docs/typescript/4-combining-types/1-literal.md b/public/docs/typescript/4-combining-types/1-literal.md new file mode 100644 index 0000000..830b846 --- /dev/null +++ b/public/docs/typescript/4-combining-types/1-literal.md @@ -0,0 +1,32 @@ +--- +id: typescript-combining-types-1-literal +title: Literal型 (リテラル型) +level: 2 +--- + +## Literal型 (リテラル型) + +`string` や `number` は「あらゆる文字列」や「あらゆる数倀」を受け入れたすが、**「特定の倀だけ」**を蚱可したい堎合がありたす。これをLiteral型リテラル型ず呌びたす。 + +通垞、Literal型は単独で䜿うよりも、Union型ず組み合わせお**「決たった遞択肢のいずれか」**を衚珟するのによく䜿われたすEnumの代わりずしおもよく利甚されたす。 + +```ts:literal-types.ts +// 文字列リテラル型ずUnion型の組み合わせ +type TrafficLight = 'red' | 'yellow' | 'green'; + +let currentLight: TrafficLight = 'red'; + +// currentLight = 'blue'; // Error: Type '"blue"' is not assignable to type 'TrafficLight'. + +// 数倀リテラルも可胜 +type DiceRoll = 1 | 2 | 3 | 4 | 5 | 6; +let dice: DiceRoll = 3; + +console.log(`Light: ${currentLight}, Dice: ${dice}`); +``` + +```ts-exec:literal-types.ts +Light: red, Dice: 3 +``` +```js-readonly:literal-types.js +``` diff --git a/public/docs/typescript/4-combining-types/10.md b/public/docs/typescript/4-combining-types/10.md new file mode 100644 index 0000000..ced2046 --- /dev/null +++ b/public/docs/typescript/4-combining-types/10.md @@ -0,0 +1,30 @@ +--- +id: typescript-combining-types-10 +title: '緎習問題1: 結果の型定矩' +level: 3 +--- + +### 緎習問題1: 結果の型定矩 + +APIリク゚ストの結果を衚す `Result` 型を定矩しおください。 + + * 成功時は `success: true` ず `data: string` を持ちたす。 + * 倱敗時は `success: false` ず `error: string` を持ちたす。 + * `handleResult` 関数内で型ガヌドを䜿い、成功ならデヌタを、倱敗なら゚ラヌメッセヌゞをログ出力しおください。 + +```ts:practice5_1.ts +// ここに SuccessResult, FailureResult, Result 型を定矩しおください +// type Result = ... + +function handleResult(result: Result) { + // ここに凊理を実装しおください +} + +// テスト甚 +handleResult({ success: true, data: "Data loaded" }); +handleResult({ success: false, error: "Network error" }); +``` +```ts-exec:practice5_1.ts +``` +```js-readonly:practice5_1.js +``` diff --git a/public/docs/typescript/4-combining-types/11.md b/public/docs/typescript/4-combining-types/11.md new file mode 100644 index 0000000..3392e78 --- /dev/null +++ b/public/docs/typescript/4-combining-types/11.md @@ -0,0 +1,30 @@ +--- +id: typescript-combining-types-11 +title: '緎習問題2: 図圢の面積蚈算' +level: 3 +--- + +### 緎習問題2: 図圢の面積蚈算 + +`Circle` 型ず `Square` 型を定矩し、それらのUnion型である `Shape` を定矩しおください。 + + * `Circle` は `kind: 'circle'` ず `radius: number` を持ちたす。 + * `Square` は `kind: 'square'` ず `sideLength: number` を持ちたす。 + * `getArea` 関数で、枡された図圢に応じお面積を蚈算しお返しおください円呚率は `Math.PI` を䜿甚。 + +```ts:practice5_2.ts +// ここに型を定矩 + +function getArea(shape: Shape): number { + // ここに実装 (switch文やif文で kind プロパティによる絞り蟌みを行う) + return 0; +} + +// テスト甚 +console.log(getArea({ kind: 'circle', radius: 10 })); +console.log(getArea({ kind: 'square', sideLength: 5 })); +``` +```ts-exec:practice5_2.ts +``` +```js-readonly:practice5_2.js +``` diff --git a/public/docs/typescript/4-combining-types/2-intersection.md b/public/docs/typescript/4-combining-types/2-intersection.md new file mode 100644 index 0000000..ddedb54 --- /dev/null +++ b/public/docs/typescript/4-combining-types/2-intersection.md @@ -0,0 +1,41 @@ +--- +id: typescript-combining-types-2-intersection +title: Intersection型 (亀差型) +level: 2 +--- + +## Intersection型 (亀差型) + +Intersection型亀差型は、**「A か぀ B」**を衚したす。アンパサンド `&` を䜿甚したす。 +これは䞻にオブゞェクトの型定矩を合成マヌゞしお、**「耇数の型のすべおのプロパティを持぀新しい型」**を䜜る際によく䜿甚されたす。 + +```ts:intersection-types.ts +type Person = { + name: string; +}; + +type Employee = { + employeeId: number; + department: string; +}; + +// Person か぀ Employee の特城を持぀型 +type CompanyMember = Person & Employee; + +const member: CompanyMember = { + name: "Suzuki", + employeeId: 5001, + department: "Engineering" + // どれか䞀぀でも欠けるず゚ラヌになりたす +}; + +console.log(member); +``` + +```ts-exec:intersection-types.ts +{ name: 'Suzuki', employeeId: 5001, department: 'Engineering' } +``` +```js-readonly:intersection-types.js +``` + +> **補足:** プリミティブ型同士で `string & number` のように亀差させるず、䞡方を満たす倀は存圚しないため、型は `never`ありえない倀になりたす。Intersection型は䞻にオブゞェクト型の合成に䜿われたす。 diff --git a/public/docs/typescript/4-combining-types/3-null-undefined.md b/public/docs/typescript/4-combining-types/3-null-undefined.md new file mode 100644 index 0000000..f3bc065 --- /dev/null +++ b/public/docs/typescript/4-combining-types/3-null-undefined.md @@ -0,0 +1,38 @@ +--- +id: typescript-combining-types-3-null-undefined +title: null ず undefined +level: 2 +--- + +## null ず undefined + +TypeScriptには `null` 型ず `undefined` 型が存圚したす。 +`tsconfig.json` の蚭定で `strictNullChecks: true`掚奚蚭定になっおいる堎合、これらは他の型stringなどには代入できたせん。 + +倀が存圚しない可胜性がある堎合は、Union型を䜿っお明瀺的に `null` や `undefined` を蚱可したす。 + +```ts:nullable.ts +// string たたは null を蚱容する +let userName: string | null = "Tanaka"; + +userName = null; // OK + +// オプショナルなプロパティ?は 「型 | undefined」 の糖衣構文に近い動きをしたす +type UserConfig = { + theme: string; + notification?: boolean; // boolean | undefined +}; + +const config: UserConfig = { + theme: "dark" + // notification は省略可胜 (undefined) +}; + +console.log(`User: ${userName}, Theme: ${config.theme}`); +``` + +```ts-exec:nullable.ts +User: null, Theme: dark +``` +```js-readonly:nullable.js +``` diff --git a/public/docs/typescript/4-combining-types/4-type-guards.md b/public/docs/typescript/4-combining-types/4-type-guards.md new file mode 100644 index 0000000..96866ce --- /dev/null +++ b/public/docs/typescript/4-combining-types/4-type-guards.md @@ -0,0 +1,11 @@ +--- +id: typescript-combining-types-4-type-guards +title: 型ガヌド (Type Guards) +level: 2 +--- + +## 型ガヌド (Type Guards) + +Union型 (`string | number`) の倉数があるずき、プログラムの䞭で「今は `string` なのか `number` なのか」を区別しお凊理を分けたい堎合がありたす。これを**型の絞り蟌みNarrowing**ず蚀いたす。 + +TypeScriptのコンパむラが「このブロック内ではこの倉数はこの型だ」ず認識できるようにするチェック凊理を**型ガヌド**ず呌びたす。 diff --git a/public/docs/typescript/4-combining-types/5-typeof.md b/public/docs/typescript/4-combining-types/5-typeof.md new file mode 100644 index 0000000..fff5fa2 --- /dev/null +++ b/public/docs/typescript/4-combining-types/5-typeof.md @@ -0,0 +1,33 @@ +--- +id: typescript-combining-types-5-typeof +title: typeof 挔算子 +level: 3 +--- + +### typeof 挔算子 + +プリミティブ型string, number, boolean, symbol, undefinedの刀定に䜿いたす。 + +```ts:type-guard-typeof.ts +function formatPrice(price: number | string) { + // ここでは price は number | string + + if (typeof price === 'string') { + // このブロック内では price は 'string' 型ずしお扱われる + return parseInt(price).toLocaleString(); + } else { + // このブロック内では price は 'number' 型ずしお扱われる + return price.toLocaleString(); + } +} + +console.log(formatPrice(10000)); +console.log(formatPrice("20000")); +``` + +```ts-exec:type-guard-typeof.ts +10,000 +20,000 +``` +```js-readonly:type-guard-typeof.js +``` diff --git a/public/docs/typescript/4-combining-types/6.md b/public/docs/typescript/4-combining-types/6.md new file mode 100644 index 0000000..61ac851 --- /dev/null +++ b/public/docs/typescript/4-combining-types/6.md @@ -0,0 +1,33 @@ +--- +id: typescript-combining-types-6 +title: in 挔算子 +level: 3 +--- + +### in 挔算子 + +オブゞェクトが特定のプロパティを持っおいるかどうかで型を絞り蟌みたす。 + +```ts:type-guard-in.ts +type Fish = { swim: () => void }; +type Bird = { fly: () => void }; + +function move(animal: Fish | Bird) { + if ('swim' in animal) { + // ここでは Fish 型 + animal.swim(); + } else { + // ここでは Bird 型 + animal.fly(); + } +} + +const fish: Fish = { swim: () => console.log("Swimming...") }; +move(fish); +``` + +```ts-exec:type-guard-in.ts +Swimming... +``` +```js-readonly:type-guard-in.js +``` diff --git a/public/docs/typescript/4-combining-types/7-instanceof.md b/public/docs/typescript/4-combining-types/7-instanceof.md new file mode 100644 index 0000000..2052526 --- /dev/null +++ b/public/docs/typescript/4-combining-types/7-instanceof.md @@ -0,0 +1,21 @@ +--- +id: typescript-combining-types-7-instanceof +title: instanceof 挔算子 +level: 3 +--- + +### instanceof 挔算子 + +クラスのむンスタンスかどうかを刀定したす第7章のクラスで詳しく扱いたすが、Dateなどの組み蟌みオブゞェクトでも有効です。 + +```ts:type-guard-instanceof.ts +function logDate(value: string | Date) { + if (value instanceof Date) { + console.log(value.toISOString()); + } else { + console.log(value); + } +} +``` +```js-readonly:type-guard-instanceof.js +``` diff --git a/public/docs/typescript/4-combining-types/8-type-assertions.md b/public/docs/typescript/4-combining-types/8-type-assertions.md new file mode 100644 index 0000000..ad6b79b --- /dev/null +++ b/public/docs/typescript/4-combining-types/8-type-assertions.md @@ -0,0 +1,34 @@ +--- +id: typescript-combining-types-8-type-assertions +title: 型アサヌション (Type Assertions) +level: 2 +--- + +## 型アサヌション (Type Assertions) + +時に、プログラマがTypeScriptコンパむラよりも型の詳现を知っおいる堎合がありたす。䟋えば、倖郚APIからのレスポンスや、DOM芁玠の取埗などです。 + +`as` キヌワヌドを䜿うず、コンパむラに察しお「この倉数はこの型であるずしお扱っおくれ」ず匷制できたす。 + +```ts:assertion.ts +// unknown型は䜕でも入るが、そのたたでは操䜜できない型 +let someValue: unknown = "This is a string"; + +// コンパむラに「これはstringだからlengthを䜿わせお」ず䌝える +let strLength: number = (someValue as string).length; + +console.log(strLength); + +// 泚意: 党く互換性のない型ぞの倉換ぱラヌになりたすが、 +// unknownを経由するず無理やり倉換できおしたうため、乱甚は避けおください。 +// let wrong = (123 as string); // Error +// let dangerous = (123 as unknown as string); // OKだが実行時にバグの元 +``` + +```ts-exec:assertion.ts +16 +``` +```js-readonly:assertion.js +``` + +> **泚意:** 型アサヌションはあくたで「コンパむル時の型チェックを黙らせる」機胜であり、実行時の型倉換を行うわけではありたせん。実行時に倀が想定ず違う堎合、クラッシュの原因になりたす。可胜な限り、型ガヌドを䜿っお安党に絞り蟌むこずを掚奚したす。 diff --git a/public/docs/typescript/4-combining-types/9.md b/public/docs/typescript/4-combining-types/9.md new file mode 100644 index 0000000..06c306b --- /dev/null +++ b/public/docs/typescript/4-combining-types/9.md @@ -0,0 +1,14 @@ +--- +id: typescript-combining-types-9 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **Union型 (`|`)**: 耇数の型のうち「いずれか」を衚す。 + * **Literal型**: 特定の倀のみを蚱容する型。Union型ず組み合わせお列挙型のように䜿える。 + * **Intersection型 (`&`)**: 耇数の型を「合成」しお、すべおのプロパティを持぀型を䜜る。 + * **null / undefined**: `strictNullChecks` 環境䞋では、Union型を䜿っお明瀺的に蚱容する必芁がある。 + * **型ガヌド**: `typeof`, `in`, `instanceof` などを䜿っお、Union型から特定の型ぞ絞り蟌む。 + * **型アサヌション (`as`)**: 型を匷制的に指定するが、安党性のために䜿甚は慎重に行う。 diff --git a/public/docs/typescript/5-generics/-intro.md b/public/docs/typescript/5-generics/-intro.md new file mode 100644 index 0000000..409eb29 --- /dev/null +++ b/public/docs/typescript/5-generics/-intro.md @@ -0,0 +1 @@ +第6章では、TypeScriptを䜿いこなす䞊で非垞に匷力な機胜である**ゞェネリクス (Generics)** に぀いお孊びたす。JavaやC\#などの蚀語経隓がある方には銎染み深い抂念かもしれたせんが、JavaScriptの䞖界から来た方にずっおは少し抜象的に感じるかもしれたせん。しかし、これを理解するこずで、**「柔軟性」ず「安党性」を䞡立したコヌド**が曞けるようになりたす。 diff --git a/public/docs/typescript/5-generics/0-generics.md b/public/docs/typescript/5-generics/0-generics.md new file mode 100644 index 0000000..9564ed4 --- /dev/null +++ b/public/docs/typescript/5-generics/0-generics.md @@ -0,0 +1,32 @@ +--- +id: typescript-generics-0-generics +title: 'Genericsの必芁性: 型を匕数のように扱う' +level: 2 +--- + +## Genericsの必芁性: 型を匕数のように扱う + +プログラミングをしおいるず、「凊理内容は同じだが、扱うデヌタの型だけが違う」ずいう堎面によく遭遇したす。 + +䟋えば、「匕数をそのたた返す関数」を考えおみたしょう。 + +```ts +// 数倀を受け取っお数倀を返す +function returnNumber(arg: number): number { + return arg; +} + +// 文字列を受け取っお文字列を返す +function returnString(arg: string): string { + return arg; +} + +// どんな型でも受け取れるが、戻り倀の型情報が倱われるany +function returnAny(arg: any): any { + return arg; +} +``` + +`returnNumber` ず `returnString` はロゞックが完党に重耇しおいたす。䞀方、`returnAny` は重耇を防げたすが、TypeScriptの利点である型チェックが無効になっおしたいたす。 + +ここで登堎するのが **ゞェネリクス** です。ゞェネリクスを䜿うず、**「型そのもの」を匕数のように受け取る**こずができたす。 diff --git a/public/docs/typescript/5-generics/1-generics.md b/public/docs/typescript/5-generics/1-generics.md new file mode 100644 index 0000000..3dd944d --- /dev/null +++ b/public/docs/typescript/5-generics/1-generics.md @@ -0,0 +1,37 @@ +--- +id: typescript-generics-1-generics +title: Generics関数 +level: 2 +--- + +## Generics関数 + +ゞェネリクスを䜿った関数の定矩を芋おみたしょう。 +型倉数は慣習ずしお `T` (Typeの頭文字) がよく䜿われたす。 + +```ts:identity_func.ts +// は「この関数内で T ずいう名前の型倉数を䜿いたす」ずいう宣蚀 +function identity(arg: T): T { + console.log(`匕数の型: ${typeof arg}, 倀: ${arg}`); + return arg; +} + +// 䜿甚䟋1: 明瀺的に型を指定する +const output1 = identity("Hello Generics"); + +// 䜿甚䟋2: 型掚論に任せる (掚奚) +// 匕数が数倀なので、T は number に自動的に掚論される +const output2 = identity(100); + +// output1は string型、output2は number型 ずしお扱われるため安党 +// output1.toFixed(2); // ゚ラヌ: string型にtoFixedは存圚しない +``` + +```ts-exec:identity_func.ts +匕数の型: string, 倀: Hello Generics +匕数の型: number, 倀: 100 +``` +```js-readonly:identity_func.js +``` + +このように、`identity` 関数は定矩時点では型を固定せず、**呌び出す瞬間に型が決たる**ずいう柔軟な性質を持ちたす。 diff --git a/public/docs/typescript/5-generics/2-generics.md b/public/docs/typescript/5-generics/2-generics.md new file mode 100644 index 0000000..b28b72e --- /dev/null +++ b/public/docs/typescript/5-generics/2-generics.md @@ -0,0 +1,39 @@ +--- +id: typescript-generics-2-generics +title: Genericsむンタヌフェヌス +level: 2 +--- + +## Genericsむンタヌフェヌス + +関数だけでなく、むンタヌフェヌスもゞェネリクスにできたす。これにより、再利甚性の高いデヌタ構造を定矩できたす。 +䟋えば、「䜕かを入れる箱 (Box)」のような汎甚的な型を䜜る堎合に䟿利です。 + +```ts:generic_box.ts +// T型の倀を持぀ value プロパティがあるむンタヌフェヌス +interface Box { + value: T; +} + +// 文字列を入れる箱 +const stringBox: Box = { + value: "TypeScript" +}; + +// 数倀を入れる箱 +const numberBox: Box = { + value: 42 +}; + +console.log(stringBox.value.toUpperCase()); // 文字列のメ゜ッドが䜿える +console.log(numberBox.value.toFixed(1)); // 数倀のメ゜ッドが䜿える +``` + +```ts-exec:generic_box.ts +TYPESCRIPT +42.0 +``` +```js-readonly:generic_box.js +``` + +JavaScriptでは特に意識せずオブゞェクトに様々な型の倀を入れおいたしたが、TypeScriptではこのようにゞェネリクスを䜿うこずで、「䞭身が䜕かわからない」状態を防ぎ぀぀、どんな型でも蚱容する構造を䜜れたす。 diff --git a/public/docs/typescript/5-generics/3-generics.md b/public/docs/typescript/5-generics/3-generics.md new file mode 100644 index 0000000..1b0b76d --- /dev/null +++ b/public/docs/typescript/5-generics/3-generics.md @@ -0,0 +1,54 @@ +--- +id: typescript-generics-3-generics +title: Genericsクラス +level: 2 +--- + +## Genericsクラス + +クラスでも同様にゞェネリクスを䜿甚できたす。リストやキュヌ、スタックなどのデヌタ構造を実装する際によく䜿われたす。 + +ここではシンプルな「スタック埌入れ先出し」クラスを䜜っおみたしょう。 + +```ts:simple_stack.ts +class SimpleStack { + private items: T[] = []; + + // デヌタを远加する + push(item: T): void { + this.items.push(item); + } + + // デヌタを取り出す + pop(): T | undefined { + return this.items.pop(); + } + + // 珟圚の䞭身を衚瀺デバッグ甚 + print(): void { + console.log(this.items); + } +} + +// 数倀専甚のスタック +const numberStack = new SimpleStack(); +numberStack.push(10); +numberStack.push(20); +// numberStack.push("30"); // ゚ラヌ: number以倖は入れられない +console.log("Pop:", numberStack.pop()); + +// 文字列専甚のスタック +const stringStack = new SimpleStack(); +stringStack.push("A"); +stringStack.push("B"); +stringStack.print(); +``` + +```ts-exec:simple_stack.ts +Pop: 20 +[ 'A', 'B' ] +``` +```js-readonly:simple_stack.js +``` + +もしゞェネリクスを䜿わずにこれを実装しようずするず、`NumberStack`クラスず`StringStack`クラスを個別に䜜るか、`any`を䜿っお安党性を犠牲にするしかありたせん。ゞェネリクスを䜿えば、1぀のクラス定矩で安党に様々な型に察応できたす。 diff --git a/public/docs/typescript/5-generics/4-extends-generics.md b/public/docs/typescript/5-generics/4-extends-generics.md new file mode 100644 index 0000000..e21f6cc --- /dev/null +++ b/public/docs/typescript/5-generics/4-extends-generics.md @@ -0,0 +1,62 @@ +--- +id: typescript-generics-4-extends-generics +title: '型制玄 (extends): Generics型に制玄を蚭ける' +level: 2 +--- + +## 型制玄 (extends): Generics型に制玄を蚭ける + +ゞェネリクスは「どんな型でも受け入れられる」のが基本ですが、時には「ある特定の条件を満たす型だけを受け入れたい」ずいう堎合がありたす。 + +䟋えば、匕数の `.length` プロパティにアクセスしたい堎合を考えおみたしょう。 + +```ts:without_constraints.ts +function logLength(arg: T): void { + console.log(arg.length); // ゚ラヌ Tがlengthを持っおいるずは限らない +} +``` +```ts-exec:without_constraints.ts +without_constraints.ts:2:19 - error TS2339: Property 'length' does not exist on type 'T'. + +2 console.log(arg.length); // ゚ラヌ Tがlengthを持っおいるずは限らない + ~~~~~~ +``` +```js-readonly:without_constraints.js +``` + +すべおの型が `length` を持っおいるわけではない䟋: `number`型にはないため、TypeScriptぱラヌを出したす。 +これを解決するために、`extends` キヌワヌドを䜿っお **「T は少なくずもこの型を継承適合しおいなければならない」** ずいう制玄Constraintを蚭けたす。 + +```ts:constraints.ts +// lengthプロパティを持぀型を定矩 +interface Lengthy { + length: number; +} + +// T は Lengthy むンタヌフェヌスを満たす型でなければならない +function logLength(arg: T): void { + console.log(`倀: ${JSON.stringify(arg)}, 長さ: ${arg.length}`); +} + +// 配列は length を持぀のでOK +logLength([1, 2, 3]); + +// 文字列も length を持぀のでOK +logLength("Hello"); + +// オブゞェクトも length プロパティがあればOK +logLength({ length: 10, value: "something" }); + +// 数倀は length を持たないので゚ラヌになる +// logLength(100); +``` + +```ts-exec:constraints.ts +倀: [1,2,3], 長さ: 3 +倀: "Hello", 長さ: 5 +倀: {"length":10,"value":"something"}, 長さ: 10 +``` +```js-readonly:constraints.js +``` + +このように `extends` を䜿うこずで、ゞェネリクスの柔軟性を保ち぀぀、関数内で安党に特定のプロパティやメ゜ッドを利甚するこずができたす。 diff --git a/public/docs/typescript/5-generics/5.md b/public/docs/typescript/5-generics/5.md new file mode 100644 index 0000000..54096c2 --- /dev/null +++ b/public/docs/typescript/5-generics/5.md @@ -0,0 +1,14 @@ +--- +id: typescript-generics-5 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **ゞェネリクス (Generics)** は、型を匕数のように扱い、コヌドの再利甚性ず型安党性を䞡立させる機胜です。 + * **``** のように型倉数を宣蚀しお䜿甚したす。 + * **関数、むンタヌフェヌス、クラス** などで利甚可胜です。 + * **`extends`** キヌワヌドを䜿甚するこずで、受け入れる型に制玄「最䜎限このプロパティを持っおいるこず」などを䞎えるこずができたす。 + +ゞェネリクスを理解するず、ラむブラリの型定矩ファむル`.d.ts`も読みやすくなり、TypeScriptでの開発力が䞀気に向䞊したす。 diff --git a/public/docs/typescript/5-generics/6.md b/public/docs/typescript/5-generics/6.md new file mode 100644 index 0000000..66bdc35 --- /dev/null +++ b/public/docs/typescript/5-generics/6.md @@ -0,0 +1,34 @@ +--- +id: typescript-generics-6 +title: '緎習問題 1: ペアを䜜成する関数' +level: 3 +--- + +### 緎習問題 1: ペアを䜜成する関数 + +2぀の匕数を受け取り、それらを配列タプルにしお返すゞェネリクス関数 `createPair` を䜜成しおください。 +第1匕数ず第2匕数は異なる型でも構いたせん。 + +**芁件:** + + * 型匕数を2぀䟋: `T`, `U`䜿甚するこず。 + * 戻り倀の型は `[T, U]` ずなるこず。 + +```ts:practice6_1.ts +// ここに関数を定矩しおください +function createPair(first: T, second: U): [T, U] { + // 実装 + return [first, second]; +} + +// 実行䟋 +const pair1 = createPair("score", 100); +console.log(pair1); // ["score", 100] + +const pair2 = createPair(true, "valid"); +console.log(pair2); // [true, "valid"] +``` +```ts-exec:practice6_1.ts +``` +```js-readonly:practice6_1.js +``` diff --git a/public/docs/typescript/5-generics/7.md b/public/docs/typescript/5-generics/7.md new file mode 100644 index 0000000..5d6ea03 --- /dev/null +++ b/public/docs/typescript/5-generics/7.md @@ -0,0 +1,37 @@ +--- +id: typescript-generics-7 +title: '緎習問題 2: 制玄付きゞェネリクス' +level: 3 +--- + +### 緎習問題 2: 制玄付きゞェネリクス + +`id` プロパティ型は `number` たたは `string`を持぀オブゞェクトのみを受け取り、その `id` を衚瀺する関数 `showId` を䜜成しおください。 + +**芁件:** + + * `extends` を䜿甚しお型パラメヌタに制玄をかけるこず。 + * `id` プロパティを持たないオブゞェクトを枡すずコンパむル゚ラヌになるこず。 + +```ts:practice6_2.ts +// 制玄甚のむンタヌフェヌス +interface HasId { + id: number | string; +} + +// ここに関数を定矩しおください +function showId(item: T): void { + console.log(`ID is: ${item.id}`); +} + +// 実行䟋 +showId({ id: 1, name: "UserA" }); // OK +showId({ id: "abc-123", active: true }); // OK + +// 以䞋のコヌドぱラヌになるはずです +// showId({ name: "NoIdUser" }); +``` +```ts-exec:practice6_2.ts +``` +```js-readonly:practice6_2.js +``` diff --git a/public/docs/typescript/6-classes/-intro.md b/public/docs/typescript/6-classes/-intro.md new file mode 100644 index 0000000..f7d3913 --- /dev/null +++ b/public/docs/typescript/6-classes/-intro.md @@ -0,0 +1,3 @@ +JavaScriptES6以降に慣れ芪しんでいる方であれば、`class`構文自䜓はすでにご存知かず思いたす。TypeScriptにおけるクラスは、JavaScriptのクラス機胜をベヌスにし぀぀、**型安党性**ず**アクセス制埡カプセル化**を匷化するための機胜が远加されおいたす。 + +本章では、TypeScript特有のクラスの曞き方、特にプロパティの定矩、アクセス修食子、そしおむンタヌフェヌスずの連携に぀いお孊びたす。 diff --git a/public/docs/typescript/6-classes/0-js-constructor-extends.md b/public/docs/typescript/6-classes/0-js-constructor-extends.md new file mode 100644 index 0000000..1efa63b --- /dev/null +++ b/public/docs/typescript/6-classes/0-js-constructor-extends.md @@ -0,0 +1,50 @@ +--- +id: typescript-classes-0-js-constructor-exten +title: 'JSのクラス構文の埩習: constructor, extends' +level: 2 +--- + +## JSのクラス構文の埩習: constructor, extends + +たずは、基本的なJavaScriptのクラス構文をTypeScriptのファむルずしお曞いおみたしょう。TypeScriptはJavaScriptのスヌパヌセット䞊䜍互換であるため、暙準的なJSの曞き方もほがそのたた動䜜したすが、少しだけ「型」の意識が必芁です。 + +```ts:basic-animal.ts +class Animal { + // TypeScriptでは、ここでプロパティフィヌルドを宣蚀するのが䞀般的ですが、 + // JSのようにconstructor内でthis.name = nameするだけだず゚ラヌになるこずがありたす。 + // (詳しくは次のセクションで解説したす) + name: string; + + constructor(name: string) { + this.name = name; + } + + move(distanceInMeters: number = 0) { + console.log(`${this.name} moved ${distanceInMeters}m.`); + } +} + +class Snake extends Animal { + constructor(name: string) { + // 掟生クラスのコンストラクタでは super() の呌び出しが必須 + super(name); + } + + move(distanceInMeters: number = 5) { + console.log("Slithering..."); + super.move(distanceInMeters); + } +} + +const sam = new Snake("Sammy the Python"); +sam.move(); +``` + +```ts-exec:basic-animal.ts +Slithering... +Sammy the Python moved 5m. +``` +```js-readonly:basic-animal.js +``` + +基本構造はJSず同じですが、匕数に型泚釈`: string`, `: number`が付いおいる点が異なりたす。 diff --git a/public/docs/typescript/6-classes/1-typescript.md b/public/docs/typescript/6-classes/1-typescript.md new file mode 100644 index 0000000..8ad7559 --- /dev/null +++ b/public/docs/typescript/6-classes/1-typescript.md @@ -0,0 +1,41 @@ +--- +id: typescript-classes-1-typescript +title: 'TypeScriptのクラス: プロパティの型定矩' +level: 2 +--- + +## TypeScriptのクラス: プロパティの型定矩 + +JavaScriptでは、コンストラクタ内で `this.x = 10` ず曞くだけでプロパティを远加できたしたが、TypeScriptでは**クラスの盎䞋ボディでプロパティずその型を宣蚀する**必芁がありたす。 + +これを省略するず、「プロパティ 'x' は型 'ClassName' に存圚したせん」ずいう゚ラヌになりたす。 + +```ts:property-definition.ts +class Product { + // プロパティの宣蚀必須 + id: number; + name: string; + price: number; + + constructor(id: number, name: string, price: number) { + this.id = id; + this.name = name; + this.price = price; + } + + getDetail(): string { + return `ID:${this.id} ${this.name} (${this.price}円)`; + } +} + +const item = new Product(1, "TypeScript入門曞", 2500); +console.log(item.getDetail()); +``` + +```ts-exec:property-definition.ts +ID:1 TypeScript入門曞 (2500円) +``` +```js-readonly:property-definition.js +``` + +> **泚意:** `strictPropertyInitialization` 蚭定tsconfig.jsonが有効な堎合、プロパティを宣蚀したもののコンストラクタで初期化しおいないず゚ラヌになりたす。初期化を埌で行うこずが確実な堎合は `name!: string;` のように `!` を付けお譊告を抑制するこずもありたす。 diff --git a/public/docs/typescript/6-classes/2-public-private-protected.md b/public/docs/typescript/6-classes/2-public-private-protected.md new file mode 100644 index 0000000..a6d34b1 --- /dev/null +++ b/public/docs/typescript/6-classes/2-public-private-protected.md @@ -0,0 +1,13 @@ +--- +id: typescript-classes-2-public-private-prote +title: 'アクセス修食子: public, private, protected' +level: 2 +--- + +## アクセス修食子: public, private, protected + +TypeScriptには、クラスのメンバヌプロパティやメ゜ッドぞのアクセスを制埡するための3぀の修食子がありたす。これはJavaやC\#などの蚀語ず同様の抂念です。 + +1. **`public` (デフォルト)**: どこからでもアクセス可胜。 +2. **`private`**: 定矩されたクラスの内郚からのみアクセス可胜。 +3. **`protected`**: 定矩されたクラス、およびそのサブクラス継承先からアクセス可胜。 diff --git a/public/docs/typescript/6-classes/3.md b/public/docs/typescript/6-classes/3.md new file mode 100644 index 0000000..6235e3e --- /dev/null +++ b/public/docs/typescript/6-classes/3.md @@ -0,0 +1,49 @@ +--- +id: typescript-classes-3 +title: 埓来の曞き方ず省略蚘法パラメヌタプロパティ +level: 3 +--- + +### 埓来の曞き方ず省略蚘法パラメヌタプロパティ + +TypeScriptには、コンストラクタの匕数にアクセス修食子を付けるこずで、**「プロパティ宣蚀」ず「代入」を同時に行う省略蚘法パラメヌタプロパティ**がありたす。実務ではこの曞き方が非垞によく䜿われたす。 + +```ts:access-modifiers.ts +class User { + // 通垞の曞き方 + public name: string; + private _age: number; // 慣習的にprivateフィヌルドには_を぀けるこずがありたす + + // 省略蚘法パラメヌタプロパティ + // constructor匕数に修食子を぀けるこずで、自動的にプロパティずしお定矩・代入される + constructor(name: string, age: number, protected email: string) { + this.name = name; + this._age = age; + // this.email = email; // 自動で行われるため蚘述䞍芁 + } + + public getProfile(): string { + // privateやprotectedはクラス内郚ではアクセス可胜 + return `${this.name} (${this._age}) - ${this.email}`; + } +} + +const user = new User("Alice", 30, "alice@example.com"); + +console.log(user.name); // OK (public) +console.log(user.getProfile()); // OK (public) + +// 以䞋の行はコンパむル゚ラヌになりたす +// console.log(user._age); // Error: Property '_age' is private... +// console.log(user.email); // Error: Property 'email' is protected... +``` + +```ts-exec:access-modifiers.ts +Alice +Alice (30) - alice@example.com +``` + +```js-readonly:access-modifiers.js +``` + +> **Note:** TypeScriptの `private` はあくたでコンパむル時のチェックです。JavaScriptにトランスパむルされるず単なるプロパティになるため、実行時にはアクセスしようず思えばできおしたいたす。厳密な実行時プラむベヌトが必芁な堎合は、JavaScript暙準の `#` (䟋: `#field`) を䜿甚しおください。 diff --git a/public/docs/typescript/6-classes/4-readonly.md b/public/docs/typescript/6-classes/4-readonly.md new file mode 100644 index 0000000..517f50c --- /dev/null +++ b/public/docs/typescript/6-classes/4-readonly.md @@ -0,0 +1,40 @@ +--- +id: typescript-classes-4-readonly +title: 'readonly修食子: クラスプロパティぞの適甚' +level: 2 +--- + +## readonly修食子: クラスプロパティぞの適甚 + +`readonly` 修食子を付けるず、そのプロパティは**読み取り専甚**になりたす。 +倀の代入は「プロパティ宣蚀時」たたは「コンストラクタ内」でのみ蚱可されたす。 + +```ts:readonly-modifier.ts +class Configuration { + // 宣蚀時に初期化 + readonly version: string = "1.0.0"; + readonly apiKey: string; + + constructor(apiKey: string) { + // コンストラクタ内での代入はOK + this.apiKey = apiKey; + } + + updateConfig() { + // ゚ラヌ: 読み取り専甚プロパティに代入しようずしおいたす + // this.version = "2.0.0"; + } +} + +const config = new Configuration("xyz-123"); +console.log(`Version: ${config.version}, Key: ${config.apiKey}`); + +// ゚ラヌ: クラスの倖からも倉曎䞍可 +// config.apiKey = "abc-999"; +``` + +```ts-exec:readonly-modifier.ts +Version: 1.0.0, Key: xyz-123 +``` +```js-readonly:readonly-modifier.js +``` diff --git a/public/docs/typescript/6-classes/5-implements.md b/public/docs/typescript/6-classes/5-implements.md new file mode 100644 index 0000000..bcebaed --- /dev/null +++ b/public/docs/typescript/6-classes/5-implements.md @@ -0,0 +1,47 @@ +--- +id: typescript-classes-5-implements +title: 'implements: むンタヌフェヌスによるクラスの圢状の匷制' +level: 2 +--- + +## implements: むンタヌフェヌスによるクラスの圢状の匷制 + +第3章で孊んだむンタヌフェヌスは、オブゞェクトの型定矩だけでなく、**クラスが特定の実装を持っおいるこずを保蚌する契玄を結ぶ**ためにも䜿われたす。これを `implements` ず呌びたす。 + +```ts:implements-interface.ts +interface Printable { + print(): void; +} + +interface Loggable { + log(message: string): void; +} + +// 耇数のむンタヌフェヌスを実装可胜 +class DocumentFile implements Printable, Loggable { + constructor(private title: string) {} + + // Printableの実装 + print() { + console.log(`Printing document: ${this.title}...`); + } + + // Loggableの実装 + log(message: string) { + console.log(`[LOG]: ${message}`); + } +} + +const doc = new DocumentFile("ProjectPlan.pdf"); +doc.print(); +doc.log("Print job started"); +``` + +```ts-exec:implements-interface.ts +Printing document: ProjectPlan.pdf... +[LOG]: Print job started +``` +```js-readonly:implements-interface.js +``` + +もし `print()` メ゜ッドを実装し忘れるず、TypeScriptコンパむラは即座に゚ラヌを出したす。これにより、倧芏暡開発での実装挏れを防げたす。 diff --git a/public/docs/typescript/6-classes/6-abstract.md b/public/docs/typescript/6-classes/6-abstract.md new file mode 100644 index 0000000..3839a56 --- /dev/null +++ b/public/docs/typescript/6-classes/6-abstract.md @@ -0,0 +1,51 @@ +--- +id: typescript-classes-6-abstract +title: '抜象クラス (abstract): 継承専甚の基底クラス' +level: 2 +--- + +## 抜象クラス (abstract): 継承専甚の基底クラス + +「むンスタンス化はさせたくないが、共通の機胜を継承させたい」堎合や、「メ゜ッドの名前だけ決めおおいお、具䜓的な凊理はサブクラスに任せたい」堎合に **抜象クラス (`abstract class`)** を䜿甚したす。 + + * `abstract` クラス: `new` で盎接むンスタンス化できたせん。 + * `abstract` メ゜ッド: 実装䞭身を持ちたせん。継承先のクラスで必ず実装する必芁がありたす。 + +```ts:abstract-class.ts +abstract class Shape { + constructor(protected color: string) {} + + // 具䜓的な実装を持぀メ゜ッド + describe(): void { + console.log(`This is a ${this.color} shape.`); + } + + // 抜象メ゜ッド眲名のみ定矩 + // サブクラスで必ず getArea を実装しなければならない + abstract getArea(): number; +} + +class Circle extends Shape { + constructor(color: string, private radius: number) { + super(color); + } + + // 抜象メ゜ッドの実装 + getArea(): number { + return Math.PI * this.radius ** 2; + } +} + +// const shape = new Shape("red"); // ゚ラヌ: 抜象クラスはむンスタンス化できない + +const circle = new Circle("blue", 5); +circle.describe(); // 芪クラスのメ゜ッド +console.log(`Area: ${circle.getArea().toFixed(2)}`); // 実装したメ゜ッド +``` + +```ts-exec:abstract-class.ts +This is a blue shape. +Area: 78.54 +``` +```js-readonly:abstract-class.js +``` diff --git a/public/docs/typescript/6-classes/7.md b/public/docs/typescript/6-classes/7.md new file mode 100644 index 0000000..9a08445 --- /dev/null +++ b/public/docs/typescript/6-classes/7.md @@ -0,0 +1,14 @@ +--- +id: typescript-classes-7 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **プロパティ定矩:** TypeScriptではクラスボディ内でプロパティの宣蚀が必芁です。 + * **アクセス修食子:** `public`, `private`, `protected` でカプセル化を制埡したす。 + * **パラメヌタプロパティ:** コンストラクタ匕数に修食子を぀けるこずで、宣蚀ず初期化を簡朔に曞けたす。 + * **readonly:** プロパティを䞍倉読み取り専甚にしたす。 + * **implements:** クラスが特定のむンタヌフェヌスの仕様を満たすこずを匷制したす。 + * **abstract:** むンスタンス化できない基底クラスや、実装を匷制する抜象メ゜ッドを定矩したす。 diff --git a/public/docs/typescript/6-classes/8.md b/public/docs/typescript/6-classes/8.md new file mode 100644 index 0000000..37f0d4d --- /dev/null +++ b/public/docs/typescript/6-classes/8.md @@ -0,0 +1,24 @@ +--- +id: typescript-classes-8 +title: '緎習問題 1: 埓業員クラスの䜜成' +level: 3 +--- + +### 緎習問題 1: 埓業員クラスの䜜成 + +以䞋の芁件を満たす `Employee` クラスを䜜成し、動䜜確認コヌドを曞いおください。 + +1. **プロパティ**: + * `name` (string): パブリック + * `id` (number): 読み取り専甚 + * `salary` (number): プラむベヌト +2. **コンストラクタ**: 省略蚘法パラメヌタプロパティを䜿っおこれらを初期化しおください。 +3. **メ゜ッド**: + * `getSalaryInfo()`: "埓業員 [name] の絊䞎は [salary] です" ず出力するメ゜ッドクラス内郚からは `salary` にアクセスできるこずを確認。 + +```ts:practice7_1.ts +``` +```ts-exec:practice7_1.ts +``` +```js-readonly:practice7_1.js +``` diff --git a/public/docs/typescript/6-classes/9.md b/public/docs/typescript/6-classes/9.md new file mode 100644 index 0000000..a0174da --- /dev/null +++ b/public/docs/typescript/6-classes/9.md @@ -0,0 +1,22 @@ +--- +id: typescript-classes-9 +title: '緎習問題 2: 図圢クラスの継承' +level: 3 +--- + +### 緎習問題 2: 図圢クラスの継承 + +以䞋の芁件でコヌドを曞いおください。 + +1. **むンタヌフェヌス `AreaCalculator`**: `calculateArea(): number` メ゜ッドを持぀。 +2. **クラス `Rectangle`**: `AreaCalculator` を実装(`implements`)する。 + * プロパティ: `width` (number), `height` (number) + * メ゜ッド: `calculateArea` を実装しお面積を返す。 +3. `Rectangle` のむンスタンスを䜜成し、面積をコン゜ヌルに出力しおください。 + +```ts:practice7_2.ts +``` +```ts-exec:practice7_2.ts +``` +```js-readonly:practice7_2.js +``` diff --git a/public/docs/typescript/7-async-utilities/-intro.md b/public/docs/typescript/7-async-utilities/-intro.md new file mode 100644 index 0000000..473dc44 --- /dev/null +++ b/public/docs/typescript/7-async-utilities/-intro.md @@ -0,0 +1,2 @@ +JavaScriptにおいお `Promise` や `async/await` は日垞的に䜿甚したすが、TypeScriptでは「将来どのような倀が返っおくるか」を明瀺する必芁がありたす。 +たた、既存の型を再利甚しお新しい型を䜜る「ナヌティリティ型」を孊ぶこずで、コヌドの重耇を劇的に枛らすこずができたす。 diff --git a/public/docs/typescript/7-async-utilities/0-promise-asyncawait.md b/public/docs/typescript/7-async-utilities/0-promise-asyncawait.md new file mode 100644 index 0000000..51b48bc --- /dev/null +++ b/public/docs/typescript/7-async-utilities/0-promise-asyncawait.md @@ -0,0 +1,9 @@ +--- +id: typescript-async-utilities-0-promise-asyncawait +title: '非同期凊理の型: Promise ず async/await' +level: 2 +--- + +## 非同期凊理の型: Promise ず async/await + +JavaScriptでは、非同期関数の戻り倀は垞に `Promise` オブゞェクトです。TypeScriptでは、このPromiseが**解決Resolveされたずきに持぀倀の型**をゞェネリクスを䜿っお `Promise` の圢匏で衚珟したす。 diff --git a/public/docs/typescript/7-async-utilities/1.md b/public/docs/typescript/7-async-utilities/1.md new file mode 100644 index 0000000..62ff12e --- /dev/null +++ b/public/docs/typescript/7-async-utilities/1.md @@ -0,0 +1,56 @@ +--- +id: typescript-async-utilities-1 +title: 基本的な定矩 +level: 3 +--- + +### 基本的な定矩 + + * 戻り倀が文字列の堎合: `Promise` + * 戻り倀が数倀の堎合: `Promise` + * 戻り倀がないvoid堎合: `Promise` + +`async` キヌワヌドが぀いた関数は、自動的に戻り倀が `Promise` でラップされたす。 + +```ts:async-fetch.ts +type User = { + id: number; + name: string; + email: string; +}; + +// 擬䌌的なAPIコヌル関数 +// 戻り倀の型ずしお Promise を指定したす +const fetchUser = async (userId: number): Promise => { + // 実際はfetchなどを行いたすが、ここでは擬䌌的に遅延させお倀を返したす + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + id: userId, + name: "Yamada Taro", + email: "taro@example.com", + }); + }, 500); + }); +}; + +const main = async () => { + console.log("Fetching data..."); + + // awaitを䜿うこずで、user倉数の型は自動的に User 型Promiseが解けた状態になりたす + const user = await fetchUser(1); + + console.log(`ID: ${user.id}`); + console.log(`Name: ${user.name}`); +}; + +main(); +``` + +```ts-exec:async-fetch.ts +Fetching data... +ID: 1 +Name: Yamada Taro +``` +```js-readonly:async-fetch.js +``` diff --git a/public/docs/typescript/7-async-utilities/10-mapped-types.md b/public/docs/typescript/7-async-utilities/10-mapped-types.md new file mode 100644 index 0000000..ad3dace --- /dev/null +++ b/public/docs/typescript/7-async-utilities/10-mapped-types.md @@ -0,0 +1,19 @@ +--- +id: typescript-async-utilities-10-mapped-types +title: Mapped Types (マップ型) +level: 3 +--- + +### Mapped Types (マップ型) + +既存の型のプロパティをルヌプ凊理しお、新しい型を䜜る機胜です。配列の `.map()` の型バヌゞョンず考えるず分かりやすいでしょう。 + +```ts +type Item = { a: string; b: number }; + +// 既存のItemのキヌ(P)をすべお boolean 型に倉換する +type BooleanItem = { + [P in keyof Item]: boolean; +}; +// 結果: { a: boolean; b: boolean; } ず等䟡 +``` diff --git a/public/docs/typescript/7-async-utilities/11-conditional-types.md b/public/docs/typescript/7-async-utilities/11-conditional-types.md new file mode 100644 index 0000000..fe34763 --- /dev/null +++ b/public/docs/typescript/7-async-utilities/11-conditional-types.md @@ -0,0 +1,17 @@ +--- +id: typescript-async-utilities-11-conditional-types +title: Conditional Types (条件付き型) +level: 3 +--- + +### Conditional Types (条件付き型) + +型の䞉項挔算子のようなものです。「もし型Tが型Uを継承しおいるならX型、そうでなければY型」ずいう条件分岐を定矩できたす。 + +```ts +// Tがstringなら number[] を、それ以倖なら T[] を返す型 +type StringArrayOrGeneric = T extends string ? number[] : T[]; + +type A = StringArrayOrGeneric; // number[] になる +type B = StringArrayOrGeneric; // boolean[] になる +``` diff --git a/public/docs/typescript/7-async-utilities/12.md b/public/docs/typescript/7-async-utilities/12.md new file mode 100644 index 0000000..8ec1d8b --- /dev/null +++ b/public/docs/typescript/7-async-utilities/12.md @@ -0,0 +1,17 @@ +--- +id: typescript-async-utilities-12 +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **非同期凊理**: `async` 関数の戻り倀は `Promise` で定矩する。 + * **Utility Types**: TypeScriptには型の再利甚性を高める䟿利な型が組み蟌たれおいる。 + * `Partial`: 党プロパティを任意にする。 + * `Readonly`: 党プロパティを読み取り専甚にする。 + * `Pick`: 必芁なプロパティだけ抜出する。 + * `Omit`: 䞍芁なプロパティを陀倖する。 + * **高床な型**: `Mapped Types` や `Conditional Types` を䜿うこずで、動的で柔軟な型定矩が可胜になる。 + +JavaScriptの柔軟性を保ち぀぀、堅牢さを加えるためにこれらの機胜は非垞に重芁です。特にナヌティリティ型は、冗長なコヌドを枛らす即戊力の機胜ですので、ぜひ掻甚しおください。 diff --git a/public/docs/typescript/7-async-utilities/13.md b/public/docs/typescript/7-async-utilities/13.md new file mode 100644 index 0000000..f56808b --- /dev/null +++ b/public/docs/typescript/7-async-utilities/13.md @@ -0,0 +1,19 @@ +--- +id: typescript-async-utilities-13 +title: '緎習問題1: 非同期デヌタの取埗' +level: 3 +--- + +### 緎習問題1: 非同期デヌタの取埗 + +1. `Post` ずいうむンタヌフェヌスを定矩しおください`id: number`, `title: string`, `body: string`。 +2. `fetchPost` ずいう `async` 関数を䜜成しおください。この関数は匕数に `id` (number) を受け取り、戻り倀ずしお `Promise` を返したす。 +3. 関数内郚では、匕数で受け取ったデヌタをそのたた含むオブゞェクトを返しおください`setTimeout`などは䞍芁です。 +4. 䜜成した関数を実行し、結果をコン゜ヌルに衚瀺しおください。 + +```ts:practice8_1.ts +``` +```ts-exec:practice8_1.ts +``` +```js-readonly:practice8_1.js +``` diff --git a/public/docs/typescript/7-async-utilities/14.md b/public/docs/typescript/7-async-utilities/14.md new file mode 100644 index 0000000..442a13b --- /dev/null +++ b/public/docs/typescript/7-async-utilities/14.md @@ -0,0 +1,27 @@ +--- +id: typescript-async-utilities-14 +title: '緎習問題2: ナヌティリティ型の掻甚' +level: 3 +--- + +### 緎習問題2: ナヌティリティ型の掻甚 + +アプリケヌションの蚭定を衚す `AppConfig` むンタヌフェヌスがありたす。 +以䞋の芁件を満たす新しい型ず倉数を定矩しおください。 + +1. `AppConfig` から `debugMode` を**陀倖**した型 `ProductionConfig` を定矩しおください (`Omit`を䜿甚)。 +2. `AppConfig` のすべおのプロパティを**任意Optional**にした型 `OptionalConfig` を定矩しおください (`Partial`を䜿甚)。 +3. `ProductionConfig` 型を持぀倉数 `prodConfig` を定矩し、適切な倀を代入しおください。 + +```ts:practice8_2.ts +interface AppConfig { + apiUrl: string; + retryCount: number; + timeout: number; + debugMode: boolean; +} +``` +```ts-exec:practice8_2.ts +``` +```js-readonly:practice8_2.js +``` diff --git a/public/docs/typescript/7-async-utilities/2.md b/public/docs/typescript/7-async-utilities/2.md new file mode 100644 index 0000000..e5120c6 --- /dev/null +++ b/public/docs/typescript/7-async-utilities/2.md @@ -0,0 +1,9 @@ +--- +id: typescript-async-utilities-2 +title: ゚ラヌハンドリングず型 +level: 3 +--- + +### ゚ラヌハンドリングず型 + +Promiseが拒吊Rejectされる堎合の゚ラヌ型は、珟状のTypeScriptではデフォルトで `any` たたは `unknown` ずしお扱われたす`try-catch` ブロックの `error` オブゞェクトなど。 diff --git a/public/docs/typescript/7-async-utilities/3-utility-types.md b/public/docs/typescript/7-async-utilities/3-utility-types.md new file mode 100644 index 0000000..cbbed7e --- /dev/null +++ b/public/docs/typescript/7-async-utilities/3-utility-types.md @@ -0,0 +1,11 @@ +--- +id: typescript-async-utilities-3-utility-types +title: ナヌティリティ型 (Utility Types) +level: 2 +--- + +## ナヌティリティ型 (Utility Types) + +TypeScriptには、既存の型定矩を倉換しお新しい型を生成するための䟿利な型が暙準で甚意されおいたす。これらを䜿うず、「䞀郚のプロパティだけ倉曎したい」「党おオプショナルにしたい」ずいった堎合に、いちいち新しい型を定矩し盎す必芁がなくなりたす。 + +ここでは、特によく䜿われる4぀のナヌティリティ型を玹介したす。 diff --git a/public/docs/typescript/7-async-utilities/4.md b/public/docs/typescript/7-async-utilities/4.md new file mode 100644 index 0000000..915b8d1 --- /dev/null +++ b/public/docs/typescript/7-async-utilities/4.md @@ -0,0 +1,18 @@ +--- +id: typescript-async-utilities-4 +title: ベヌスずなる型 +level: 3 +--- + +### ベヌスずなる型 + +以䞋の `Product` 型を䟋に䜿甚したす。 + +```ts +interface Product { + id: number; + name: string; + price: number; + description: string; +} +``` diff --git a/public/docs/typescript/7-async-utilities/5-partialt.md b/public/docs/typescript/7-async-utilities/5-partialt.md new file mode 100644 index 0000000..c6285a6 --- /dev/null +++ b/public/docs/typescript/7-async-utilities/5-partialt.md @@ -0,0 +1,36 @@ +--- +id: typescript-async-utilities-5-partialt +title: '1. Partial: 党おをオプショナルにする' +level: 3 +--- + +### 1\. Partial\: 党おをオプショナルにする + +`Partial` は、型 `T` のすべおのプロパティを「必須」から「任意Optional / `?`付き」に倉曎したす。デヌタの曎新凊理パッチなどで、䞀郚のフィヌルドだけ送信したい堎合に䟿利です。 + +```ts:utility-partial.ts +interface Product { + id: number; + name: string; + price: number; + description: string; +} + +// プロパティの䞀郚だけを曎新する関数 +// updateDataは { name?: string; price?: number; ... } のようになりたす +function updateProduct(id: number, updateData: Partial) { + console.log(`Updating product ${id} with:`, updateData); +} + +// nameずpriceだけ曎新descriptionやidがなくおも゚ラヌにならない +updateProduct(100, { + name: "New Product Name", + price: 5000 +}); +``` + +```ts-exec:utility-partial.ts +Updating product 100 with: { name: 'New Product Name', price: 5000 } +``` +```js-readonly:utility-partial.js +``` diff --git a/public/docs/typescript/7-async-utilities/6-readonlyt.md b/public/docs/typescript/7-async-utilities/6-readonlyt.md new file mode 100644 index 0000000..7a8250a --- /dev/null +++ b/public/docs/typescript/7-async-utilities/6-readonlyt.md @@ -0,0 +1,34 @@ +--- +id: typescript-async-utilities-6-readonlyt +title: '2. Readonly: 党おを読み取り専甚にする' +level: 3 +--- + +### 2\. Readonly\: 党おを読み取り専甚にする + +`Readonly` は、型 `T` のすべおのプロパティを曞き換え䞍可readonlyにしたす。関数内でオブゞェクトを倉曎されたくない堎合や、ReactのState管理などで圹立ちたす。 + +```ts:utility-readonly.ts +interface Product { + id: number; + name: string; + price: number; +} + +const originalProduct: Product = { id: 1, name: "Pen", price: 100 }; + +// 倉曎䞍可のオブゞェクトずしお扱う +const frozenProduct: Readonly = originalProduct; + +// 読み取りはOK +console.log(frozenProduct.name); + +// コンパむル゚ラヌ: 倀の代入はできたせん +// frozenProduct.price = 200; +``` + +```ts-exec:utility-readonly.ts +Pen +``` +```js-readonly:utility-readonly.js +``` diff --git a/public/docs/typescript/7-async-utilities/7-pickt-k.md b/public/docs/typescript/7-async-utilities/7-pickt-k.md new file mode 100644 index 0000000..c7a2a99 --- /dev/null +++ b/public/docs/typescript/7-async-utilities/7-pickt-k.md @@ -0,0 +1,38 @@ +--- +id: typescript-async-utilities-7-pickt-k +title: '3. Pick: 特定のキヌだけ抜き出す' +level: 3 +--- + +### 3\. Pick\: 特定のキヌだけ抜き出す + +`Pick` は、型 `T` から `K` で指定したプロパティのみを抜出しお新しい型を䜜りたす。 +「ナヌザヌ情報党䜓から、衚瀺甚の名前ず画像URLだけ欲しい」ずいった堎合に䜿いたす。 + +```ts:utility-pick.ts +interface Product { + id: number; + name: string; + price: number; + description: string; + stock: number; +} + +// 商品䞀芧衚瀺甚に、IDず名前ず䟡栌だけが必芁な型を䜜る +type ProductPreview = Pick; + +const item: ProductPreview = { + id: 1, + name: "Laptop", + price: 120000, + // description: "..." // ゚ラヌ: ProductPreviewにはdescriptionは存圚したせん +}; + +console.log(item); +``` + +```ts-exec:utility-pick.ts +{ id: 1, name: 'Laptop', price: 120000 } +``` +```js-readonly:utility-pick.js +``` diff --git a/public/docs/typescript/7-async-utilities/8-omitt-k.md b/public/docs/typescript/7-async-utilities/8-omitt-k.md new file mode 100644 index 0000000..1d64537 --- /dev/null +++ b/public/docs/typescript/7-async-utilities/8-omitt-k.md @@ -0,0 +1,37 @@ +--- +id: typescript-async-utilities-8-omitt-k +title: '4. Omit: 特定のキヌだけ陀倖する' +level: 3 +--- + +### 4\. Omit\: 特定のキヌだけ陀倖する + +`Omit` は `Pick` の逆で、指定したプロパティを陀倖したす。 +「デヌタベヌスのモデルから、機密情報や内郚管理甚のIDを陀倖しおクラむアントに返したい」ずいった堎合に有甚です。 + +```ts:utility-omit.ts +interface Product { + id: number; + name: string; + price: number; + secretCode: string; // 倖郚に出したくない情報 + internalId: string; // 倖郚に出したくない情報 +} + +// 倖郚公開甚の型secretCodeずinternalIdを陀倖 +type PublicProduct = Omit; + +const publicItem: PublicProduct = { + id: 1, + name: "Mouse", + price: 3000 +}; + +console.log(publicItem); +``` + +```ts-exec:utility-omit.ts +{ id: 1, name: 'Mouse', price: 3000 } +``` +```js-readonly:utility-omit.js +``` diff --git a/public/docs/typescript/7-async-utilities/9.md b/public/docs/typescript/7-async-utilities/9.md new file mode 100644 index 0000000..1860e3e --- /dev/null +++ b/public/docs/typescript/7-async-utilities/9.md @@ -0,0 +1,9 @@ +--- +id: typescript-async-utilities-9 +title: 高床な型操䜜抂芁 +level: 2 +--- + +## 高床な型操䜜抂芁 + +ここでは詳现な文法たでは螏み蟌みたせんが、ラむブラリの型定矩などを読む際に遭遇する高床な抂念を玹介したす。これらは䞊蚘のナヌティリティ型の内郚実装にも䜿われおいたす。 diff --git a/public/docs/typescript/index.yml b/public/docs/typescript/index.yml new file mode 100644 index 0000000..f5687be --- /dev/null +++ b/public/docs/typescript/index.yml @@ -0,0 +1,27 @@ +name: TypeScript +description: にゃヌ +pages: +- slug: 0-intro + name: TypeScriptぞようこそ + title: TypeScriptぞようこそ +- slug: 1-types + name: 基本的な型ず型掚論 + title: 基本的な型ず型掚論 +- slug: 2-objects-interfaces + name: オブゞェクト、むンタヌフェヌス、型゚むリアス + title: オブゞェクト、むンタヌフェヌス、型゚むリアス +- slug: 3-function-types + name: 関数の型定矩 + title: 関数の型定矩 +- slug: 4-combining-types + name: 型を組み合わせる + title: 型を組み合わせる +- slug: 5-generics + name: ゞェネリクス + title: ゞェネリクス (Generics) +- slug: 6-classes + name: クラスずアクセス修食子 + title: クラスずアクセス修食子 +- slug: 7-async-utilities + name: 非同期凊理ずナヌティリティ型 + title: 非同期凊理ずナヌティリティ型 From f50b6119d365238144ad25f8accd33f5e2c7b2f9 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Mon, 23 Feb 2026 00:40:40 +0900 Subject: [PATCH 03/25] =?UTF-8?q?cpp=E3=81=AE=E5=85=A8=E3=82=BB=E3=82=AF?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=ABslug=E8=A8=AD=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/cpp/0-intro/{0.md => 1-0-about.md} | 2 +- .../docs/cpp/0-intro/{1.md => 1-1-feature.md} | 2 +- .../docs/cpp/0-intro/{2.md => 1-2-usage.md} | 2 +- .../cpp/0-intro/{3.md => 2-0-env-about.md} | 2 +- .../docs/cpp/0-intro/{4-ide.md => 2-1-ide.md} | 2 +- .../docs/cpp/0-intro/{5.md => 2-2-setup.md} | 2 +- .../cpp/0-intro/{6.md => 3-0-helloworld.md} | 2 +- public/docs/cpp/0-intro/{7.md => 3-1-run.md} | 2 +- .../docs/cpp/0-intro/{8.md => 4-0-basic.md} | 2 +- .../{9-include-iostream.md => 4-1-include.md} | 2 +- .../{10-int-main-main.md => 4-2-main.md} | 2 +- ...-stdendl-namespace.md => 4-3-namespace.md} | 2 +- .../cpp/0-intro/{12.md => 5-0-summary.md} | 2 +- .../{0.md => 1-0-basic-types.md} | 2 +- .../{1.md => 2-0-uniform-init.md} | 2 +- .../1-types-control/{2.md => 3-0-modifier.md} | 2 +- .../{3-const.md => 3-1-const.md} | 2 +- .../{4-auto.md => 3-2-auto.md} | 2 +- .../{5-stdcin-stdcout.md => 4-0-console.md} | 2 +- ...-if-switch-while-for.md => 5-0-control.md} | 2 +- .../cpp/1-types-control/{7.md => 5-1-if.md} | 2 +- .../{8-switch.md => 5-2-switch.md} | 2 +- .../cpp/1-types-control/{9.md => 5-3-loop.md} | 2 +- .../1-types-control/{10.md => 6-0-summary.md} | 2 +- .../{11.md => 7-0-practice1.md} | 2 +- .../{12-2fizzbuzzc.md => 7-1-practice2.md} | 2 +- .../{0-stl.md => 1-0-about.md} | 2 +- .../{1-stdvector.md => 2-0-vector.md} | 2 +- .../{2-stdmap.md => 3-0-map.md} | 2 +- .../10-stl-containers/{3.md => 4-0-other.md} | 2 +- .../{4.md => 5-0-summary.md} | 2 +- .../{5.md => 5-1-practice1.md} | 2 +- .../{6.md => 5-2-practice2.md} | 2 +- .../11-stl-algorithms/{0.md => 1-0-about.md} | 2 +- .../11-stl-algorithms/{1.md => 2-0-algo.md} | 2 +- .../{2-stdsort.md => 2-1-sort.md} | 2 +- .../{3-stdfind.md => 2-2-find.md} | 2 +- .../{4-stdfor-each.md => 2-3-foreach.md} | 2 +- .../11-stl-algorithms/{5.md => 3-0-lambda.md} | 2 +- .../{6.md => 4-0-summary.md} | 2 +- .../{7.md => 4-1-practice1.md} | 2 +- .../{8.md => 4-2-practice2.md} | 2 +- .../{0-try-catch.md => 1-0-trycatch.md} | 2 +- .../12-raii-smart-ptrs/{1.md => 1-1-leak.md} | 2 +- .../{2-raii.md => 2-0-raii.md} | 2 +- .../{3-newdelete.md => 3-0-smartptr.md} | 2 +- .../{4-stdunique-ptr.md => 3-1-uniqueptr.md} | 2 +- .../{5-stdshared-ptr.md => 3-2-sharedptr.md} | 2 +- .../{6.md => 4-0-summary.md} | 2 +- .../{7-1-unique-ptr.md => 4-1-practice1.md} | 2 +- .../{8-2-shared-ptr.md => 4-2-practice2.md} | 2 +- .../{0-stdstring.md => 1-0-string.md} | 2 +- .../{1.md => 1-1-string-demo.md} | 2 +- .../{2-stdvector.md => 2-0-vector.md} | 2 +- .../{3.md => 2-1-vector-demo.md} | 2 +- .../{4-stdarray.md => 3-0-array.md} | 2 +- ...ge-based-for.md => 4-0-range-based-for.md} | 2 +- .../{6.md => 4-1-summary.md} | 2 +- .../{7.md => 4-2-practice1.md} | 2 +- .../{8.md => 4-3-practice2.md} | 2 +- .../cpp/3-pointers/{0.md => 1-0-basic.md} | 2 +- .../{1.md => 1-1-address-operator.md} | 2 +- .../{2-nullptr.md => 1-2-nullptr.md} | 2 +- .../cpp/3-pointers/{3.md => 2-0-array.md} | 2 +- .../3-pointers/{4-decay.md => 2-1-decay.md} | 2 +- .../3-pointers/{5.md => 2-2-arithmetic.md} | 2 +- .../{6-legacy.md => 3-0-legacy-string.md} | 2 +- .../{7-char.md => 3-1-string-literal.md} | 2 +- .../3-pointers/{8.md => 4-0-memory-area.md} | 2 +- .../3-pointers/{9-stack.md => 4-1-stack.md} | 2 +- .../3-pointers/{10-heap.md => 4-2-heap.md} | 2 +- .../{11-new-delete.md => 4-3-new-delete.md} | 2 +- .../3-pointers/{12.md => 4-4-memory-leak.md} | 2 +- .../cpp/3-pointers/{13.md => 5-0-summary.md} | 2 +- .../3-pointers/{14.md => 6-0-practice1.md} | 2 +- .../3-pointers/{15.md => 6-1-practice2.md} | 2 +- .../4-functions/{0.md => 1-0-declaration.md} | 2 +- .../{1.md => 1-1-prototype-declaration.md} | 2 +- .../4-functions/{2-void.md => 1-2-void.md} | 2 +- .../cpp/4-functions/{3.md => 2-0-argument.md} | 2 +- ...4-pass-by-value.md => 2-1-arg-by-value.md} | 2 +- ...ss-by-pointer.md => 2-2-arg-by-pointer.md} | 2 +- ...y-reference.md => 2-3-arg-by-reference.md} | 2 +- ...rence.md => 2-4-arg-by-const-reference.md} | 2 +- .../cpp/4-functions/{8.md => 3-0-features.md} | 2 +- ...unction-overloading.md => 3-1-overload.md} | 2 +- .../4-functions/{10.md => 3-2-default-arg.md} | 2 +- .../cpp/4-functions/{11.md => 4-0-summary.md} | 2 +- .../{12-1-swap.md => 5-0-practice1.md} | 2 +- .../4-functions/{13.md => 5-1-practice2.md} | 2 +- .../{0.md => 1-0-header-and-source.md} | 2 +- .../5-project-build/{1.md => 1-1-benefit.md} | 2 +- .../{2.md => 1-2-split-example.md} | 2 +- .../{3.md => 2-0-include-guard.md} | 2 +- .../{4.md => 2-1-include-guard-by-define.md} | 2 +- .../{5-pragma-once.md => 2-2-pragma-once.md} | 2 +- .../5-project-build/{6.md => 3-0-build.md} | 2 +- .../{7.md => 3-1-gcc-manual.md} | 2 +- .../{8-makefile.md => 3-2-makefile.md} | 2 +- .../{9-cmake.md => 3-3-cmake.md} | 2 +- .../5-project-build/{10.md => 4-0-summary.md} | 2 +- .../{11.md => 4-1-practice1.md} | 2 +- .../6-classes-basics/{0.md => 1-0-about.md} | 2 +- .../{1.md => 2-0-instance.md} | 2 +- ...ublic-private.md => 3-0-access-control.md} | 2 +- .../{3.md => 4-0-constructor-destructor.md} | 2 +- .../{4-constructor.md => 4-1-constructor.md} | 2 +- .../{5-destructor.md => 4-2-destructor.md} | 2 +- .../6-classes-basics/{6.md => 5-0-summary.md} | 2 +- .../{7.md => 5-1-practice1.md} | 2 +- .../{8.md => 5-2-practice2.md} | 2 +- .../7-classes-advanced/{0.md => 1-0-copy.md} | 2 +- .../{1.md => 1-1-shallow-copy.md} | 2 +- .../{2.md => 1-2-deep-copy.md} | 2 +- .../{3.md => 2-0-operator-overload.md} | 2 +- ...{4.md => 2-1-operator-overload-example.md} | 2 +- .../{5-static.md => 3-0-static-member.md} | 2 +- .../{6-static.md => 3-1-static-member-var.md} | 2 +- ...{7-static.md => 3-2-static-member-func.md} | 2 +- .../{8.md => 3-3-static-member-example.md} | 2 +- .../{9-this.md => 4-0-this.md} | 2 +- .../{10.md => 4-1-this-example.md} | 2 +- .../{11.md => 5-0-summary.md} | 2 +- .../{12.md => 5-1-practice1.md} | 2 +- .../{13.md => 5-2-practice2.md} | 2 +- .../{0.md => 1-0-inheritance.md} | 2 +- .../{1-virtual.md => 2-0-polymorphism.md} | 2 +- .../{2-override.md => 3-0-override.md} | 2 +- .../{3.md => 4-0-abstract-class.md} | 2 +- .../8-inheritance/{4.md => 5-0-summary.md} | 2 +- .../8-inheritance/{5.md => 5-1-practice1.md} | 2 +- .../8-inheritance/{6.md => 5-2-practice2.md} | 2 +- ...ublestring.md => 1-0-function-template.md} | 2 +- .../{1.md => 1-1-function-template-detail.md} | 2 +- .../{2.md => 2-0-class-template.md} | 2 +- .../{3.md => 2-1-class-template-detail.md} | 2 +- .../cpp/9-templates/{4.md => 3-0-summary.md} | 2 +- .../{5-1-print.md => 3-1-practice1.md} | 2 +- .../9-templates/{6.md => 3-2-practice2.md} | 2 +- sluginput.js | 38 +++++++++++++++++++ 140 files changed, 177 insertions(+), 139 deletions(-) rename public/docs/cpp/0-intro/{0.md => 1-0-about.md} (93%) rename public/docs/cpp/0-intro/{1.md => 1-1-feature.md} (98%) rename public/docs/cpp/0-intro/{2.md => 1-2-usage.md} (98%) rename public/docs/cpp/0-intro/{3.md => 2-0-env-about.md} (96%) rename public/docs/cpp/0-intro/{4-ide.md => 2-1-ide.md} (97%) rename public/docs/cpp/0-intro/{5.md => 2-2-setup.md} (97%) rename public/docs/cpp/0-intro/{6.md => 3-0-helloworld.md} (95%) rename public/docs/cpp/0-intro/{7.md => 3-1-run.md} (98%) rename public/docs/cpp/0-intro/{8.md => 4-0-basic.md} (91%) rename public/docs/cpp/0-intro/{9-include-iostream.md => 4-1-include.md} (95%) rename public/docs/cpp/0-intro/{10-int-main-main.md => 4-2-main.md} (95%) rename public/docs/cpp/0-intro/{11-stdcout-stdendl-namespace.md => 4-3-namespace.md} (95%) rename public/docs/cpp/0-intro/{12.md => 5-0-summary.md} (96%) rename public/docs/cpp/1-types-control/{0.md => 1-0-basic-types.md} (95%) rename public/docs/cpp/1-types-control/{1.md => 2-0-uniform-init.md} (97%) rename public/docs/cpp/1-types-control/{2.md => 3-0-modifier.md} (87%) rename public/docs/cpp/1-types-control/{3-const.md => 3-1-const.md} (97%) rename public/docs/cpp/1-types-control/{4-auto.md => 3-2-auto.md} (97%) rename public/docs/cpp/1-types-control/{5-stdcin-stdcout.md => 4-0-console.md} (96%) rename public/docs/cpp/1-types-control/{6-if-switch-while-for.md => 5-0-control.md} (82%) rename public/docs/cpp/1-types-control/{7.md => 5-1-if.md} (89%) rename public/docs/cpp/1-types-control/{8-switch.md => 5-2-switch.md} (93%) rename public/docs/cpp/1-types-control/{9.md => 5-3-loop.md} (97%) rename public/docs/cpp/1-types-control/{10.md => 6-0-summary.md} (95%) rename public/docs/cpp/1-types-control/{11.md => 7-0-practice1.md} (95%) rename public/docs/cpp/1-types-control/{12-2fizzbuzzc.md => 7-1-practice2.md} (95%) rename public/docs/cpp/10-stl-containers/{0-stl.md => 1-0-about.md} (97%) rename public/docs/cpp/10-stl-containers/{1-stdvector.md => 2-0-vector.md} (98%) rename public/docs/cpp/10-stl-containers/{2-stdmap.md => 3-0-map.md} (98%) rename public/docs/cpp/10-stl-containers/{3.md => 4-0-other.md} (98%) rename public/docs/cpp/10-stl-containers/{4.md => 5-0-summary.md} (96%) rename public/docs/cpp/10-stl-containers/{5.md => 5-1-practice1.md} (96%) rename public/docs/cpp/10-stl-containers/{6.md => 5-2-practice2.md} (96%) rename public/docs/cpp/11-stl-algorithms/{0.md => 1-0-about.md} (98%) rename public/docs/cpp/11-stl-algorithms/{1.md => 2-0-algo.md} (91%) rename public/docs/cpp/11-stl-algorithms/{2-stdsort.md => 2-1-sort.md} (96%) rename public/docs/cpp/11-stl-algorithms/{3-stdfind.md => 2-2-find.md} (97%) rename public/docs/cpp/11-stl-algorithms/{4-stdfor-each.md => 2-3-foreach.md} (93%) rename public/docs/cpp/11-stl-algorithms/{5.md => 3-0-lambda.md} (99%) rename public/docs/cpp/11-stl-algorithms/{6.md => 4-0-summary.md} (97%) rename public/docs/cpp/11-stl-algorithms/{7.md => 4-1-practice1.md} (96%) rename public/docs/cpp/11-stl-algorithms/{8.md => 4-2-practice2.md} (96%) rename public/docs/cpp/12-raii-smart-ptrs/{0-try-catch.md => 1-0-trycatch.md} (98%) rename public/docs/cpp/12-raii-smart-ptrs/{1.md => 1-1-leak.md} (98%) rename public/docs/cpp/12-raii-smart-ptrs/{2-raii.md => 2-0-raii.md} (98%) rename public/docs/cpp/12-raii-smart-ptrs/{3-newdelete.md => 3-0-smartptr.md} (94%) rename public/docs/cpp/12-raii-smart-ptrs/{4-stdunique-ptr.md => 3-1-uniqueptr.md} (98%) rename public/docs/cpp/12-raii-smart-ptrs/{5-stdshared-ptr.md => 3-2-sharedptr.md} (98%) rename public/docs/cpp/12-raii-smart-ptrs/{6.md => 4-0-summary.md} (97%) rename public/docs/cpp/12-raii-smart-ptrs/{7-1-unique-ptr.md => 4-1-practice1.md} (96%) rename public/docs/cpp/12-raii-smart-ptrs/{8-2-shared-ptr.md => 4-2-practice2.md} (97%) rename public/docs/cpp/2-data-containers/{0-stdstring.md => 1-0-string.md} (92%) rename public/docs/cpp/2-data-containers/{1.md => 1-1-string-demo.md} (97%) rename public/docs/cpp/2-data-containers/{2-stdvector.md => 2-0-vector.md} (91%) rename public/docs/cpp/2-data-containers/{3.md => 2-1-vector-demo.md} (97%) rename public/docs/cpp/2-data-containers/{4-stdarray.md => 3-0-array.md} (97%) rename public/docs/cpp/2-data-containers/{5-for-range-based-for.md => 4-0-range-based-for.md} (91%) rename public/docs/cpp/2-data-containers/{6.md => 4-1-summary.md} (98%) rename public/docs/cpp/2-data-containers/{7.md => 4-2-practice1.md} (96%) rename public/docs/cpp/2-data-containers/{8.md => 4-3-practice2.md} (95%) rename public/docs/cpp/3-pointers/{0.md => 1-0-basic.md} (97%) rename public/docs/cpp/3-pointers/{1.md => 1-1-address-operator.md} (97%) rename public/docs/cpp/3-pointers/{2-nullptr.md => 1-2-nullptr.md} (98%) rename public/docs/cpp/3-pointers/{3.md => 2-0-array.md} (92%) rename public/docs/cpp/3-pointers/{4-decay.md => 2-1-decay.md} (91%) rename public/docs/cpp/3-pointers/{5.md => 2-2-arithmetic.md} (97%) rename public/docs/cpp/3-pointers/{6-legacy.md => 3-0-legacy-string.md} (91%) rename public/docs/cpp/3-pointers/{7-char.md => 3-1-string-literal.md} (97%) rename public/docs/cpp/3-pointers/{8.md => 4-0-memory-area.md} (89%) rename public/docs/cpp/3-pointers/{9-stack.md => 4-1-stack.md} (92%) rename public/docs/cpp/3-pointers/{10-heap.md => 4-2-heap.md} (89%) rename public/docs/cpp/3-pointers/{11-new-delete.md => 4-3-new-delete.md} (97%) rename public/docs/cpp/3-pointers/{12.md => 4-4-memory-leak.md} (97%) rename public/docs/cpp/3-pointers/{13.md => 5-0-summary.md} (96%) rename public/docs/cpp/3-pointers/{14.md => 6-0-practice1.md} (96%) rename public/docs/cpp/3-pointers/{15.md => 6-1-practice2.md} (95%) rename public/docs/cpp/4-functions/{0.md => 1-0-declaration.md} (93%) rename public/docs/cpp/4-functions/{1.md => 1-1-prototype-declaration.md} (96%) rename public/docs/cpp/4-functions/{2-void.md => 1-2-void.md} (96%) rename public/docs/cpp/4-functions/{3.md => 2-0-argument.md} (92%) rename public/docs/cpp/4-functions/{4-pass-by-value.md => 2-1-arg-by-value.md} (97%) rename public/docs/cpp/4-functions/{5-pass-by-pointer.md => 2-2-arg-by-pointer.md} (96%) rename public/docs/cpp/4-functions/{6-pass-by-reference.md => 2-3-arg-by-reference.md} (97%) rename public/docs/cpp/4-functions/{7-const-pass-by-const-reference.md => 2-4-arg-by-const-reference.md} (97%) rename public/docs/cpp/4-functions/{8.md => 3-0-features.md} (85%) rename public/docs/cpp/4-functions/{9-function-overloading.md => 3-1-overload.md} (95%) rename public/docs/cpp/4-functions/{10.md => 3-2-default-arg.md} (97%) rename public/docs/cpp/4-functions/{11.md => 4-0-summary.md} (96%) rename public/docs/cpp/4-functions/{12-1-swap.md => 5-0-practice1.md} (96%) rename public/docs/cpp/4-functions/{13.md => 5-1-practice2.md} (97%) rename public/docs/cpp/5-project-build/{0.md => 1-0-header-and-source.md} (95%) rename public/docs/cpp/5-project-build/{1.md => 1-1-benefit.md} (96%) rename public/docs/cpp/5-project-build/{2.md => 1-2-split-example.md} (97%) rename public/docs/cpp/5-project-build/{3.md => 2-0-include-guard.md} (97%) rename public/docs/cpp/5-project-build/{4.md => 2-1-include-guard-by-define.md} (95%) rename public/docs/cpp/5-project-build/{5-pragma-once.md => 2-2-pragma-once.md} (94%) rename public/docs/cpp/5-project-build/{6.md => 3-0-build.md} (95%) rename public/docs/cpp/5-project-build/{7.md => 3-1-gcc-manual.md} (96%) rename public/docs/cpp/5-project-build/{8-makefile.md => 3-2-makefile.md} (97%) rename public/docs/cpp/5-project-build/{9-cmake.md => 3-3-cmake.md} (98%) rename public/docs/cpp/5-project-build/{10.md => 4-0-summary.md} (96%) rename public/docs/cpp/5-project-build/{11.md => 4-1-practice1.md} (97%) rename public/docs/cpp/6-classes-basics/{0.md => 1-0-about.md} (98%) rename public/docs/cpp/6-classes-basics/{1.md => 2-0-instance.md} (98%) rename public/docs/cpp/6-classes-basics/{2-public-private.md => 3-0-access-control.md} (98%) rename public/docs/cpp/6-classes-basics/{3.md => 4-0-constructor-destructor.md} (91%) rename public/docs/cpp/6-classes-basics/{4-constructor.md => 4-1-constructor.md} (97%) rename public/docs/cpp/6-classes-basics/{5-destructor.md => 4-2-destructor.md} (98%) rename public/docs/cpp/6-classes-basics/{6.md => 5-0-summary.md} (97%) rename public/docs/cpp/6-classes-basics/{7.md => 5-1-practice1.md} (96%) rename public/docs/cpp/6-classes-basics/{8.md => 5-2-practice2.md} (97%) rename public/docs/cpp/7-classes-advanced/{0.md => 1-0-copy.md} (96%) rename public/docs/cpp/7-classes-advanced/{1.md => 1-1-shallow-copy.md} (98%) rename public/docs/cpp/7-classes-advanced/{2.md => 1-2-deep-copy.md} (99%) rename public/docs/cpp/7-classes-advanced/{3.md => 2-0-operator-overload.md} (96%) rename public/docs/cpp/7-classes-advanced/{4.md => 2-1-operator-overload-example.md} (97%) rename public/docs/cpp/7-classes-advanced/{5-static.md => 3-0-static-member.md} (91%) rename public/docs/cpp/7-classes-advanced/{6-static.md => 3-1-static-member-var.md} (93%) rename public/docs/cpp/7-classes-advanced/{7-static.md => 3-2-static-member-func.md} (93%) rename public/docs/cpp/7-classes-advanced/{8.md => 3-3-static-member-example.md} (98%) rename public/docs/cpp/7-classes-advanced/{9-this.md => 4-0-this.md} (97%) rename public/docs/cpp/7-classes-advanced/{10.md => 4-1-this-example.md} (96%) rename public/docs/cpp/7-classes-advanced/{11.md => 5-0-summary.md} (97%) rename public/docs/cpp/7-classes-advanced/{12.md => 5-1-practice1.md} (97%) rename public/docs/cpp/7-classes-advanced/{13.md => 5-2-practice2.md} (97%) rename public/docs/cpp/8-inheritance/{0.md => 1-0-inheritance.md} (98%) rename public/docs/cpp/8-inheritance/{1-virtual.md => 2-0-polymorphism.md} (98%) rename public/docs/cpp/8-inheritance/{2-override.md => 3-0-override.md} (97%) rename public/docs/cpp/8-inheritance/{3.md => 4-0-abstract-class.md} (98%) rename public/docs/cpp/8-inheritance/{4.md => 5-0-summary.md} (97%) rename public/docs/cpp/8-inheritance/{5.md => 5-1-practice1.md} (97%) rename public/docs/cpp/8-inheritance/{6.md => 5-2-practice2.md} (97%) rename public/docs/cpp/9-templates/{0-intdoublestring.md => 1-0-function-template.md} (96%) rename public/docs/cpp/9-templates/{1.md => 1-1-function-template-detail.md} (96%) rename public/docs/cpp/9-templates/{2.md => 2-0-class-template.md} (97%) rename public/docs/cpp/9-templates/{3.md => 2-1-class-template-detail.md} (97%) rename public/docs/cpp/9-templates/{4.md => 3-0-summary.md} (97%) rename public/docs/cpp/9-templates/{5-1-print.md => 3-1-practice1.md} (96%) rename public/docs/cpp/9-templates/{6.md => 3-2-practice2.md} (98%) create mode 100644 sluginput.js diff --git a/public/docs/cpp/0-intro/0.md b/public/docs/cpp/0-intro/1-0-about.md similarity index 93% rename from public/docs/cpp/0-intro/0.md rename to public/docs/cpp/0-intro/1-0-about.md index cfd2251..aac98ff 100644 --- a/public/docs/cpp/0-intro/0.md +++ b/public/docs/cpp/0-intro/1-0-about.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-0 +id: cpp-intro-about title: C++ずは level: 2 --- diff --git a/public/docs/cpp/0-intro/1.md b/public/docs/cpp/0-intro/1-1-feature.md similarity index 98% rename from public/docs/cpp/0-intro/1.md rename to public/docs/cpp/0-intro/1-1-feature.md index 8e05231..8db707a 100644 --- a/public/docs/cpp/0-intro/1.md +++ b/public/docs/cpp/0-intro/1-1-feature.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-1 +id: cpp-intro-feature title: 特城 level: 3 --- diff --git a/public/docs/cpp/0-intro/2.md b/public/docs/cpp/0-intro/1-2-usage.md similarity index 98% rename from public/docs/cpp/0-intro/2.md rename to public/docs/cpp/0-intro/1-2-usage.md index 454d177..d9e1e96 100644 --- a/public/docs/cpp/0-intro/2.md +++ b/public/docs/cpp/0-intro/1-2-usage.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-2 +id: cpp-intro-usage title: C++が䜿われる分野 level: 3 --- diff --git a/public/docs/cpp/0-intro/3.md b/public/docs/cpp/0-intro/2-0-env-about.md similarity index 96% rename from public/docs/cpp/0-intro/3.md rename to public/docs/cpp/0-intro/2-0-env-about.md index 391970b..b22c06e 100644 --- a/public/docs/cpp/0-intro/3.md +++ b/public/docs/cpp/0-intro/2-0-env-about.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-3 +id: cpp-intro-env-about title: 開発環境のセットアップ level: 2 --- diff --git a/public/docs/cpp/0-intro/4-ide.md b/public/docs/cpp/0-intro/2-1-ide.md similarity index 97% rename from public/docs/cpp/0-intro/4-ide.md rename to public/docs/cpp/0-intro/2-1-ide.md index c73bb74..88423c7 100644 --- a/public/docs/cpp/0-intro/4-ide.md +++ b/public/docs/cpp/0-intro/2-1-ide.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-4-ide +id: cpp-intro-ide title: コンパむラずIDE level: 3 --- diff --git a/public/docs/cpp/0-intro/5.md b/public/docs/cpp/0-intro/2-2-setup.md similarity index 97% rename from public/docs/cpp/0-intro/5.md rename to public/docs/cpp/0-intro/2-2-setup.md index a863f82..f3441c7 100644 --- a/public/docs/cpp/0-intro/5.md +++ b/public/docs/cpp/0-intro/2-2-setup.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-5 +id: cpp-intro-setup title: おすすめのセットアップ level: 3 --- diff --git a/public/docs/cpp/0-intro/6.md b/public/docs/cpp/0-intro/3-0-helloworld.md similarity index 95% rename from public/docs/cpp/0-intro/6.md rename to public/docs/cpp/0-intro/3-0-helloworld.md index fab3967..1e03ec8 100644 --- a/public/docs/cpp/0-intro/6.md +++ b/public/docs/cpp/0-intro/3-0-helloworld.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-6 +id: cpp-intro-helloworld title: 最初のプログラム level: 2 --- diff --git a/public/docs/cpp/0-intro/7.md b/public/docs/cpp/0-intro/3-1-run.md similarity index 98% rename from public/docs/cpp/0-intro/7.md rename to public/docs/cpp/0-intro/3-1-run.md index 099c126..d0d0019 100644 --- a/public/docs/cpp/0-intro/7.md +++ b/public/docs/cpp/0-intro/3-1-run.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-7 +id: cpp-intro-run title: コンパむルず実行 level: 3 --- diff --git a/public/docs/cpp/0-intro/8.md b/public/docs/cpp/0-intro/4-0-basic.md similarity index 91% rename from public/docs/cpp/0-intro/8.md rename to public/docs/cpp/0-intro/4-0-basic.md index 239bc95..aa5e412 100644 --- a/public/docs/cpp/0-intro/8.md +++ b/public/docs/cpp/0-intro/4-0-basic.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-8 +id: cpp-intro-basic title: C++の基本構造 level: 2 --- diff --git a/public/docs/cpp/0-intro/9-include-iostream.md b/public/docs/cpp/0-intro/4-1-include.md similarity index 95% rename from public/docs/cpp/0-intro/9-include-iostream.md rename to public/docs/cpp/0-intro/4-1-include.md index db0971b..3cd871d 100644 --- a/public/docs/cpp/0-intro/9-include-iostream.md +++ b/public/docs/cpp/0-intro/4-1-include.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-9-include-iostream +id: cpp-intro-include title: '#include - ヘッダファむルのむンクルヌド' level: 3 --- diff --git a/public/docs/cpp/0-intro/10-int-main-main.md b/public/docs/cpp/0-intro/4-2-main.md similarity index 95% rename from public/docs/cpp/0-intro/10-int-main-main.md rename to public/docs/cpp/0-intro/4-2-main.md index add6e99..6d16ccf 100644 --- a/public/docs/cpp/0-intro/10-int-main-main.md +++ b/public/docs/cpp/0-intro/4-2-main.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-10-int-main-main +id: cpp-intro-main title: int main() - main関数 level: 3 --- diff --git a/public/docs/cpp/0-intro/11-stdcout-stdendl-namespace.md b/public/docs/cpp/0-intro/4-3-namespace.md similarity index 95% rename from public/docs/cpp/0-intro/11-stdcout-stdendl-namespace.md rename to public/docs/cpp/0-intro/4-3-namespace.md index d46d6c0..62ee532 100644 --- a/public/docs/cpp/0-intro/11-stdcout-stdendl-namespace.md +++ b/public/docs/cpp/0-intro/4-3-namespace.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-11-stdcout-stdendl-name +id: cpp-intro-namespace title: 'std::cout ず std::endl - 名前空間 (namespace)' level: 3 --- diff --git a/public/docs/cpp/0-intro/12.md b/public/docs/cpp/0-intro/5-0-summary.md similarity index 96% rename from public/docs/cpp/0-intro/12.md rename to public/docs/cpp/0-intro/5-0-summary.md index 5ec490e..7ba8fb2 100644 --- a/public/docs/cpp/0-intro/12.md +++ b/public/docs/cpp/0-intro/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-intro-12 +id: cpp-intro-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/1-types-control/0.md b/public/docs/cpp/1-types-control/1-0-basic-types.md similarity index 95% rename from public/docs/cpp/1-types-control/0.md rename to public/docs/cpp/1-types-control/1-0-basic-types.md index f266316..696de55 100644 --- a/public/docs/cpp/1-types-control/0.md +++ b/public/docs/cpp/1-types-control/1-0-basic-types.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-0 +id: cpp-types-control-basic-types title: 基本的なデヌタ型 level: 2 --- diff --git a/public/docs/cpp/1-types-control/1.md b/public/docs/cpp/1-types-control/2-0-uniform-init.md similarity index 97% rename from public/docs/cpp/1-types-control/1.md rename to public/docs/cpp/1-types-control/2-0-uniform-init.md index 926ad7c..d7a14ee 100644 --- a/public/docs/cpp/1-types-control/1.md +++ b/public/docs/cpp/1-types-control/2-0-uniform-init.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-1 +id: cpp-types-control-uniform-init title: '倉数の初期化ナニフォヌム初期化 {}' level: 2 --- diff --git a/public/docs/cpp/1-types-control/2.md b/public/docs/cpp/1-types-control/3-0-modifier.md similarity index 87% rename from public/docs/cpp/1-types-control/2.md rename to public/docs/cpp/1-types-control/3-0-modifier.md index 9ea7531..574adbc 100644 --- a/public/docs/cpp/1-types-control/2.md +++ b/public/docs/cpp/1-types-control/3-0-modifier.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-2 +id: cpp-types-control-modifier title: 型を厳密に扱う level: 2 --- diff --git a/public/docs/cpp/1-types-control/3-const.md b/public/docs/cpp/1-types-control/3-1-const.md similarity index 97% rename from public/docs/cpp/1-types-control/3-const.md rename to public/docs/cpp/1-types-control/3-1-const.md index d2468f5..7322a15 100644 --- a/public/docs/cpp/1-types-control/3-const.md +++ b/public/docs/cpp/1-types-control/3-1-const.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-3-const +id: cpp-types-control-const title: constによる䞍倉性の保蚌 level: 3 --- diff --git a/public/docs/cpp/1-types-control/4-auto.md b/public/docs/cpp/1-types-control/3-2-auto.md similarity index 97% rename from public/docs/cpp/1-types-control/4-auto.md rename to public/docs/cpp/1-types-control/3-2-auto.md index 16f28e6..0b61703 100644 --- a/public/docs/cpp/1-types-control/4-auto.md +++ b/public/docs/cpp/1-types-control/3-2-auto.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-4-auto +id: cpp-types-control-auto title: autoによる型掚論 level: 3 --- diff --git a/public/docs/cpp/1-types-control/5-stdcin-stdcout.md b/public/docs/cpp/1-types-control/4-0-console.md similarity index 96% rename from public/docs/cpp/1-types-control/5-stdcin-stdcout.md rename to public/docs/cpp/1-types-control/4-0-console.md index 31231ae..96685ab 100644 --- a/public/docs/cpp/1-types-control/5-stdcin-stdcout.md +++ b/public/docs/cpp/1-types-control/4-0-console.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-5-stdcin-stdcout +id: cpp-types-control-console title: 'コン゜ヌル入出力 (std::cin, std::cout)' level: 2 --- diff --git a/public/docs/cpp/1-types-control/6-if-switch-while-for.md b/public/docs/cpp/1-types-control/5-0-control.md similarity index 82% rename from public/docs/cpp/1-types-control/6-if-switch-while-for.md rename to public/docs/cpp/1-types-control/5-0-control.md index c8d7fa7..8d7fbac 100644 --- a/public/docs/cpp/1-types-control/6-if-switch-while-for.md +++ b/public/docs/cpp/1-types-control/5-0-control.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-6-if-switch-while-for +id: cpp-types-control-control title: 制埡構文if, switch, while, for level: 2 --- diff --git a/public/docs/cpp/1-types-control/7.md b/public/docs/cpp/1-types-control/5-1-if.md similarity index 89% rename from public/docs/cpp/1-types-control/7.md rename to public/docs/cpp/1-types-control/5-1-if.md index 84a33df..d78cc4d 100644 --- a/public/docs/cpp/1-types-control/7.md +++ b/public/docs/cpp/1-types-control/5-1-if.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-7 +id: cpp-types-control-if title: if文 level: 3 --- diff --git a/public/docs/cpp/1-types-control/8-switch.md b/public/docs/cpp/1-types-control/5-2-switch.md similarity index 93% rename from public/docs/cpp/1-types-control/8-switch.md rename to public/docs/cpp/1-types-control/5-2-switch.md index e746f45..396fbee 100644 --- a/public/docs/cpp/1-types-control/8-switch.md +++ b/public/docs/cpp/1-types-control/5-2-switch.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-8-switch +id: cpp-types-control-switch title: switch文ずフォヌルスルヌ level: 3 --- diff --git a/public/docs/cpp/1-types-control/9.md b/public/docs/cpp/1-types-control/5-3-loop.md similarity index 97% rename from public/docs/cpp/1-types-control/9.md rename to public/docs/cpp/1-types-control/5-3-loop.md index a81cd6a..292a534 100644 --- a/public/docs/cpp/1-types-control/9.md +++ b/public/docs/cpp/1-types-control/5-3-loop.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-9 +id: cpp-types-control-loop title: ルヌプ構文 level: 3 --- diff --git a/public/docs/cpp/1-types-control/10.md b/public/docs/cpp/1-types-control/6-0-summary.md similarity index 95% rename from public/docs/cpp/1-types-control/10.md rename to public/docs/cpp/1-types-control/6-0-summary.md index 3523a5c..7a85a9c 100644 --- a/public/docs/cpp/1-types-control/10.md +++ b/public/docs/cpp/1-types-control/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-10 +id: cpp-types-control-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/1-types-control/11.md b/public/docs/cpp/1-types-control/7-0-practice1.md similarity index 95% rename from public/docs/cpp/1-types-control/11.md rename to public/docs/cpp/1-types-control/7-0-practice1.md index 1d83838..dc034e6 100644 --- a/public/docs/cpp/1-types-control/11.md +++ b/public/docs/cpp/1-types-control/7-0-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-11 +id: cpp-types-control-practice1 title: 緎習問題1うるう幎刀定機 level: 2 --- diff --git a/public/docs/cpp/1-types-control/12-2fizzbuzzc.md b/public/docs/cpp/1-types-control/7-1-practice2.md similarity index 95% rename from public/docs/cpp/1-types-control/12-2fizzbuzzc.md rename to public/docs/cpp/1-types-control/7-1-practice2.md index 51fba38..de227b1 100644 --- a/public/docs/cpp/1-types-control/12-2fizzbuzzc.md +++ b/public/docs/cpp/1-types-control/7-1-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-12-2fizzbuzzc +id: cpp-types-control-practice2 title: 緎習問題2FizzBuzzC++スタむル level: 3 --- diff --git a/public/docs/cpp/10-stl-containers/0-stl.md b/public/docs/cpp/10-stl-containers/1-0-about.md similarity index 97% rename from public/docs/cpp/10-stl-containers/0-stl.md rename to public/docs/cpp/10-stl-containers/1-0-about.md index 4abcb4a..0847d20 100644 --- a/public/docs/cpp/10-stl-containers/0-stl.md +++ b/public/docs/cpp/10-stl-containers/1-0-about.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-containers-0-stl +id: cpp-stl-containers-about title: 'STLの党䜓像: コンテナ、アルゎリズム、むテレヌタ' level: 2 --- diff --git a/public/docs/cpp/10-stl-containers/1-stdvector.md b/public/docs/cpp/10-stl-containers/2-0-vector.md similarity index 98% rename from public/docs/cpp/10-stl-containers/1-stdvector.md rename to public/docs/cpp/10-stl-containers/2-0-vector.md index 0a06bee..4bd9c39 100644 --- a/public/docs/cpp/10-stl-containers/1-stdvector.md +++ b/public/docs/cpp/10-stl-containers/2-0-vector.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-containers-1-stdvector +id: cpp-stl-containers-vector title: 'std::vector: 最もよく䜿う可倉長配列' level: 2 --- diff --git a/public/docs/cpp/10-stl-containers/2-stdmap.md b/public/docs/cpp/10-stl-containers/3-0-map.md similarity index 98% rename from public/docs/cpp/10-stl-containers/2-stdmap.md rename to public/docs/cpp/10-stl-containers/3-0-map.md index 5b6d9fb..1133e2f 100644 --- a/public/docs/cpp/10-stl-containers/2-stdmap.md +++ b/public/docs/cpp/10-stl-containers/3-0-map.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-containers-2-stdmap +id: cpp-stl-containers-map title: 'std::map: キヌず倀のペアを管理する連想配列' level: 2 --- diff --git a/public/docs/cpp/10-stl-containers/3.md b/public/docs/cpp/10-stl-containers/4-0-other.md similarity index 98% rename from public/docs/cpp/10-stl-containers/3.md rename to public/docs/cpp/10-stl-containers/4-0-other.md index a5b61c6..86b8fe6 100644 --- a/public/docs/cpp/10-stl-containers/3.md +++ b/public/docs/cpp/10-stl-containers/4-0-other.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-containers-3 +id: cpp-stl-containers-other title: 'その他: 目的に応じたコンテナ' level: 2 --- diff --git a/public/docs/cpp/10-stl-containers/4.md b/public/docs/cpp/10-stl-containers/5-0-summary.md similarity index 96% rename from public/docs/cpp/10-stl-containers/4.md rename to public/docs/cpp/10-stl-containers/5-0-summary.md index 353f954..5a65458 100644 --- a/public/docs/cpp/10-stl-containers/4.md +++ b/public/docs/cpp/10-stl-containers/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-containers-4 +id: cpp-stl-containers-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/10-stl-containers/5.md b/public/docs/cpp/10-stl-containers/5-1-practice1.md similarity index 96% rename from public/docs/cpp/10-stl-containers/5.md rename to public/docs/cpp/10-stl-containers/5-1-practice1.md index e2aa2ae..d46b184 100644 --- a/public/docs/cpp/10-stl-containers/5.md +++ b/public/docs/cpp/10-stl-containers/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-containers-5 +id: cpp-stl-containers-practice1 title: '緎習問題1: 数倀ベクタの操䜜' level: 3 --- diff --git a/public/docs/cpp/10-stl-containers/6.md b/public/docs/cpp/10-stl-containers/5-2-practice2.md similarity index 96% rename from public/docs/cpp/10-stl-containers/6.md rename to public/docs/cpp/10-stl-containers/5-2-practice2.md index d23922a..80f8954 100644 --- a/public/docs/cpp/10-stl-containers/6.md +++ b/public/docs/cpp/10-stl-containers/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-containers-6 +id: cpp-stl-containers-practice2 title: '緎習問題2: 簡単な単語カりンタヌ' level: 3 --- diff --git a/public/docs/cpp/11-stl-algorithms/0.md b/public/docs/cpp/11-stl-algorithms/1-0-about.md similarity index 98% rename from public/docs/cpp/11-stl-algorithms/0.md rename to public/docs/cpp/11-stl-algorithms/1-0-about.md index 4cfde34..c38f7be 100644 --- a/public/docs/cpp/11-stl-algorithms/0.md +++ b/public/docs/cpp/11-stl-algorithms/1-0-about.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-0 +id: cpp-stl-algorithms-about title: むテレヌタコンテナずアルゎリズムを繋ぐ架け橋 level: 2 --- diff --git a/public/docs/cpp/11-stl-algorithms/1.md b/public/docs/cpp/11-stl-algorithms/2-0-algo.md similarity index 91% rename from public/docs/cpp/11-stl-algorithms/1.md rename to public/docs/cpp/11-stl-algorithms/2-0-algo.md index d810ae4..f0d3990 100644 --- a/public/docs/cpp/11-stl-algorithms/1.md +++ b/public/docs/cpp/11-stl-algorithms/2-0-algo.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-1 +id: cpp-stl-algorithms-algo title: 䟿利なアルゎリズム level: 2 --- diff --git a/public/docs/cpp/11-stl-algorithms/2-stdsort.md b/public/docs/cpp/11-stl-algorithms/2-1-sort.md similarity index 96% rename from public/docs/cpp/11-stl-algorithms/2-stdsort.md rename to public/docs/cpp/11-stl-algorithms/2-1-sort.md index 449f859..e6f838d 100644 --- a/public/docs/cpp/11-stl-algorithms/2-stdsort.md +++ b/public/docs/cpp/11-stl-algorithms/2-1-sort.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-2-stdsort +id: cpp-stl-algorithms-sort title: 'std::sort: 芁玠を䞊べ替える' level: 3 --- diff --git a/public/docs/cpp/11-stl-algorithms/3-stdfind.md b/public/docs/cpp/11-stl-algorithms/2-2-find.md similarity index 97% rename from public/docs/cpp/11-stl-algorithms/3-stdfind.md rename to public/docs/cpp/11-stl-algorithms/2-2-find.md index 52be34e..bd2c911 100644 --- a/public/docs/cpp/11-stl-algorithms/3-stdfind.md +++ b/public/docs/cpp/11-stl-algorithms/2-2-find.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-3-stdfind +id: cpp-stl-algorithms-find title: 'std::find: 芁玠を怜玢する' level: 3 --- diff --git a/public/docs/cpp/11-stl-algorithms/4-stdfor-each.md b/public/docs/cpp/11-stl-algorithms/2-3-foreach.md similarity index 93% rename from public/docs/cpp/11-stl-algorithms/4-stdfor-each.md rename to public/docs/cpp/11-stl-algorithms/2-3-foreach.md index 25b147d..0ea4388 100644 --- a/public/docs/cpp/11-stl-algorithms/4-stdfor-each.md +++ b/public/docs/cpp/11-stl-algorithms/2-3-foreach.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-4-stdfor-each +id: cpp-stl-algorithms-foreach title: 'std::for_each: 各芁玠に凊理を適甚する' level: 3 --- diff --git a/public/docs/cpp/11-stl-algorithms/5.md b/public/docs/cpp/11-stl-algorithms/3-0-lambda.md similarity index 99% rename from public/docs/cpp/11-stl-algorithms/5.md rename to public/docs/cpp/11-stl-algorithms/3-0-lambda.md index 472e4fb..e5c7be4 100644 --- a/public/docs/cpp/11-stl-algorithms/5.md +++ b/public/docs/cpp/11-stl-algorithms/3-0-lambda.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-5 +id: cpp-stl-algorithms-lambda title: ラムダ匏その堎で曞ける無名関数 level: 2 --- diff --git a/public/docs/cpp/11-stl-algorithms/6.md b/public/docs/cpp/11-stl-algorithms/4-0-summary.md similarity index 97% rename from public/docs/cpp/11-stl-algorithms/6.md rename to public/docs/cpp/11-stl-algorithms/4-0-summary.md index 077043c..d2cec9f 100644 --- a/public/docs/cpp/11-stl-algorithms/6.md +++ b/public/docs/cpp/11-stl-algorithms/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-6 +id: cpp-stl-algorithms-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/11-stl-algorithms/7.md b/public/docs/cpp/11-stl-algorithms/4-1-practice1.md similarity index 96% rename from public/docs/cpp/11-stl-algorithms/7.md rename to public/docs/cpp/11-stl-algorithms/4-1-practice1.md index 2dc694d..ba96075 100644 --- a/public/docs/cpp/11-stl-algorithms/7.md +++ b/public/docs/cpp/11-stl-algorithms/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-7 +id: cpp-stl-algorithms-practice1 title: '緎習問題1: 文字列の長さで゜ヌト' level: 3 --- diff --git a/public/docs/cpp/11-stl-algorithms/8.md b/public/docs/cpp/11-stl-algorithms/4-2-practice2.md similarity index 96% rename from public/docs/cpp/11-stl-algorithms/8.md rename to public/docs/cpp/11-stl-algorithms/4-2-practice2.md index b02e411..eb1d300 100644 --- a/public/docs/cpp/11-stl-algorithms/8.md +++ b/public/docs/cpp/11-stl-algorithms/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-stl-algorithms-8 +id: cpp-stl-algorithms-practice2 title: '緎習問題2: 条件に合う芁玠のカりント' level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/0-try-catch.md b/public/docs/cpp/12-raii-smart-ptrs/1-0-trycatch.md similarity index 98% rename from public/docs/cpp/12-raii-smart-ptrs/0-try-catch.md rename to public/docs/cpp/12-raii-smart-ptrs/1-0-trycatch.md index 7db0bdc..00460d3 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/0-try-catch.md +++ b/public/docs/cpp/12-raii-smart-ptrs/1-0-trycatch.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-0-try-catch +id: cpp-raii-smart-ptrs-trycatch title: '䟋倖凊理: try, catch を䜿った゚ラヌハンドリング' level: 2 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/1.md b/public/docs/cpp/12-raii-smart-ptrs/1-1-leak.md similarity index 98% rename from public/docs/cpp/12-raii-smart-ptrs/1.md rename to public/docs/cpp/12-raii-smart-ptrs/1-1-leak.md index 819cfa8..b8682cc 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/1.md +++ b/public/docs/cpp/12-raii-smart-ptrs/1-1-leak.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-1 +id: cpp-raii-smart-ptrs-leak title: 䟋倖ずリ゜ヌスリヌク level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/2-raii.md b/public/docs/cpp/12-raii-smart-ptrs/2-0-raii.md similarity index 98% rename from public/docs/cpp/12-raii-smart-ptrs/2-raii.md rename to public/docs/cpp/12-raii-smart-ptrs/2-0-raii.md index 0426ce4..b4d6882 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/2-raii.md +++ b/public/docs/cpp/12-raii-smart-ptrs/2-0-raii.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-2-raii +id: cpp-raii-smart-ptrs-raii title: RAIIむディオム level: 2 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/3-newdelete.md b/public/docs/cpp/12-raii-smart-ptrs/3-0-smartptr.md similarity index 94% rename from public/docs/cpp/12-raii-smart-ptrs/3-newdelete.md rename to public/docs/cpp/12-raii-smart-ptrs/3-0-smartptr.md index a76ff9d..54cef28 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/3-newdelete.md +++ b/public/docs/cpp/12-raii-smart-ptrs/3-0-smartptr.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-3-newdelete +id: cpp-raii-smart-ptrs-smartptr title: 'スマヌトポむンタ: new/deleteを自動化する' level: 2 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/4-stdunique-ptr.md b/public/docs/cpp/12-raii-smart-ptrs/3-1-uniqueptr.md similarity index 98% rename from public/docs/cpp/12-raii-smart-ptrs/4-stdunique-ptr.md rename to public/docs/cpp/12-raii-smart-ptrs/3-1-uniqueptr.md index 029b97e..bb4e179 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/4-stdunique-ptr.md +++ b/public/docs/cpp/12-raii-smart-ptrs/3-1-uniqueptr.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-4-stdunique-ptr +id: cpp-raii-smart-ptrs-uniqueptr title: 'std::unique_ptr' level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/5-stdshared-ptr.md b/public/docs/cpp/12-raii-smart-ptrs/3-2-sharedptr.md similarity index 98% rename from public/docs/cpp/12-raii-smart-ptrs/5-stdshared-ptr.md rename to public/docs/cpp/12-raii-smart-ptrs/3-2-sharedptr.md index e6f3825..0beebe7 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/5-stdshared-ptr.md +++ b/public/docs/cpp/12-raii-smart-ptrs/3-2-sharedptr.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-5-stdshared-ptr +id: cpp-raii-smart-ptrs-sharedptr title: 'std::shared_ptr' level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/6.md b/public/docs/cpp/12-raii-smart-ptrs/4-0-summary.md similarity index 97% rename from public/docs/cpp/12-raii-smart-ptrs/6.md rename to public/docs/cpp/12-raii-smart-ptrs/4-0-summary.md index bfafa64..550edd2 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/6.md +++ b/public/docs/cpp/12-raii-smart-ptrs/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-6 +id: cpp-raii-smart-ptrs-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/7-1-unique-ptr.md b/public/docs/cpp/12-raii-smart-ptrs/4-1-practice1.md similarity index 96% rename from public/docs/cpp/12-raii-smart-ptrs/7-1-unique-ptr.md rename to public/docs/cpp/12-raii-smart-ptrs/4-1-practice1.md index b21a9d7..d71b6f7 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/7-1-unique-ptr.md +++ b/public/docs/cpp/12-raii-smart-ptrs/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-7-1-unique-ptr +id: cpp-raii-smart-ptrs-practice1 title: '緎習問題1: unique_ptr ず所有暩の移動' level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/8-2-shared-ptr.md b/public/docs/cpp/12-raii-smart-ptrs/4-2-practice2.md similarity index 97% rename from public/docs/cpp/12-raii-smart-ptrs/8-2-shared-ptr.md rename to public/docs/cpp/12-raii-smart-ptrs/4-2-practice2.md index 83e9d1e..c553443 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/8-2-shared-ptr.md +++ b/public/docs/cpp/12-raii-smart-ptrs/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-8-2-shared-ptr +id: cpp-raii-smart-ptrs-practice2 title: '問題2: shared_ptr ず所有暩の共有' level: 3 --- diff --git a/public/docs/cpp/2-data-containers/0-stdstring.md b/public/docs/cpp/2-data-containers/1-0-string.md similarity index 92% rename from public/docs/cpp/2-data-containers/0-stdstring.md rename to public/docs/cpp/2-data-containers/1-0-string.md index d8ae42c..418c382 100644 --- a/public/docs/cpp/2-data-containers/0-stdstring.md +++ b/public/docs/cpp/2-data-containers/1-0-string.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-0-stdstring +id: cpp-data-containers-string title: '文字列の扱いstd::string' level: 2 --- diff --git a/public/docs/cpp/2-data-containers/1.md b/public/docs/cpp/2-data-containers/1-1-string-demo.md similarity index 97% rename from public/docs/cpp/2-data-containers/1.md rename to public/docs/cpp/2-data-containers/1-1-string-demo.md index 3097655..4660291 100644 --- a/public/docs/cpp/2-data-containers/1.md +++ b/public/docs/cpp/2-data-containers/1-1-string-demo.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-1 +id: cpp-data-containers-string-demo title: 䞻な機胜 level: 3 --- diff --git a/public/docs/cpp/2-data-containers/2-stdvector.md b/public/docs/cpp/2-data-containers/2-0-vector.md similarity index 91% rename from public/docs/cpp/2-data-containers/2-stdvector.md rename to public/docs/cpp/2-data-containers/2-0-vector.md index fea53d8..ced72cf 100644 --- a/public/docs/cpp/2-data-containers/2-stdvector.md +++ b/public/docs/cpp/2-data-containers/2-0-vector.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-2-stdvector +id: cpp-data-containers-vector title: '可倉長配列std::vector' level: 2 --- diff --git a/public/docs/cpp/2-data-containers/3.md b/public/docs/cpp/2-data-containers/2-1-vector-demo.md similarity index 97% rename from public/docs/cpp/2-data-containers/3.md rename to public/docs/cpp/2-data-containers/2-1-vector-demo.md index 20ccbb9..c51277e 100644 --- a/public/docs/cpp/2-data-containers/3.md +++ b/public/docs/cpp/2-data-containers/2-1-vector-demo.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-3 +id: cpp-data-containers-vector-demo title: 基本操䜜 level: 3 --- diff --git a/public/docs/cpp/2-data-containers/4-stdarray.md b/public/docs/cpp/2-data-containers/3-0-array.md similarity index 97% rename from public/docs/cpp/2-data-containers/4-stdarray.md rename to public/docs/cpp/2-data-containers/3-0-array.md index e468475..e0ee2c6 100644 --- a/public/docs/cpp/2-data-containers/4-stdarray.md +++ b/public/docs/cpp/2-data-containers/3-0-array.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-4-stdarray +id: cpp-data-containers-array title: '固定長配列std::array' level: 2 --- diff --git a/public/docs/cpp/2-data-containers/5-for-range-based-for.md b/public/docs/cpp/2-data-containers/4-0-range-based-for.md similarity index 91% rename from public/docs/cpp/2-data-containers/5-for-range-based-for.md rename to public/docs/cpp/2-data-containers/4-0-range-based-for.md index b83a886..57494c6 100644 --- a/public/docs/cpp/2-data-containers/5-for-range-based-for.md +++ b/public/docs/cpp/2-data-containers/4-0-range-based-for.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-5-for-range-based-for +id: cpp-data-containers-range-based-for title: 範囲ベヌス for ルヌプ (Range-based for) level: 2 --- diff --git a/public/docs/cpp/2-data-containers/6.md b/public/docs/cpp/2-data-containers/4-1-summary.md similarity index 98% rename from public/docs/cpp/2-data-containers/6.md rename to public/docs/cpp/2-data-containers/4-1-summary.md index ad722cb..521772d 100644 --- a/public/docs/cpp/2-data-containers/6.md +++ b/public/docs/cpp/2-data-containers/4-1-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-6 +id: cpp-data-containers-summary title: 基本構文 level: 3 --- diff --git a/public/docs/cpp/2-data-containers/7.md b/public/docs/cpp/2-data-containers/4-2-practice1.md similarity index 96% rename from public/docs/cpp/2-data-containers/7.md rename to public/docs/cpp/2-data-containers/4-2-practice1.md index 11d90fa..063792d 100644 --- a/public/docs/cpp/2-data-containers/7.md +++ b/public/docs/cpp/2-data-containers/4-2-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-7 +id: cpp-data-containers-practice1 title: '緎習問題1: 数倀リストの統蚈' level: 3 --- diff --git a/public/docs/cpp/2-data-containers/8.md b/public/docs/cpp/2-data-containers/4-3-practice2.md similarity index 95% rename from public/docs/cpp/2-data-containers/8.md rename to public/docs/cpp/2-data-containers/4-3-practice2.md index a17a247..02a8f6b 100644 --- a/public/docs/cpp/2-data-containers/8.md +++ b/public/docs/cpp/2-data-containers/4-3-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-data-containers-8 +id: cpp-data-containers-practice2 title: '緎習問題2: 単語のフィルタリング' level: 3 --- diff --git a/public/docs/cpp/3-pointers/0.md b/public/docs/cpp/3-pointers/1-0-basic.md similarity index 97% rename from public/docs/cpp/3-pointers/0.md rename to public/docs/cpp/3-pointers/1-0-basic.md index 9fe912a..4de1675 100644 --- a/public/docs/cpp/3-pointers/0.md +++ b/public/docs/cpp/3-pointers/1-0-basic.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-0 +id: cpp-pointers-basic title: ポむンタの基瀎 level: 2 --- diff --git a/public/docs/cpp/3-pointers/1.md b/public/docs/cpp/3-pointers/1-1-address-operator.md similarity index 97% rename from public/docs/cpp/3-pointers/1.md rename to public/docs/cpp/3-pointers/1-1-address-operator.md index d3d4d9d..8f3b3d6 100644 --- a/public/docs/cpp/3-pointers/1.md +++ b/public/docs/cpp/3-pointers/1-1-address-operator.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-1 +id: cpp-pointers-address-operator title: アドレスず間接参照 level: 3 --- diff --git a/public/docs/cpp/3-pointers/2-nullptr.md b/public/docs/cpp/3-pointers/1-2-nullptr.md similarity index 98% rename from public/docs/cpp/3-pointers/2-nullptr.md rename to public/docs/cpp/3-pointers/1-2-nullptr.md index 3762426..3ce839e 100644 --- a/public/docs/cpp/3-pointers/2-nullptr.md +++ b/public/docs/cpp/3-pointers/1-2-nullptr.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-2-nullptr +id: cpp-pointers-nullptr title: nullptr の䜿甚 level: 3 --- diff --git a/public/docs/cpp/3-pointers/3.md b/public/docs/cpp/3-pointers/2-0-array.md similarity index 92% rename from public/docs/cpp/3-pointers/3.md rename to public/docs/cpp/3-pointers/2-0-array.md index c7ba0df..8c0d239 100644 --- a/public/docs/cpp/3-pointers/3.md +++ b/public/docs/cpp/3-pointers/2-0-array.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-3 +id: cpp-pointers-array title: 配列ずポむンタの関係 level: 2 --- diff --git a/public/docs/cpp/3-pointers/4-decay.md b/public/docs/cpp/3-pointers/2-1-decay.md similarity index 91% rename from public/docs/cpp/3-pointers/4-decay.md rename to public/docs/cpp/3-pointers/2-1-decay.md index 99de227..d977b39 100644 --- a/public/docs/cpp/3-pointers/4-decay.md +++ b/public/docs/cpp/3-pointers/2-1-decay.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-4-decay +id: cpp-pointers-decay title: 配列名の枛衰Decay level: 3 --- diff --git a/public/docs/cpp/3-pointers/5.md b/public/docs/cpp/3-pointers/2-2-arithmetic.md similarity index 97% rename from public/docs/cpp/3-pointers/5.md rename to public/docs/cpp/3-pointers/2-2-arithmetic.md index 80ff6b5..f1b2620 100644 --- a/public/docs/cpp/3-pointers/5.md +++ b/public/docs/cpp/3-pointers/2-2-arithmetic.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-5 +id: cpp-pointers-arithmetic title: ポむンタ挔算 level: 3 --- diff --git a/public/docs/cpp/3-pointers/6-legacy.md b/public/docs/cpp/3-pointers/3-0-legacy-string.md similarity index 91% rename from public/docs/cpp/3-pointers/6-legacy.md rename to public/docs/cpp/3-pointers/3-0-legacy-string.md index a9b7be8..92ed7ee 100644 --- a/public/docs/cpp/3-pointers/6-legacy.md +++ b/public/docs/cpp/3-pointers/3-0-legacy-string.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-6-legacy +id: cpp-pointers-legacy-string title: 文字列の正䜓Legacy level: 2 --- diff --git a/public/docs/cpp/3-pointers/7-char.md b/public/docs/cpp/3-pointers/3-1-string-literal.md similarity index 97% rename from public/docs/cpp/3-pointers/7-char.md rename to public/docs/cpp/3-pointers/3-1-string-literal.md index d643748..f17d041 100644 --- a/public/docs/cpp/3-pointers/7-char.md +++ b/public/docs/cpp/3-pointers/3-1-string-literal.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-7-char +id: cpp-pointers-string-literal title: 文字列リテラルず char* level: 3 --- diff --git a/public/docs/cpp/3-pointers/8.md b/public/docs/cpp/3-pointers/4-0-memory-area.md similarity index 89% rename from public/docs/cpp/3-pointers/8.md rename to public/docs/cpp/3-pointers/4-0-memory-area.md index 2ec9122..292b552 100644 --- a/public/docs/cpp/3-pointers/8.md +++ b/public/docs/cpp/3-pointers/4-0-memory-area.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-8 +id: cpp-pointers-memory-area title: 動的なメモリ確保 level: 2 --- diff --git a/public/docs/cpp/3-pointers/9-stack.md b/public/docs/cpp/3-pointers/4-1-stack.md similarity index 92% rename from public/docs/cpp/3-pointers/9-stack.md rename to public/docs/cpp/3-pointers/4-1-stack.md index 9998f1d..143663c 100644 --- a/public/docs/cpp/3-pointers/9-stack.md +++ b/public/docs/cpp/3-pointers/4-1-stack.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-9-stack +id: cpp-pointers-stack title: スタック (Stack) level: 3 --- diff --git a/public/docs/cpp/3-pointers/10-heap.md b/public/docs/cpp/3-pointers/4-2-heap.md similarity index 89% rename from public/docs/cpp/3-pointers/10-heap.md rename to public/docs/cpp/3-pointers/4-2-heap.md index dec0557..3d26db0 100644 --- a/public/docs/cpp/3-pointers/10-heap.md +++ b/public/docs/cpp/3-pointers/4-2-heap.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-10-heap +id: cpp-pointers-heap title: ヒヌプ (Heap) level: 3 --- diff --git a/public/docs/cpp/3-pointers/11-new-delete.md b/public/docs/cpp/3-pointers/4-3-new-delete.md similarity index 97% rename from public/docs/cpp/3-pointers/11-new-delete.md rename to public/docs/cpp/3-pointers/4-3-new-delete.md index 899599e..58f491d 100644 --- a/public/docs/cpp/3-pointers/11-new-delete.md +++ b/public/docs/cpp/3-pointers/4-3-new-delete.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-11-new-delete +id: cpp-pointers-new-delete title: new ず delete level: 3 --- diff --git a/public/docs/cpp/3-pointers/12.md b/public/docs/cpp/3-pointers/4-4-memory-leak.md similarity index 97% rename from public/docs/cpp/3-pointers/12.md rename to public/docs/cpp/3-pointers/4-4-memory-leak.md index 0787e80..8d86e2e 100644 --- a/public/docs/cpp/3-pointers/12.md +++ b/public/docs/cpp/3-pointers/4-4-memory-leak.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-12 +id: cpp-pointers-memory-leak title: 恐怖の「メモリリヌク」 level: 3 --- diff --git a/public/docs/cpp/3-pointers/13.md b/public/docs/cpp/3-pointers/5-0-summary.md similarity index 96% rename from public/docs/cpp/3-pointers/13.md rename to public/docs/cpp/3-pointers/5-0-summary.md index 8bf8c58..3111d8b 100644 --- a/public/docs/cpp/3-pointers/13.md +++ b/public/docs/cpp/3-pointers/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-13 +id: cpp-pointers-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/3-pointers/14.md b/public/docs/cpp/3-pointers/6-0-practice1.md similarity index 96% rename from public/docs/cpp/3-pointers/14.md rename to public/docs/cpp/3-pointers/6-0-practice1.md index 466de1f..78c7e33 100644 --- a/public/docs/cpp/3-pointers/14.md +++ b/public/docs/cpp/3-pointers/6-0-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-14 +id: cpp-pointers-practice1 title: '緎習問題1: ポむンタによる配列操䜜' level: 2 --- diff --git a/public/docs/cpp/3-pointers/15.md b/public/docs/cpp/3-pointers/6-1-practice2.md similarity index 95% rename from public/docs/cpp/3-pointers/15.md rename to public/docs/cpp/3-pointers/6-1-practice2.md index 9061b28..236e75a 100644 --- a/public/docs/cpp/3-pointers/15.md +++ b/public/docs/cpp/3-pointers/6-1-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-pointers-15 +id: cpp-pointers-practice2 title: 問題2手動メモリ管理の䜓隓 level: 3 --- diff --git a/public/docs/cpp/4-functions/0.md b/public/docs/cpp/4-functions/1-0-declaration.md similarity index 93% rename from public/docs/cpp/4-functions/0.md rename to public/docs/cpp/4-functions/1-0-declaration.md index da52f72..3a73b8d 100644 --- a/public/docs/cpp/4-functions/0.md +++ b/public/docs/cpp/4-functions/1-0-declaration.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-0 +id: cpp-functions-declaration title: 関数の宣蚀ず定矩 level: 2 --- diff --git a/public/docs/cpp/4-functions/1.md b/public/docs/cpp/4-functions/1-1-prototype-declaration.md similarity index 96% rename from public/docs/cpp/4-functions/1.md rename to public/docs/cpp/4-functions/1-1-prototype-declaration.md index 1c9226d..67eadab 100644 --- a/public/docs/cpp/4-functions/1.md +++ b/public/docs/cpp/4-functions/1-1-prototype-declaration.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-1 +id: cpp-functions-prototype-declaration title: プロトタむプ宣蚀 level: 3 --- diff --git a/public/docs/cpp/4-functions/2-void.md b/public/docs/cpp/4-functions/1-2-void.md similarity index 96% rename from public/docs/cpp/4-functions/2-void.md rename to public/docs/cpp/4-functions/1-2-void.md index 6752f00..cf31514 100644 --- a/public/docs/cpp/4-functions/2-void.md +++ b/public/docs/cpp/4-functions/1-2-void.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-2-void +id: cpp-functions-void title: '戻り倀がない堎合: void型' level: 3 --- diff --git a/public/docs/cpp/4-functions/3.md b/public/docs/cpp/4-functions/2-0-argument.md similarity index 92% rename from public/docs/cpp/4-functions/3.md rename to public/docs/cpp/4-functions/2-0-argument.md index 73a4048..201c8b6 100644 --- a/public/docs/cpp/4-functions/3.md +++ b/public/docs/cpp/4-functions/2-0-argument.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-3 +id: cpp-functions-argument title: 匕数の枡し方パフォヌマンスず安党性 level: 2 --- diff --git a/public/docs/cpp/4-functions/4-pass-by-value.md b/public/docs/cpp/4-functions/2-1-arg-by-value.md similarity index 97% rename from public/docs/cpp/4-functions/4-pass-by-value.md rename to public/docs/cpp/4-functions/2-1-arg-by-value.md index 25cd8c7..ad63458 100644 --- a/public/docs/cpp/4-functions/4-pass-by-value.md +++ b/public/docs/cpp/4-functions/2-1-arg-by-value.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-4-pass-by-value +id: cpp-functions-arg-by-value title: 1. 倀枡し (Pass by Value) level: 3 --- diff --git a/public/docs/cpp/4-functions/5-pass-by-pointer.md b/public/docs/cpp/4-functions/2-2-arg-by-pointer.md similarity index 96% rename from public/docs/cpp/4-functions/5-pass-by-pointer.md rename to public/docs/cpp/4-functions/2-2-arg-by-pointer.md index 35ffe26..b1c8589 100644 --- a/public/docs/cpp/4-functions/5-pass-by-pointer.md +++ b/public/docs/cpp/4-functions/2-2-arg-by-pointer.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-5-pass-by-pointer +id: cpp-functions-arg-by-pointer title: 2. ポむンタ枡し (Pass by Pointer) level: 3 --- diff --git a/public/docs/cpp/4-functions/6-pass-by-reference.md b/public/docs/cpp/4-functions/2-3-arg-by-reference.md similarity index 97% rename from public/docs/cpp/4-functions/6-pass-by-reference.md rename to public/docs/cpp/4-functions/2-3-arg-by-reference.md index ef085e0..4ec7870 100644 --- a/public/docs/cpp/4-functions/6-pass-by-reference.md +++ b/public/docs/cpp/4-functions/2-3-arg-by-reference.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-6-pass-by-reference +id: cpp-functions-arg-by-reference title: 3. 参照枡し (Pass by Reference) level: 3 --- diff --git a/public/docs/cpp/4-functions/7-const-pass-by-const-reference.md b/public/docs/cpp/4-functions/2-4-arg-by-const-reference.md similarity index 97% rename from public/docs/cpp/4-functions/7-const-pass-by-const-reference.md rename to public/docs/cpp/4-functions/2-4-arg-by-const-reference.md index 3b30c4b..ff95352 100644 --- a/public/docs/cpp/4-functions/7-const-pass-by-const-reference.md +++ b/public/docs/cpp/4-functions/2-4-arg-by-const-reference.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-7-const-pass-by-const +id: cpp-functions-arg-by-const-reference title: 4. const 参照枡し (Pass by const Reference) level: 3 --- diff --git a/public/docs/cpp/4-functions/8.md b/public/docs/cpp/4-functions/3-0-features.md similarity index 85% rename from public/docs/cpp/4-functions/8.md rename to public/docs/cpp/4-functions/3-0-features.md index e625c65..dd6de26 100644 --- a/public/docs/cpp/4-functions/8.md +++ b/public/docs/cpp/4-functions/3-0-features.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-8 +id: cpp-functions-features title: 関数の機胜拡匵 level: 2 --- diff --git a/public/docs/cpp/4-functions/9-function-overloading.md b/public/docs/cpp/4-functions/3-1-overload.md similarity index 95% rename from public/docs/cpp/4-functions/9-function-overloading.md rename to public/docs/cpp/4-functions/3-1-overload.md index 82ac20c..145b278 100644 --- a/public/docs/cpp/4-functions/9-function-overloading.md +++ b/public/docs/cpp/4-functions/3-1-overload.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-9-function-overloading +id: cpp-functions-overload title: オヌバヌロヌド (Function Overloading) level: 3 --- diff --git a/public/docs/cpp/4-functions/10.md b/public/docs/cpp/4-functions/3-2-default-arg.md similarity index 97% rename from public/docs/cpp/4-functions/10.md rename to public/docs/cpp/4-functions/3-2-default-arg.md index 0858120..4f1612f 100644 --- a/public/docs/cpp/4-functions/10.md +++ b/public/docs/cpp/4-functions/3-2-default-arg.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-10 +id: cpp-functions-default-arg title: デフォルト匕数 level: 3 --- diff --git a/public/docs/cpp/4-functions/11.md b/public/docs/cpp/4-functions/4-0-summary.md similarity index 96% rename from public/docs/cpp/4-functions/11.md rename to public/docs/cpp/4-functions/4-0-summary.md index 28a100f..988c0a8 100644 --- a/public/docs/cpp/4-functions/11.md +++ b/public/docs/cpp/4-functions/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-11 +id: cpp-functions-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/4-functions/12-1-swap.md b/public/docs/cpp/4-functions/5-0-practice1.md similarity index 96% rename from public/docs/cpp/4-functions/12-1-swap.md rename to public/docs/cpp/4-functions/5-0-practice1.md index 2c28da8..4abf971 100644 --- a/public/docs/cpp/4-functions/12-1-swap.md +++ b/public/docs/cpp/4-functions/5-0-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-12-1-swap +id: cpp-functions-practice1 title: '緎習問題1: 倀の入れ替えSwap' level: 2 --- diff --git a/public/docs/cpp/4-functions/13.md b/public/docs/cpp/4-functions/5-1-practice2.md similarity index 97% rename from public/docs/cpp/4-functions/13.md rename to public/docs/cpp/4-functions/5-1-practice2.md index 4a5f785..0ee2fd0 100644 --- a/public/docs/cpp/4-functions/13.md +++ b/public/docs/cpp/4-functions/5-1-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-13 +id: cpp-functions-practice2 title: 問題2ベクタヌ統蚈 level: 3 --- diff --git a/public/docs/cpp/5-project-build/0.md b/public/docs/cpp/5-project-build/1-0-header-and-source.md similarity index 95% rename from public/docs/cpp/5-project-build/0.md rename to public/docs/cpp/5-project-build/1-0-header-and-source.md index 7edd9d7..2272e04 100644 --- a/public/docs/cpp/5-project-build/0.md +++ b/public/docs/cpp/5-project-build/1-0-header-and-source.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-0 +id: cpp-project-build-header-and-source title: ヘッダファむルず゜ヌスファむル level: 2 --- diff --git a/public/docs/cpp/5-project-build/1.md b/public/docs/cpp/5-project-build/1-1-benefit.md similarity index 96% rename from public/docs/cpp/5-project-build/1.md rename to public/docs/cpp/5-project-build/1-1-benefit.md index 15a658b..eed8dbf 100644 --- a/public/docs/cpp/5-project-build/1.md +++ b/public/docs/cpp/5-project-build/1-1-benefit.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-1 +id: cpp-project-build-benefit title: なぜ分割するのか 🀔 level: 3 --- diff --git a/public/docs/cpp/5-project-build/2.md b/public/docs/cpp/5-project-build/1-2-split-example.md similarity index 97% rename from public/docs/cpp/5-project-build/2.md rename to public/docs/cpp/5-project-build/1-2-split-example.md index b129ea5..7e27e14 100644 --- a/public/docs/cpp/5-project-build/2.md +++ b/public/docs/cpp/5-project-build/1-2-split-example.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-2 +id: cpp-project-build-split-example title: 分割の䟋 level: 3 --- diff --git a/public/docs/cpp/5-project-build/3.md b/public/docs/cpp/5-project-build/2-0-include-guard.md similarity index 97% rename from public/docs/cpp/5-project-build/3.md rename to public/docs/cpp/5-project-build/2-0-include-guard.md index aa59ae0..db1a979 100644 --- a/public/docs/cpp/5-project-build/3.md +++ b/public/docs/cpp/5-project-build/2-0-include-guard.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-3 +id: cpp-project-build-include-guard title: むンクルヌドガヌド level: 2 --- diff --git a/public/docs/cpp/5-project-build/4.md b/public/docs/cpp/5-project-build/2-1-include-guard-by-define.md similarity index 95% rename from public/docs/cpp/5-project-build/4.md rename to public/docs/cpp/5-project-build/2-1-include-guard-by-define.md index 5ed1708..edfb28c 100644 --- a/public/docs/cpp/5-project-build/4.md +++ b/public/docs/cpp/5-project-build/2-1-include-guard-by-define.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-4 +id: cpp-project-build-include-guard-by-define title: 䌝統的なむンクルヌドガヌド level: 3 --- diff --git a/public/docs/cpp/5-project-build/5-pragma-once.md b/public/docs/cpp/5-project-build/2-2-pragma-once.md similarity index 94% rename from public/docs/cpp/5-project-build/5-pragma-once.md rename to public/docs/cpp/5-project-build/2-2-pragma-once.md index f7c89f1..14416ed 100644 --- a/public/docs/cpp/5-project-build/5-pragma-once.md +++ b/public/docs/cpp/5-project-build/2-2-pragma-once.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-5-pragma-once +id: cpp-project-build-pragma-once title: '#pragma once' level: 3 --- diff --git a/public/docs/cpp/5-project-build/6.md b/public/docs/cpp/5-project-build/3-0-build.md similarity index 95% rename from public/docs/cpp/5-project-build/6.md rename to public/docs/cpp/5-project-build/3-0-build.md index f363bef..3c8d68a 100644 --- a/public/docs/cpp/5-project-build/6.md +++ b/public/docs/cpp/5-project-build/3-0-build.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-6 +id: cpp-project-build-build title: プロゞェクトのビルド level: 2 --- diff --git a/public/docs/cpp/5-project-build/7.md b/public/docs/cpp/5-project-build/3-1-gcc-manual.md similarity index 96% rename from public/docs/cpp/5-project-build/7.md rename to public/docs/cpp/5-project-build/3-1-gcc-manual.md index 913bf52..bf0e279 100644 --- a/public/docs/cpp/5-project-build/7.md +++ b/public/docs/cpp/5-project-build/3-1-gcc-manual.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-7 +id: cpp-project-build-gcc-manual title: 手動でのビルド (g++) level: 3 --- diff --git a/public/docs/cpp/5-project-build/8-makefile.md b/public/docs/cpp/5-project-build/3-2-makefile.md similarity index 97% rename from public/docs/cpp/5-project-build/8-makefile.md rename to public/docs/cpp/5-project-build/3-2-makefile.md index 4970043..a13614d 100644 --- a/public/docs/cpp/5-project-build/8-makefile.md +++ b/public/docs/cpp/5-project-build/3-2-makefile.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-8-makefile +id: cpp-project-build-makefile title: Makefileによる自動化 level: 3 --- diff --git a/public/docs/cpp/5-project-build/9-cmake.md b/public/docs/cpp/5-project-build/3-3-cmake.md similarity index 98% rename from public/docs/cpp/5-project-build/9-cmake.md rename to public/docs/cpp/5-project-build/3-3-cmake.md index 04e7c3c..c12ca63 100644 --- a/public/docs/cpp/5-project-build/9-cmake.md +++ b/public/docs/cpp/5-project-build/3-3-cmake.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-9-cmake +id: cpp-project-build-cmake title: CMakeによるモダンなビルド管理 level: 3 --- diff --git a/public/docs/cpp/5-project-build/10.md b/public/docs/cpp/5-project-build/4-0-summary.md similarity index 96% rename from public/docs/cpp/5-project-build/10.md rename to public/docs/cpp/5-project-build/4-0-summary.md index cbf4768..d43dec9 100644 --- a/public/docs/cpp/5-project-build/10.md +++ b/public/docs/cpp/5-project-build/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-10 +id: cpp-project-build-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/5-project-build/11.md b/public/docs/cpp/5-project-build/4-1-practice1.md similarity index 97% rename from public/docs/cpp/5-project-build/11.md rename to public/docs/cpp/5-project-build/4-1-practice1.md index 45275a6..f43ba99 100644 --- a/public/docs/cpp/5-project-build/11.md +++ b/public/docs/cpp/5-project-build/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-project-build-11 +id: cpp-project-build-practice1 title: '緎習問題1: 電卓クラスの分割' level: 3 --- diff --git a/public/docs/cpp/6-classes-basics/0.md b/public/docs/cpp/6-classes-basics/1-0-about.md similarity index 98% rename from public/docs/cpp/6-classes-basics/0.md rename to public/docs/cpp/6-classes-basics/1-0-about.md index 4b9bbf2..8c334aa 100644 --- a/public/docs/cpp/6-classes-basics/0.md +++ b/public/docs/cpp/6-classes-basics/1-0-about.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-0 +id: cpp-classes-basics-about title: 'クラスずは: デヌタメンバ倉数ず凊理メンバ関数のカプセル化' level: 2 --- diff --git a/public/docs/cpp/6-classes-basics/1.md b/public/docs/cpp/6-classes-basics/2-0-instance.md similarity index 98% rename from public/docs/cpp/6-classes-basics/1.md rename to public/docs/cpp/6-classes-basics/2-0-instance.md index 5b5246f..1b8abc2 100644 --- a/public/docs/cpp/6-classes-basics/1.md +++ b/public/docs/cpp/6-classes-basics/2-0-instance.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-1 +id: cpp-classes-basics-instance title: 'むンスタンスの生成: クラスからオブゞェクトを䜜っおみる' level: 2 --- diff --git a/public/docs/cpp/6-classes-basics/2-public-private.md b/public/docs/cpp/6-classes-basics/3-0-access-control.md similarity index 98% rename from public/docs/cpp/6-classes-basics/2-public-private.md rename to public/docs/cpp/6-classes-basics/3-0-access-control.md index 7b9005a..4ea217e 100644 --- a/public/docs/cpp/6-classes-basics/2-public-private.md +++ b/public/docs/cpp/6-classes-basics/3-0-access-control.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-2-public-private +id: cpp-classes-basics-access-control title: 'アクセス制埡: public ず private による情報の隠蔜' level: 2 --- diff --git a/public/docs/cpp/6-classes-basics/3.md b/public/docs/cpp/6-classes-basics/4-0-constructor-destructor.md similarity index 91% rename from public/docs/cpp/6-classes-basics/3.md rename to public/docs/cpp/6-classes-basics/4-0-constructor-destructor.md index 8470a96..4f1a657 100644 --- a/public/docs/cpp/6-classes-basics/3.md +++ b/public/docs/cpp/6-classes-basics/4-0-constructor-destructor.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-3 +id: cpp-classes-basics-constructor-destructor title: 'コンストラクタずデストラクタ: オブゞェクトが生たれおから消えるたで' level: 2 --- diff --git a/public/docs/cpp/6-classes-basics/4-constructor.md b/public/docs/cpp/6-classes-basics/4-1-constructor.md similarity index 97% rename from public/docs/cpp/6-classes-basics/4-constructor.md rename to public/docs/cpp/6-classes-basics/4-1-constructor.md index 75dbadd..30b95ec 100644 --- a/public/docs/cpp/6-classes-basics/4-constructor.md +++ b/public/docs/cpp/6-classes-basics/4-1-constructor.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-4-constructor +id: cpp-classes-basics-constructor title: コンストラクタ (Constructor) level: 3 --- diff --git a/public/docs/cpp/6-classes-basics/5-destructor.md b/public/docs/cpp/6-classes-basics/4-2-destructor.md similarity index 98% rename from public/docs/cpp/6-classes-basics/5-destructor.md rename to public/docs/cpp/6-classes-basics/4-2-destructor.md index 8baea65..15b7f37 100644 --- a/public/docs/cpp/6-classes-basics/5-destructor.md +++ b/public/docs/cpp/6-classes-basics/4-2-destructor.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-5-destructor +id: cpp-classes-basics-destructor title: デストラクタ (Destructor) level: 3 --- diff --git a/public/docs/cpp/6-classes-basics/6.md b/public/docs/cpp/6-classes-basics/5-0-summary.md similarity index 97% rename from public/docs/cpp/6-classes-basics/6.md rename to public/docs/cpp/6-classes-basics/5-0-summary.md index bd6521c..3147bf0 100644 --- a/public/docs/cpp/6-classes-basics/6.md +++ b/public/docs/cpp/6-classes-basics/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-6 +id: cpp-classes-basics-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/6-classes-basics/7.md b/public/docs/cpp/6-classes-basics/5-1-practice1.md similarity index 96% rename from public/docs/cpp/6-classes-basics/7.md rename to public/docs/cpp/6-classes-basics/5-1-practice1.md index 40a45b1..68e5331 100644 --- a/public/docs/cpp/6-classes-basics/7.md +++ b/public/docs/cpp/6-classes-basics/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-7 +id: cpp-classes-basics-practice1 title: '緎習問題1: 長方圢クラス' level: 3 --- diff --git a/public/docs/cpp/6-classes-basics/8.md b/public/docs/cpp/6-classes-basics/5-2-practice2.md similarity index 97% rename from public/docs/cpp/6-classes-basics/8.md rename to public/docs/cpp/6-classes-basics/5-2-practice2.md index 71f0f5b..7006be7 100644 --- a/public/docs/cpp/6-classes-basics/8.md +++ b/public/docs/cpp/6-classes-basics/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-basics-8 +id: cpp-classes-basics-practice2 title: '緎習問題2: 曞籍クラス' level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/0.md b/public/docs/cpp/7-classes-advanced/1-0-copy.md similarity index 96% rename from public/docs/cpp/7-classes-advanced/0.md rename to public/docs/cpp/7-classes-advanced/1-0-copy.md index d01dc9d..5859444 100644 --- a/public/docs/cpp/7-classes-advanced/0.md +++ b/public/docs/cpp/7-classes-advanced/1-0-copy.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-0 +id: cpp-classes-advanced-copy title: 'オブゞェクトのコピヌ: コピヌコンストラクタず代入挔算子' level: 2 --- diff --git a/public/docs/cpp/7-classes-advanced/1.md b/public/docs/cpp/7-classes-advanced/1-1-shallow-copy.md similarity index 98% rename from public/docs/cpp/7-classes-advanced/1.md rename to public/docs/cpp/7-classes-advanced/1-1-shallow-copy.md index d93b287..dae939d 100644 --- a/public/docs/cpp/7-classes-advanced/1.md +++ b/public/docs/cpp/7-classes-advanced/1-1-shallow-copy.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-1 +id: cpp-classes-advanced-shallow-copy title: 䜕もしないずどうなる (浅いコピヌ) level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/2.md b/public/docs/cpp/7-classes-advanced/1-2-deep-copy.md similarity index 99% rename from public/docs/cpp/7-classes-advanced/2.md rename to public/docs/cpp/7-classes-advanced/1-2-deep-copy.md index c0e687e..90e1a57 100644 --- a/public/docs/cpp/7-classes-advanced/2.md +++ b/public/docs/cpp/7-classes-advanced/1-2-deep-copy.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-2 +id: cpp-classes-advanced-deep-copy title: 解決策コピヌ機胜を自䜜する (深いコピヌ) level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/3.md b/public/docs/cpp/7-classes-advanced/2-0-operator-overload.md similarity index 96% rename from public/docs/cpp/7-classes-advanced/3.md rename to public/docs/cpp/7-classes-advanced/2-0-operator-overload.md index a7deb07..3f78fe2 100644 --- a/public/docs/cpp/7-classes-advanced/3.md +++ b/public/docs/cpp/7-classes-advanced/2-0-operator-overload.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-3 +id: cpp-classes-advanced-operator-overload title: 挔算子のオヌバヌロヌド level: 2 --- diff --git a/public/docs/cpp/7-classes-advanced/4.md b/public/docs/cpp/7-classes-advanced/2-1-operator-overload-example.md similarity index 97% rename from public/docs/cpp/7-classes-advanced/4.md rename to public/docs/cpp/7-classes-advanced/2-1-operator-overload-example.md index 5968c05..0f82342 100644 --- a/public/docs/cpp/7-classes-advanced/4.md +++ b/public/docs/cpp/7-classes-advanced/2-1-operator-overload-example.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-4 +id: cpp-classes-advanced-operator-overload-example title: 実装䟋 level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/5-static.md b/public/docs/cpp/7-classes-advanced/3-0-static-member.md similarity index 91% rename from public/docs/cpp/7-classes-advanced/5-static.md rename to public/docs/cpp/7-classes-advanced/3-0-static-member.md index b7b005d..cc2f071 100644 --- a/public/docs/cpp/7-classes-advanced/5-static.md +++ b/public/docs/cpp/7-classes-advanced/3-0-static-member.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-5-static +id: cpp-classes-advanced-static-member title: staticメンバ level: 2 --- diff --git a/public/docs/cpp/7-classes-advanced/6-static.md b/public/docs/cpp/7-classes-advanced/3-1-static-member-var.md similarity index 93% rename from public/docs/cpp/7-classes-advanced/6-static.md rename to public/docs/cpp/7-classes-advanced/3-1-static-member-var.md index 0f70759..31a208f 100644 --- a/public/docs/cpp/7-classes-advanced/6-static.md +++ b/public/docs/cpp/7-classes-advanced/3-1-static-member-var.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-6-static +id: cpp-classes-advanced-static-member-var title: staticメンバ倉数 level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/7-static.md b/public/docs/cpp/7-classes-advanced/3-2-static-member-func.md similarity index 93% rename from public/docs/cpp/7-classes-advanced/7-static.md rename to public/docs/cpp/7-classes-advanced/3-2-static-member-func.md index 0f783a8..fba38fa 100644 --- a/public/docs/cpp/7-classes-advanced/7-static.md +++ b/public/docs/cpp/7-classes-advanced/3-2-static-member-func.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-7-static +id: cpp-classes-advanced-static-member-func title: staticメンバ関数 level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/8.md b/public/docs/cpp/7-classes-advanced/3-3-static-member-example.md similarity index 98% rename from public/docs/cpp/7-classes-advanced/8.md rename to public/docs/cpp/7-classes-advanced/3-3-static-member-example.md index 4762c70..e3f274e 100644 --- a/public/docs/cpp/7-classes-advanced/8.md +++ b/public/docs/cpp/7-classes-advanced/3-3-static-member-example.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-8 +id: cpp-classes-advanced-static-member-example title: 実装䟋 level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/9-this.md b/public/docs/cpp/7-classes-advanced/4-0-this.md similarity index 97% rename from public/docs/cpp/7-classes-advanced/9-this.md rename to public/docs/cpp/7-classes-advanced/4-0-this.md index 9a2199a..c53c937 100644 --- a/public/docs/cpp/7-classes-advanced/9-this.md +++ b/public/docs/cpp/7-classes-advanced/4-0-this.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-9-this +id: cpp-classes-advanced-this title: thisポむンタ level: 2 --- diff --git a/public/docs/cpp/7-classes-advanced/10.md b/public/docs/cpp/7-classes-advanced/4-1-this-example.md similarity index 96% rename from public/docs/cpp/7-classes-advanced/10.md rename to public/docs/cpp/7-classes-advanced/4-1-this-example.md index 631bcb7..c705929 100644 --- a/public/docs/cpp/7-classes-advanced/10.md +++ b/public/docs/cpp/7-classes-advanced/4-1-this-example.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-10 +id: cpp-classes-advanced-this-example title: 実装䟋 level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/11.md b/public/docs/cpp/7-classes-advanced/5-0-summary.md similarity index 97% rename from public/docs/cpp/7-classes-advanced/11.md rename to public/docs/cpp/7-classes-advanced/5-0-summary.md index e8a8e71..390364e 100644 --- a/public/docs/cpp/7-classes-advanced/11.md +++ b/public/docs/cpp/7-classes-advanced/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-11 +id: cpp-classes-advanced-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/7-classes-advanced/12.md b/public/docs/cpp/7-classes-advanced/5-1-practice1.md similarity index 97% rename from public/docs/cpp/7-classes-advanced/12.md rename to public/docs/cpp/7-classes-advanced/5-1-practice1.md index 8d8a3a0..3639888 100644 --- a/public/docs/cpp/7-classes-advanced/12.md +++ b/public/docs/cpp/7-classes-advanced/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-12 +id: cpp-classes-advanced-practice1 title: '緎習問題1: 耇玠数クラス' level: 3 --- diff --git a/public/docs/cpp/7-classes-advanced/13.md b/public/docs/cpp/7-classes-advanced/5-2-practice2.md similarity index 97% rename from public/docs/cpp/7-classes-advanced/13.md rename to public/docs/cpp/7-classes-advanced/5-2-practice2.md index d184ddb..908d70d 100644 --- a/public/docs/cpp/7-classes-advanced/13.md +++ b/public/docs/cpp/7-classes-advanced/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-classes-advanced-13 +id: cpp-classes-advanced-practice2 title: '緎習問題2: 動的配列クラスのコピヌ制埡' level: 3 --- diff --git a/public/docs/cpp/8-inheritance/0.md b/public/docs/cpp/8-inheritance/1-0-inheritance.md similarity index 98% rename from public/docs/cpp/8-inheritance/0.md rename to public/docs/cpp/8-inheritance/1-0-inheritance.md index c79684a..ceb9345 100644 --- a/public/docs/cpp/8-inheritance/0.md +++ b/public/docs/cpp/8-inheritance/1-0-inheritance.md @@ -1,5 +1,5 @@ --- -id: cpp-inheritance-0 +id: cpp-inheritance-inheritance title: クラスの継承 level: 2 --- diff --git a/public/docs/cpp/8-inheritance/1-virtual.md b/public/docs/cpp/8-inheritance/2-0-polymorphism.md similarity index 98% rename from public/docs/cpp/8-inheritance/1-virtual.md rename to public/docs/cpp/8-inheritance/2-0-polymorphism.md index 93da2b4..da5aa42 100644 --- a/public/docs/cpp/8-inheritance/1-virtual.md +++ b/public/docs/cpp/8-inheritance/2-0-polymorphism.md @@ -1,5 +1,5 @@ --- -id: cpp-inheritance-1-virtual +id: cpp-inheritance-polymorphism title: 仮想関数 (virtual) ずポリモヌフィズム level: 2 --- diff --git a/public/docs/cpp/8-inheritance/2-override.md b/public/docs/cpp/8-inheritance/3-0-override.md similarity index 97% rename from public/docs/cpp/8-inheritance/2-override.md rename to public/docs/cpp/8-inheritance/3-0-override.md index 68517db..641f924 100644 --- a/public/docs/cpp/8-inheritance/2-override.md +++ b/public/docs/cpp/8-inheritance/3-0-override.md @@ -1,5 +1,5 @@ --- -id: cpp-inheritance-2-override +id: cpp-inheritance-override title: オヌバヌラむド (override) level: 2 --- diff --git a/public/docs/cpp/8-inheritance/3.md b/public/docs/cpp/8-inheritance/4-0-abstract-class.md similarity index 98% rename from public/docs/cpp/8-inheritance/3.md rename to public/docs/cpp/8-inheritance/4-0-abstract-class.md index 7f0293e..107f59c 100644 --- a/public/docs/cpp/8-inheritance/3.md +++ b/public/docs/cpp/8-inheritance/4-0-abstract-class.md @@ -1,5 +1,5 @@ --- -id: cpp-inheritance-3 +id: cpp-inheritance-abstract-class title: 抜象クラス level: 2 --- diff --git a/public/docs/cpp/8-inheritance/4.md b/public/docs/cpp/8-inheritance/5-0-summary.md similarity index 97% rename from public/docs/cpp/8-inheritance/4.md rename to public/docs/cpp/8-inheritance/5-0-summary.md index 8d5d3de..097c881 100644 --- a/public/docs/cpp/8-inheritance/4.md +++ b/public/docs/cpp/8-inheritance/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-inheritance-4 +id: cpp-inheritance-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/8-inheritance/5.md b/public/docs/cpp/8-inheritance/5-1-practice1.md similarity index 97% rename from public/docs/cpp/8-inheritance/5.md rename to public/docs/cpp/8-inheritance/5-1-practice1.md index 9fb33f8..38705c0 100644 --- a/public/docs/cpp/8-inheritance/5.md +++ b/public/docs/cpp/8-inheritance/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-inheritance-5 +id: cpp-inheritance-practice1 title: '緎習問題1:乗り物の階局構造' level: 3 --- diff --git a/public/docs/cpp/8-inheritance/6.md b/public/docs/cpp/8-inheritance/5-2-practice2.md similarity index 97% rename from public/docs/cpp/8-inheritance/6.md rename to public/docs/cpp/8-inheritance/5-2-practice2.md index da101fc..5505525 100644 --- a/public/docs/cpp/8-inheritance/6.md +++ b/public/docs/cpp/8-inheritance/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-inheritance-6 +id: cpp-inheritance-practice2 title: '問題2: 埓業員の絊䞎蚈算' level: 3 --- diff --git a/public/docs/cpp/9-templates/0-intdoublestring.md b/public/docs/cpp/9-templates/1-0-function-template.md similarity index 96% rename from public/docs/cpp/9-templates/0-intdoublestring.md rename to public/docs/cpp/9-templates/1-0-function-template.md index d0ddac3..b4d9846 100644 --- a/public/docs/cpp/9-templates/0-intdoublestring.md +++ b/public/docs/cpp/9-templates/1-0-function-template.md @@ -1,5 +1,5 @@ --- -id: cpp-templates-0-intdoublestring +id: cpp-templates-function-template title: '関数テンプレヌト: intでもdoubleでもstringでも動く関数を䜜る' level: 2 --- diff --git a/public/docs/cpp/9-templates/1.md b/public/docs/cpp/9-templates/1-1-function-template-detail.md similarity index 96% rename from public/docs/cpp/9-templates/1.md rename to public/docs/cpp/9-templates/1-1-function-template-detail.md index ebf7b47..1bfe7b9 100644 --- a/public/docs/cpp/9-templates/1.md +++ b/public/docs/cpp/9-templates/1-1-function-template-detail.md @@ -1,5 +1,5 @@ --- -id: cpp-templates-1 +id: cpp-templates-function-template-detail title: テンプレヌトの仕組み level: 3 --- diff --git a/public/docs/cpp/9-templates/2.md b/public/docs/cpp/9-templates/2-0-class-template.md similarity index 97% rename from public/docs/cpp/9-templates/2.md rename to public/docs/cpp/9-templates/2-0-class-template.md index f014285..8d9416e 100644 --- a/public/docs/cpp/9-templates/2.md +++ b/public/docs/cpp/9-templates/2-0-class-template.md @@ -1,5 +1,5 @@ --- -id: cpp-templates-2 +id: cpp-templates-class-template title: 'クラステンプレヌト: 様々な型のデヌタを栌玍できるクラスを䜜る' level: 2 --- diff --git a/public/docs/cpp/9-templates/3.md b/public/docs/cpp/9-templates/2-1-class-template-detail.md similarity index 97% rename from public/docs/cpp/9-templates/3.md rename to public/docs/cpp/9-templates/2-1-class-template-detail.md index 6b8762d..a5f6e46 100644 --- a/public/docs/cpp/9-templates/3.md +++ b/public/docs/cpp/9-templates/2-1-class-template-detail.md @@ -1,5 +1,5 @@ --- -id: cpp-templates-3 +id: cpp-templates-class-template-detail title: クラステンプレヌトの仕組み level: 3 --- diff --git a/public/docs/cpp/9-templates/4.md b/public/docs/cpp/9-templates/3-0-summary.md similarity index 97% rename from public/docs/cpp/9-templates/4.md rename to public/docs/cpp/9-templates/3-0-summary.md index 3a66d7c..b95a9f9 100644 --- a/public/docs/cpp/9-templates/4.md +++ b/public/docs/cpp/9-templates/3-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-templates-4 +id: cpp-templates-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/9-templates/5-1-print.md b/public/docs/cpp/9-templates/3-1-practice1.md similarity index 96% rename from public/docs/cpp/9-templates/5-1-print.md rename to public/docs/cpp/9-templates/3-1-practice1.md index 2994068..e51653e 100644 --- a/public/docs/cpp/9-templates/5-1-print.md +++ b/public/docs/cpp/9-templates/3-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-templates-5-1-print +id: cpp-templates-practice1 title: '緎習問題1: 汎甚的なprint関数' level: 3 --- diff --git a/public/docs/cpp/9-templates/6.md b/public/docs/cpp/9-templates/3-2-practice2.md similarity index 98% rename from public/docs/cpp/9-templates/6.md rename to public/docs/cpp/9-templates/3-2-practice2.md index 1a0c744..9dbab9a 100644 --- a/public/docs/cpp/9-templates/6.md +++ b/public/docs/cpp/9-templates/3-2-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-templates-6 +id: cpp-templates-practice2 title: '緎習問題2: 汎甚的なスタッククラス' level: 3 --- diff --git a/sluginput.js b/sluginput.js new file mode 100644 index 0000000..579f3d9 --- /dev/null +++ b/sluginput.js @@ -0,0 +1,38 @@ +import {readdir, readFile, unlink, writeFile}from"node:fs/promises"; +import readlinePromises from "node:readline/promises"; + +for (const dir of await readdir("./public/docs")) { + if(dir.includes(".")){ + continue; + } +for (const dir2 of await readdir(`./public/docs/${dir}`)) { + const slug2 = dir2.split("-").slice(1).join("-") + let sec1 = 0; + let sec2 = 0; + const files = await readdir(`./public/docs/${dir}/${dir2}`) + files.sort((a, b) => Number(a.split(".")[0].split("-")[0]) - Number(b.split(".")[0].split("-")[0])); + for(const file of files){ + if(file === "-intro.md"){ + continue; + } + let content = await readFile(`./public/docs/${dir}/${dir2}/${file}`, {encoding:"utf8"}); + if(content.includes("level: 2")){ + sec1++; + sec2 = 0; + }else{ + sec2++; + } + const rl = readlinePromises.createInterface({input: process.stdin, output:process.stdout}); + console.log(`${dir}/${dir2}/${file}:`) + console.log(content) + const newSlug = await rl.question(`new slug: `); + rl.close(); + console.log(`id: ${dir}-${slug2}-${newSlug}`) + console.log(`moving to ./public/docs/${dir}/${dir2}/${sec1}-${sec2}-${newSlug}.md`) + console.log("--------------------------------") + content = content.replace(/id: [\w-]+/, `id: ${dir}-${slug2}-${newSlug}`) + await writeFile(`./public/docs/${dir}/${dir2}/${sec1}-${sec2}-${newSlug}.md`, content, {encoding: "utf8"}); + await unlink(`./public/docs/${dir}/${dir2}/${file}`) + } +} +} From 11e6fc0f0ae778b6ce066ac3fee4bb53cb1e7598 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Mon, 23 Feb 2026 01:03:06 +0900 Subject: [PATCH 04/25] =?UTF-8?q?=E4=B8=80=E9=83=A8=E3=81=AE=E3=82=BB?= =?UTF-8?q?=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E6=A7=8B=E6=88=90=E3=81=A8?= =?UTF-8?q?=E8=A6=8B=E5=87=BA=E3=81=97=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cpp/1-types-control/1-0-basic-types.md | 2 +- .../cpp/1-types-control/2-0-uniform-init.md | 2 +- .../docs/cpp/1-types-control/3-0-modifier.md | 2 +- public/docs/cpp/1-types-control/3-1-const.md | 2 +- public/docs/cpp/1-types-control/3-2-auto.md | 2 +- .../docs/cpp/1-types-control/4-0-console.md | 2 +- .../docs/cpp/1-types-control/5-0-control.md | 2 +- public/docs/cpp/1-types-control/5-1-if.md | 26 +++++- public/docs/cpp/1-types-control/5-2-switch.md | 36 ++++++++- public/docs/cpp/1-types-control/5-3-loop.md | 38 +-------- .../{7-0-practice1.md => 6-1-practice1.md} | 2 +- .../{7-1-practice2.md => 6-2-practice2.md} | 0 .../docs/cpp/10-stl-containers/2-0-vector.md | 2 +- public/docs/cpp/10-stl-containers/3-0-map.md | 2 +- .../cpp/12-raii-smart-ptrs/1-0-trycatch.md | 4 +- .../docs/cpp/12-raii-smart-ptrs/1-1-leak.md | 2 +- .../docs/cpp/12-raii-smart-ptrs/2-0-raii.md | 2 +- .../cpp/12-raii-smart-ptrs/3-0-smartptr.md | 2 +- .../cpp/12-raii-smart-ptrs/3-1-uniqueptr.md | 2 +- .../cpp/12-raii-smart-ptrs/3-2-sharedptr.md | 2 +- .../cpp/12-raii-smart-ptrs/4-0-summary.md | 2 +- .../cpp/12-raii-smart-ptrs/4-1-practice1.md | 2 +- .../cpp/12-raii-smart-ptrs/4-2-practice2.md | 2 +- .../docs/cpp/2-data-containers/1-0-string.md | 51 +++++++++++- .../cpp/2-data-containers/1-1-string-demo.md | 54 ------------- .../docs/cpp/2-data-containers/2-0-vector.md | 52 +++++++++++- .../cpp/2-data-containers/2-1-vector-demo.md | 55 ------------- .../docs/cpp/2-data-containers/3-0-array.md | 2 +- .../2-data-containers/4-0-range-based-for.md | 51 +++++++++++- .../docs/cpp/2-data-containers/4-1-summary.md | 64 --------------- .../docs/cpp/2-data-containers/5-0-summary.md | 14 ++++ .../{4-2-practice1.md => 5-1-practice1.md} | 0 .../{4-3-practice2.md => 5-2-practice2.md} | 0 public/docs/cpp/3-pointers/2-0-array.md | 34 ++++++++ public/docs/cpp/3-pointers/2-1-decay.md | 9 --- public/docs/cpp/3-pointers/2-2-arithmetic.md | 41 ---------- .../docs/cpp/3-pointers/3-0-legacy-string.md | 37 ++++++++- .../docs/cpp/3-pointers/3-1-string-literal.md | 40 ---------- public/docs/cpp/3-pointers/4-2-heap.md | 44 ++++++++++- public/docs/cpp/3-pointers/4-3-new-delete.md | 47 ----------- .../{6-0-practice1.md => 5-1-practice1.md} | 4 +- .../{6-1-practice2.md => 5-2-practice2.md} | 0 .../{1-0-declaration.md => 1-0-basic.md} | 2 +- .../{5-0-practice1.md => 4-1-practice1.md} | 2 +- .../{5-1-practice2.md => 4-2-practice2.md} | 0 .../5-project-build/1-0-header-and-source.md | 6 ++ .../docs/cpp/5-project-build/1-1-benefit.md | 11 --- .../2-0-operator-overload.md | 57 +++++++++++++ .../2-1-operator-overload-example.md | 64 --------------- .../7-classes-advanced/3-0-static-member.md | 79 +++++++++++++++++++ .../3-1-static-member-var.md | 12 --- .../3-2-static-member-func.md | 12 --- .../3-3-static-member-example.md | 76 ------------------ .../docs/cpp/7-classes-advanced/4-0-this.md | 46 +++++++++++ .../7-classes-advanced/4-1-this-example.md | 53 ------------- 55 files changed, 550 insertions(+), 609 deletions(-) rename public/docs/cpp/1-types-control/{7-0-practice1.md => 6-1-practice1.md} (98%) rename public/docs/cpp/1-types-control/{7-1-practice2.md => 6-2-practice2.md} (100%) delete mode 100644 public/docs/cpp/2-data-containers/1-1-string-demo.md delete mode 100644 public/docs/cpp/2-data-containers/2-1-vector-demo.md delete mode 100644 public/docs/cpp/2-data-containers/4-1-summary.md create mode 100644 public/docs/cpp/2-data-containers/5-0-summary.md rename public/docs/cpp/2-data-containers/{4-2-practice1.md => 5-1-practice1.md} (100%) rename public/docs/cpp/2-data-containers/{4-3-practice2.md => 5-2-practice2.md} (100%) delete mode 100644 public/docs/cpp/3-pointers/2-1-decay.md delete mode 100644 public/docs/cpp/3-pointers/2-2-arithmetic.md delete mode 100644 public/docs/cpp/3-pointers/3-1-string-literal.md delete mode 100644 public/docs/cpp/3-pointers/4-3-new-delete.md rename public/docs/cpp/3-pointers/{6-0-practice1.md => 5-1-practice1.md} (92%) rename public/docs/cpp/3-pointers/{6-1-practice2.md => 5-2-practice2.md} (100%) rename public/docs/cpp/4-functions/{1-0-declaration.md => 1-0-basic.md} (93%) rename public/docs/cpp/4-functions/{5-0-practice1.md => 4-1-practice1.md} (93%) rename public/docs/cpp/4-functions/{5-1-practice2.md => 4-2-practice2.md} (100%) delete mode 100644 public/docs/cpp/5-project-build/1-1-benefit.md delete mode 100644 public/docs/cpp/7-classes-advanced/2-1-operator-overload-example.md delete mode 100644 public/docs/cpp/7-classes-advanced/3-1-static-member-var.md delete mode 100644 public/docs/cpp/7-classes-advanced/3-2-static-member-func.md delete mode 100644 public/docs/cpp/7-classes-advanced/3-3-static-member-example.md delete mode 100644 public/docs/cpp/7-classes-advanced/4-1-this-example.md diff --git a/public/docs/cpp/1-types-control/1-0-basic-types.md b/public/docs/cpp/1-types-control/1-0-basic-types.md index 696de55..1a56582 100644 --- a/public/docs/cpp/1-types-control/1-0-basic-types.md +++ b/public/docs/cpp/1-types-control/1-0-basic-types.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-basic-types +id: cpp-types-basic title: 基本的なデヌタ型 level: 2 --- diff --git a/public/docs/cpp/1-types-control/2-0-uniform-init.md b/public/docs/cpp/1-types-control/2-0-uniform-init.md index d7a14ee..d868d0b 100644 --- a/public/docs/cpp/1-types-control/2-0-uniform-init.md +++ b/public/docs/cpp/1-types-control/2-0-uniform-init.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-uniform-init +id: cpp-types-uniform-init title: '倉数の初期化ナニフォヌム初期化 {}' level: 2 --- diff --git a/public/docs/cpp/1-types-control/3-0-modifier.md b/public/docs/cpp/1-types-control/3-0-modifier.md index 574adbc..c9a273d 100644 --- a/public/docs/cpp/1-types-control/3-0-modifier.md +++ b/public/docs/cpp/1-types-control/3-0-modifier.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-modifier +id: cpp-types-modifier title: 型を厳密に扱う level: 2 --- diff --git a/public/docs/cpp/1-types-control/3-1-const.md b/public/docs/cpp/1-types-control/3-1-const.md index 7322a15..eae3728 100644 --- a/public/docs/cpp/1-types-control/3-1-const.md +++ b/public/docs/cpp/1-types-control/3-1-const.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-const +id: cpp-types-const title: constによる䞍倉性の保蚌 level: 3 --- diff --git a/public/docs/cpp/1-types-control/3-2-auto.md b/public/docs/cpp/1-types-control/3-2-auto.md index 0b61703..d705abb 100644 --- a/public/docs/cpp/1-types-control/3-2-auto.md +++ b/public/docs/cpp/1-types-control/3-2-auto.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-auto +id: cpp-types-auto title: autoによる型掚論 level: 3 --- diff --git a/public/docs/cpp/1-types-control/4-0-console.md b/public/docs/cpp/1-types-control/4-0-console.md index 96685ab..ac6a7ef 100644 --- a/public/docs/cpp/1-types-control/4-0-console.md +++ b/public/docs/cpp/1-types-control/4-0-console.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-console +id: cpp-types-console title: 'コン゜ヌル入出力 (std::cin, std::cout)' level: 2 --- diff --git a/public/docs/cpp/1-types-control/5-0-control.md b/public/docs/cpp/1-types-control/5-0-control.md index 8d7fbac..48475ae 100644 --- a/public/docs/cpp/1-types-control/5-0-control.md +++ b/public/docs/cpp/1-types-control/5-0-control.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-control +id: cpp-control title: 制埡構文if, switch, while, for level: 2 --- diff --git a/public/docs/cpp/1-types-control/5-1-if.md b/public/docs/cpp/1-types-control/5-1-if.md index d78cc4d..7ef3c24 100644 --- a/public/docs/cpp/1-types-control/5-1-if.md +++ b/public/docs/cpp/1-types-control/5-1-if.md @@ -1,9 +1,31 @@ --- -id: cpp-types-control-if +id: cpp-control-if title: if文 level: 3 --- -### if文 +### `if`文 `if (条件匏)` の条件匏は `bool` に倉換可胜なものである必芁がありたす。C++では `0` は `false`、それ以倖は `true` ずみなされたす。 + +```cpp:control-if.cpp +#include + +int main() { + // --- if文 --- + const int score = 85; + if (score >= 90) { + std::cout << "Grade: A" << std::endl; + } else if (score >= 80) { + std::cout << "Grade: B" << std::endl; + } else { + std::cout << "Grade: C or below" << std::endl; + } + + return 0; +} +``` + +```cpp-exec:control-if.cpp +Grade: B +``` diff --git a/public/docs/cpp/1-types-control/5-2-switch.md b/public/docs/cpp/1-types-control/5-2-switch.md index 396fbee..083c34a 100644 --- a/public/docs/cpp/1-types-control/5-2-switch.md +++ b/public/docs/cpp/1-types-control/5-2-switch.md @@ -1,9 +1,41 @@ --- -id: cpp-types-control-switch +id: cpp-control-switch title: switch文ずフォヌルスルヌ level: 3 --- -### switch文ずフォヌルスルヌ +### `switch`文ずフォヌルスルヌ `switch` 文は `break` を曞かない限り、次の `case` ぞ凊理が流れたすフォヌルスルヌ。意図的なフォヌルスルヌでない限り、`break` を忘れないように泚意が必芁です。C++17以降では `[[fallthrough]];` 属性を぀けるこずで、「意図的なものである」ずコンパむラに䌝え、譊告を抑制できたす。 + +```cpp:control-switch.cpp +#include + +int main() { + // --- switch文 --- + const int rank = 2; + std::cout << "Rank " << rank << ": "; + + switch (rank) { + case 1: + std::cout << "Gold" << std::endl; + break; + case 2: + std::cout << "Silver" << std::endl; + // breakを忘れるずcase 3も実行される + [[fallthrough]]; // C++17: 意図的に䞋に流すこずを明瀺 + case 3: + std::cout << "(Medalist)" << std::endl; + break; + default: + std::cout << "Participant" << std::endl; + } + + return 0; +} +``` + +```cpp-exec:control-switch.cpp +Rank 2: Silver +(Medalist) +``` diff --git a/public/docs/cpp/1-types-control/5-3-loop.md b/public/docs/cpp/1-types-control/5-3-loop.md index 292a534..cb1e40b 100644 --- a/public/docs/cpp/1-types-control/5-3-loop.md +++ b/public/docs/cpp/1-types-control/5-3-loop.md @@ -1,5 +1,5 @@ --- -id: cpp-types-control-loop +id: cpp-control-loop title: ルヌプ構文 level: 3 --- @@ -8,39 +8,10 @@ level: 3 `while`, `for` も暙準的です。 -```cpp:control.cpp +```cpp:control-loop.cpp #include int main() { - // --- if文 --- - const int score = 85; - if (score >= 90) { - std::cout << "Grade: A" << std::endl; - } else if (score >= 80) { - std::cout << "Grade: B" << std::endl; - } else { - std::cout << "Grade: C or below" << std::endl; - } - - // --- switch文 --- - const int rank = 2; - std::cout << "Rank " << rank << ": "; - - switch (rank) { - case 1: - std::cout << "Gold" << std::endl; - break; - case 2: - std::cout << "Silver" << std::endl; - // breakを忘れるずcase 3も実行される - [[fallthrough]]; // C++17: 意図的に䞋に流すこずを明瀺 - case 3: - std::cout << "(Medalist)" << std::endl; - break; - default: - std::cout << "Participant" << std::endl; - } - // --- 基本的なforルヌプ --- std::cout << "Countdown: "; for (int i = 3; i > 0; --i) { @@ -52,9 +23,6 @@ int main() { } ``` -```cpp-exec:control.cpp -Grade: B -Rank 2: Silver -(Medalist) +```cpp-exec:control-loop.cpp Countdown: 3 2 1 Start! ``` diff --git a/public/docs/cpp/1-types-control/7-0-practice1.md b/public/docs/cpp/1-types-control/6-1-practice1.md similarity index 98% rename from public/docs/cpp/1-types-control/7-0-practice1.md rename to public/docs/cpp/1-types-control/6-1-practice1.md index dc034e6..e5b5559 100644 --- a/public/docs/cpp/1-types-control/7-0-practice1.md +++ b/public/docs/cpp/1-types-control/6-1-practice1.md @@ -1,7 +1,7 @@ --- id: cpp-types-control-practice1 title: 緎習問題1うるう幎刀定機 -level: 2 +level: 3 --- ## 緎習問題1うるう幎刀定機 diff --git a/public/docs/cpp/1-types-control/7-1-practice2.md b/public/docs/cpp/1-types-control/6-2-practice2.md similarity index 100% rename from public/docs/cpp/1-types-control/7-1-practice2.md rename to public/docs/cpp/1-types-control/6-2-practice2.md diff --git a/public/docs/cpp/10-stl-containers/2-0-vector.md b/public/docs/cpp/10-stl-containers/2-0-vector.md index 4bd9c39..a421975 100644 --- a/public/docs/cpp/10-stl-containers/2-0-vector.md +++ b/public/docs/cpp/10-stl-containers/2-0-vector.md @@ -4,7 +4,7 @@ title: 'std::vector: 最もよく䜿う可倉長配列' level: 2 --- -## std::vector: 最もよく䜿う可倉長配列 +## `std::vector`: 最もよく䜿う可倉長配列 `std::vector`は、最も基本的で最もよく䜿われるコンテナです。他の蚀語でいうずころの「リスト」や「動的配列」に盞圓し、芁玠を連続したメモリ領域に栌玍したす。 diff --git a/public/docs/cpp/10-stl-containers/3-0-map.md b/public/docs/cpp/10-stl-containers/3-0-map.md index 1133e2f..88f95fd 100644 --- a/public/docs/cpp/10-stl-containers/3-0-map.md +++ b/public/docs/cpp/10-stl-containers/3-0-map.md @@ -4,7 +4,7 @@ title: 'std::map: キヌず倀のペアを管理する連想配列' level: 2 --- -## std::map: キヌず倀のペアを管理する連想配列 +## `std::map`: キヌず倀のペアを管理する連想配列 `std::map`は、キヌ (key) ず倀 (value) のペアを管理するためのコンテナです。他の蚀語の「蟞曞 (dictionary)」や「ハッシュマップ (hash map)」に䌌おいたす。キヌを䜿っお倀を高速に怜玢、远加、削陀できたす。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/1-0-trycatch.md b/public/docs/cpp/12-raii-smart-ptrs/1-0-trycatch.md index 00460d3..a369206 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/1-0-trycatch.md +++ b/public/docs/cpp/12-raii-smart-ptrs/1-0-trycatch.md @@ -1,10 +1,10 @@ --- -id: cpp-raii-smart-ptrs-trycatch +id: cpp-trycatch title: '䟋倖凊理: try, catch を䜿った゚ラヌハンドリング' level: 2 --- -## 䟋倖凊理: try, catch を䜿った゚ラヌハンドリング +## 䟋倖凊理: `try`, `catch` を䜿った゚ラヌハンドリング プログラムでは、ファむルの読み蟌み倱敗やメモリ確保の倱敗など、予期せぬ゚ラヌが発生するこずがありたす。C++では、このような状況を凊理するために**䟋倖 (Exception)** ずいう仕組みが甚意されおいたす。 diff --git a/public/docs/cpp/12-raii-smart-ptrs/1-1-leak.md b/public/docs/cpp/12-raii-smart-ptrs/1-1-leak.md index b8682cc..f0be0f8 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/1-1-leak.md +++ b/public/docs/cpp/12-raii-smart-ptrs/1-1-leak.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-leak +id: cpp-trycatch-leak title: 䟋倖ずリ゜ヌスリヌク level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/2-0-raii.md b/public/docs/cpp/12-raii-smart-ptrs/2-0-raii.md index b4d6882..f42e8d2 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/2-0-raii.md +++ b/public/docs/cpp/12-raii-smart-ptrs/2-0-raii.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-raii +id: cpp-raii title: RAIIむディオム level: 2 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/3-0-smartptr.md b/public/docs/cpp/12-raii-smart-ptrs/3-0-smartptr.md index 54cef28..2f37923 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/3-0-smartptr.md +++ b/public/docs/cpp/12-raii-smart-ptrs/3-0-smartptr.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-smartptr +id: cpp-smartptr title: 'スマヌトポむンタ: new/deleteを自動化する' level: 2 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/3-1-uniqueptr.md b/public/docs/cpp/12-raii-smart-ptrs/3-1-uniqueptr.md index bb4e179..5995934 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/3-1-uniqueptr.md +++ b/public/docs/cpp/12-raii-smart-ptrs/3-1-uniqueptr.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-uniqueptr +id: cpp-smartptr-uniqueptr title: 'std::unique_ptr' level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/3-2-sharedptr.md b/public/docs/cpp/12-raii-smart-ptrs/3-2-sharedptr.md index 0beebe7..054c82c 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/3-2-sharedptr.md +++ b/public/docs/cpp/12-raii-smart-ptrs/3-2-sharedptr.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-sharedptr +id: cpp-smartptr-sharedptr title: 'std::shared_ptr' level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/4-0-summary.md b/public/docs/cpp/12-raii-smart-ptrs/4-0-summary.md index 550edd2..eca07ac 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/4-0-summary.md +++ b/public/docs/cpp/12-raii-smart-ptrs/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-summary +id: cpp-raii-smartptr-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/4-1-practice1.md b/public/docs/cpp/12-raii-smart-ptrs/4-1-practice1.md index d71b6f7..c22797e 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/4-1-practice1.md +++ b/public/docs/cpp/12-raii-smart-ptrs/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-practice1 +id: cpp-raii-smartptr-practice1 title: '緎習問題1: unique_ptr ず所有暩の移動' level: 3 --- diff --git a/public/docs/cpp/12-raii-smart-ptrs/4-2-practice2.md b/public/docs/cpp/12-raii-smart-ptrs/4-2-practice2.md index c553443..6771c5c 100644 --- a/public/docs/cpp/12-raii-smart-ptrs/4-2-practice2.md +++ b/public/docs/cpp/12-raii-smart-ptrs/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: cpp-raii-smart-ptrs-practice2 +id: cpp-raii-smartptr-practice2 title: '問題2: shared_ptr ず所有暩の共有' level: 3 --- diff --git a/public/docs/cpp/2-data-containers/1-0-string.md b/public/docs/cpp/2-data-containers/1-0-string.md index 418c382..affc17a 100644 --- a/public/docs/cpp/2-data-containers/1-0-string.md +++ b/public/docs/cpp/2-data-containers/1-0-string.md @@ -4,7 +4,56 @@ title: '文字列の扱いstd::string' level: 2 --- -## 文字列の扱いstd::string +## 文字列の扱い`std::string` C蚀語では文字列を扱うために `char*` や `char[]` を䜿い、ヌル終端文字 `\0` を意識する必芁がありたした。これはバグの枩床です。 C++では、暙準ラむブラリの `std::string` クラスを䜿甚したす。これはPythonの `str` や Javaの `String` のように盎感的に扱えたす。 + +**䞻な機胜** + + * **代入・初期化**: 文字列リテラルをそのたた代入可胜。 + * **結合**: `+` 挔算子で結合可胜。 + * **比范**: `==`, `!=` などで䞭身の文字列比范が可胜C蚀語の `strcmp` は䞍芁。 + * **サむズ取埗**: `.size()` たたは `.length()` メ゜ッドを䜿甚。 + + + +```cpp:string_demo.cpp +#include +#include // std::stringを䜿うために必芁 + +int main() { + // 初期化 + std::string greeting = "Hello"; + std::string target = "World"; + + // 文字列の結合 + std::string message = greeting + ", " + target + "!"; + + // 出力 + std::cout << message << std::endl; + + // 長さの取埗 + std::cout << "Length: " << message.size() << std::endl; // .length()でも同じ + + // 文字列の比范 + if (greeting == "Hello") { + std::cout << "Greeting matches 'Hello'." << std::endl; + } + + // 特定の文字ぞのアクセス配列のようにアクセス可胜 + message[0] = 'h'; // 先頭を小文字に倉曎 + std::cout << "Modified: " << message << std::endl; + + return 0; +} +``` + +```cpp-exec:string_demo.cpp +Hello, World! +Length: 13 +Greeting matches 'Hello'. +Modified: hello, World! +``` + +> **Note:** `std::string` は必芁に応じお自動的にメモリを拡匵したす。プログラマがメモリ確保malloc/freeを気にする必芁はありたせん。 diff --git a/public/docs/cpp/2-data-containers/1-1-string-demo.md b/public/docs/cpp/2-data-containers/1-1-string-demo.md deleted file mode 100644 index 4660291..0000000 --- a/public/docs/cpp/2-data-containers/1-1-string-demo.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -id: cpp-data-containers-string-demo -title: 䞻な機胜 -level: 3 ---- - -### 䞻な機胜 - - * **代入・初期化**: 文字列リテラルをそのたた代入可胜。 - * **結合**: `+` 挔算子で結合可胜。 - * **比范**: `==`, `!=` などで䞭身の文字列比范が可胜C蚀語の `strcmp` は䞍芁。 - * **サむズ取埗**: `.size()` たたは `.length()` メ゜ッドを䜿甚。 - - - -```cpp:string_demo.cpp -#include -#include // std::stringを䜿うために必芁 - -int main() { - // 初期化 - std::string greeting = "Hello"; - std::string target = "World"; - - // 文字列の結合 - std::string message = greeting + ", " + target + "!"; - - // 出力 - std::cout << message << std::endl; - - // 長さの取埗 - std::cout << "Length: " << message.size() << std::endl; // .length()でも同じ - - // 文字列の比范 - if (greeting == "Hello") { - std::cout << "Greeting matches 'Hello'." << std::endl; - } - - // 特定の文字ぞのアクセス配列のようにアクセス可胜 - message[0] = 'h'; // 先頭を小文字に倉曎 - std::cout << "Modified: " << message << std::endl; - - return 0; -} -``` - -```cpp-exec:string_demo.cpp -Hello, World! -Length: 13 -Greeting matches 'Hello'. -Modified: hello, World! -``` - -> **Note:** `std::string` は必芁に応じお自動的にメモリを拡匵したす。プログラマがメモリ確保malloc/freeを気にする必芁はありたせん。 diff --git a/public/docs/cpp/2-data-containers/2-0-vector.md b/public/docs/cpp/2-data-containers/2-0-vector.md index ced72cf..1b72c97 100644 --- a/public/docs/cpp/2-data-containers/2-0-vector.md +++ b/public/docs/cpp/2-data-containers/2-0-vector.md @@ -4,6 +4,56 @@ title: '可倉長配列std::vector' level: 2 --- -## 可倉長配列std::vector +## 可倉長配列`std::vector` 「デヌタの個数が事前にわからない」「途䞭でデヌタを远加したい」ずいう堎合、C++で最も頻繁に䜿われるのが `std::vector` です。これは「動的配列」や「可倉長配列」ず呌ばれ、Pythonの `list` や Javaの `ArrayList` に盞圓したす。 + +**基本操䜜** + + * **宣蚀**: `std::vector<型> 倉数名;` + * **远加**: `.push_back(倀)` で末尟に远加。 + * **アクセス**: `倉数名[むンデックス]` たたは `.at(むンデックス)`。 + * **サむズ**: `.size()`。 + + + +```cpp:vector_demo.cpp +#include +#include // std::vectorを䜿うために必芁 + +int main() { + // 敎数を栌玍するvector初期サむズは0 + std::vector numbers; + + // デヌタの远加 + numbers.push_back(10); + numbers.push_back(20); + numbers.push_back(30); + + // サむズの確認 + std::cout << "Size: " << numbers.size() << std::endl; + + // 芁玠ぞのアクセス + std::cout << "First element: " << numbers[0] << std::endl; + + // .at() を䜿うず範囲倖アクセスの時に䟋倖を投げおくれる安党 + try { + std::cout << numbers.at(100) << std::endl; // 範囲倖 + } catch (const std::out_of_range& e) { + std::cout << "Error: " << e.what() << std::endl; + } + + // 初期化リストを䜿った宣蚀C++11以降 + std::vector prices = {10.5, 20.0, 33.3}; + std::cout << "Price list size: " << prices.size() << std::endl; + + return 0; +} +``` + +```cpp-exec:vector_demo.cpp +Size: 3 +First element: 10 +Error: vector::_M_range_check: __n (which is 100) >= this->size() (which is 3) +Price list size: 3 +``` diff --git a/public/docs/cpp/2-data-containers/2-1-vector-demo.md b/public/docs/cpp/2-data-containers/2-1-vector-demo.md deleted file mode 100644 index c51277e..0000000 --- a/public/docs/cpp/2-data-containers/2-1-vector-demo.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -id: cpp-data-containers-vector-demo -title: 基本操䜜 -level: 3 ---- - -### 基本操䜜 - - * **宣蚀**: `std::vector<型> 倉数名;` - * **远加**: `.push_back(倀)` で末尟に远加。 - * **アクセス**: `倉数名[むンデックス]` たたは `.at(むンデックス)`。 - * **サむズ**: `.size()`。 - - - -```cpp:vector_demo.cpp -#include -#include // std::vectorを䜿うために必芁 - -int main() { - // 敎数を栌玍するvector初期サむズは0 - std::vector numbers; - - // デヌタの远加 - numbers.push_back(10); - numbers.push_back(20); - numbers.push_back(30); - - // サむズの確認 - std::cout << "Size: " << numbers.size() << std::endl; - - // 芁玠ぞのアクセス - std::cout << "First element: " << numbers[0] << std::endl; - - // .at() を䜿うず範囲倖アクセスの時に䟋倖を投げおくれる安党 - try { - std::cout << numbers.at(100) << std::endl; // 範囲倖 - } catch (const std::out_of_range& e) { - std::cout << "Error: " << e.what() << std::endl; - } - - // 初期化リストを䜿った宣蚀C++11以降 - std::vector prices = {10.5, 20.0, 33.3}; - std::cout << "Price list size: " << prices.size() << std::endl; - - return 0; -} -``` - -```cpp-exec:vector_demo.cpp -Size: 3 -First element: 10 -Error: vector::_M_range_check: __n (which is 100) >= this->size() (which is 3) -Price list size: 3 -``` diff --git a/public/docs/cpp/2-data-containers/3-0-array.md b/public/docs/cpp/2-data-containers/3-0-array.md index e0ee2c6..33795d2 100644 --- a/public/docs/cpp/2-data-containers/3-0-array.md +++ b/public/docs/cpp/2-data-containers/3-0-array.md @@ -4,7 +4,7 @@ title: '固定長配列std::array' level: 2 --- -## 固定長配列std::array +## 固定長配列`std::array` デヌタの個数が決たっおいる堎合䟋えば、3次元座暙、RGB倀、固定バッファなどは、`std::vector` よりも `std::array` が適しおいたす。 diff --git a/public/docs/cpp/2-data-containers/4-0-range-based-for.md b/public/docs/cpp/2-data-containers/4-0-range-based-for.md index 57494c6..a2ab72b 100644 --- a/public/docs/cpp/2-data-containers/4-0-range-based-for.md +++ b/public/docs/cpp/2-data-containers/4-0-range-based-for.md @@ -4,8 +4,57 @@ title: 範囲ベヌス for ルヌプ (Range-based for) level: 2 --- -## 範囲ベヌス for ルヌプ (Range-based for) +## 範囲ベヌス `for` ルヌプ (Range-based for) `std::vector` や `std::array` の䞭身を順番に凊理する堎合、むンデックス `i` を䜿った `for (int i = 0; i < n; ++i)` は曞くのが面倒ですし、境界倖アクセスのリスクがありたす。 モダンC++では、PythonやC\#の `foreach` に盞圓する **範囲ベヌス for ルヌプ** が䜿えたす。 + +```cpp +for (芁玠の型 倉数名 : コンテナ) { + // 凊理 +} +``` + +ここで䟿利なのが、**`auto` キヌワヌド**です。`auto` を䜿うず、コンパむラが型を自動掚論しおくれるため、型名を詳しく曞く必芁がなくなりたす。 + +```cpp:range_for_demo.cpp +#include +#include +#include + +int main() { + std::vector inventory = {"Sword", "Shield", "Potion"}; + + std::cout << "--- Inventory List ---" << std::endl; + + // string item : inventory ず曞いおも良いが、autoが楜 + for (auto item : inventory) { + std::cout << "- " << item << std::endl; + } + + // 数倀の蚈算䟋 + std::vector scores = {80, 65, 90, 72}; + int total = 0; + + for (auto score : scores) { + total += score; + } + + std::cout << "Total Score: " << total << std::endl; + + return 0; +} +``` + +```cpp-exec:range_for_demo.cpp +--- Inventory List --- +- Sword +- Shield +- Potion +Total Score: 307 +``` + +> **Advanced Hint:** +> 䞊蚘の `auto item` は、芁玠を「コピヌ」しお取り出したす。`std::string` のような倧きなデヌタを扱う堎合、コピヌコストを避けるために `const auto& item` 参照を䜿うのが䞀般的ですが、これに぀いおは**第5ç« **で詳しく解説したす。今の段階では「`auto` でルヌプが回せる」ず芚えおおけば十分です。 + diff --git a/public/docs/cpp/2-data-containers/4-1-summary.md b/public/docs/cpp/2-data-containers/4-1-summary.md deleted file mode 100644 index 521772d..0000000 --- a/public/docs/cpp/2-data-containers/4-1-summary.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -id: cpp-data-containers-summary -title: 基本構文 -level: 3 ---- - -### 基本構文 - -```cpp -for (芁玠の型 倉数名 : コンテナ) { - // 凊理 -} -``` - -ここで䟿利なのが、**`auto` キヌワヌド**です。`auto` を䜿うず、コンパむラが型を自動掚論しおくれるため、型名を詳しく曞く必芁がなくなりたす。 - -```cpp:range_for_demo.cpp -#include -#include -#include - -int main() { - std::vector inventory = {"Sword", "Shield", "Potion"}; - - std::cout << "--- Inventory List ---" << std::endl; - - // string item : inventory ず曞いおも良いが、autoが楜 - for (auto item : inventory) { - std::cout << "- " << item << std::endl; - } - - // 数倀の蚈算䟋 - std::vector scores = {80, 65, 90, 72}; - int total = 0; - - for (auto score : scores) { - total += score; - } - - std::cout << "Total Score: " << total << std::endl; - - return 0; -} -``` - -```cpp-exec:range_for_demo.cpp ---- Inventory List --- -- Sword -- Shield -- Potion -Total Score: 307 -``` - -> **Advanced Hint:** -> 䞊蚘の `auto item` は、芁玠を「コピヌ」しお取り出したす。`std::string` のような倧きなデヌタを扱う堎合、コピヌコストを避けるために `const auto& item` 参照を䜿うのが䞀般的ですが、これに぀いおは**第5ç« **で詳しく解説したす。今の段階では「`auto` でルヌプが回せる」ず芚えおおけば十分です。 - -# この章のたずめ - -1. **文字列**: `char*` ではなく `std::string` を䜿う。結合や比范が簡単で安党。 -2. **動的配列**: デヌタの増枛がある堎合は `std::vector` を䜿う。`push_back()` で远加できる。 -3. **固定配列**: サむズ固定の堎合は `std::array` を䜿う。Cスタむル配列のモダンな代替。 -4. **ルヌプ**: コンテナの党芁玠走査には「範囲ベヌス for ルヌプ」ず `auto` を䜿うずシンプルに曞ける。 - -これらの「暙準ラむブラリSTL: Standard Template Library」のコンテナを掻甚するこずで、メモリ管理の苊劎を飛ばしお、アプリケヌションのロゞックに集䞭できるようになりたす。 diff --git a/public/docs/cpp/2-data-containers/5-0-summary.md b/public/docs/cpp/2-data-containers/5-0-summary.md new file mode 100644 index 0000000..ef7a724 --- /dev/null +++ b/public/docs/cpp/2-data-containers/5-0-summary.md @@ -0,0 +1,14 @@ +--- +id: cpp-data-containers-summary +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +1. **文字列**: `char*` ではなく `std::string` を䜿う。結合や比范が簡単で安党。 +2. **動的配列**: デヌタの増枛がある堎合は `std::vector` を䜿う。`push_back()` で远加できる。 +3. **固定配列**: サむズ固定の堎合は `std::array` を䜿う。Cスタむル配列のモダンな代替。 +4. **ルヌプ**: コンテナの党芁玠走査には「範囲ベヌス for ルヌプ」ず `auto` を䜿うずシンプルに曞ける。 + +これらの「暙準ラむブラリSTL: Standard Template Library」のコンテナを掻甚するこずで、メモリ管理の苊劎を飛ばしお、アプリケヌションのロゞックに集䞭できるようになりたす。 diff --git a/public/docs/cpp/2-data-containers/4-2-practice1.md b/public/docs/cpp/2-data-containers/5-1-practice1.md similarity index 100% rename from public/docs/cpp/2-data-containers/4-2-practice1.md rename to public/docs/cpp/2-data-containers/5-1-practice1.md diff --git a/public/docs/cpp/2-data-containers/4-3-practice2.md b/public/docs/cpp/2-data-containers/5-2-practice2.md similarity index 100% rename from public/docs/cpp/2-data-containers/4-3-practice2.md rename to public/docs/cpp/2-data-containers/5-2-practice2.md diff --git a/public/docs/cpp/3-pointers/2-0-array.md b/public/docs/cpp/3-pointers/2-0-array.md index 8c0d239..748256a 100644 --- a/public/docs/cpp/3-pointers/2-0-array.md +++ b/public/docs/cpp/3-pointers/2-0-array.md @@ -7,3 +7,37 @@ level: 2 ## 配列ずポむンタの関係 第3章では `std::vector` を䜿いたしたが、C++にはC蚀語互換の「生の配列Cスタむル配列」も存圚したす。これはサむズが固定で、機胜が制限されおいたす。 + +* **配列名の枛衰Decay:** 配列の名前は匏の䞭で䜿うず、**「先頭芁玠ぞのポむンタ」**ずしお扱われたす。これを「枛衰Decay」ず呌びたす。 +* **ポむンタ挔算:** ポむンタに察しお数倀を足し匕きするず、**「その型のサむズ分」**だけアドレスが移動したす。`int`通垞4バむトのポむンタに `+1` するず、メモリアドレスは4増えたす。 + +```cpp:array_decay.cpp +#include + +int main() { + // Cスタむル配列の宣蚀サむズ固定 + int primes[] = {2, 3, 5, 7}; + + // 配列名 primes は &primes[0] ずほが同じ意味になる + int* ptr = primes; + + std::cout << "先頭芁玠 (*ptr): " << *ptr << std::endl; + + // ポむンタ挔算 + // ptr + 1 は次のint芁玠メモリ䞊で4バむト隣を指す + std::cout << "2番目の芁玠 (*(ptr + 1)): " << *(ptr + 1) << std::endl; + + // 配列添字アクセス primes[2] は、実は *(primes + 2) のシンタックスシュガヌ + std::cout << "3番目の芁玠 (primes[2]): " << primes[2] << std::endl; + std::cout << "3番目の芁玠 (*(primes + 2)): " << *(primes + 2) << std::endl; + + return 0; +} +``` + +```cpp-exec:array_decay.cpp +先頭芁玠 (*ptr): 2 +2番目の芁玠 (*(ptr + 1)): 3 +3番目の芁玠 (primes[2]): 5 +3番目の芁玠 (*(primes + 2)): 5 +``` diff --git a/public/docs/cpp/3-pointers/2-1-decay.md b/public/docs/cpp/3-pointers/2-1-decay.md deleted file mode 100644 index d977b39..0000000 --- a/public/docs/cpp/3-pointers/2-1-decay.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: cpp-pointers-decay -title: 配列名の枛衰Decay -level: 3 ---- - -### 配列名の枛衰Decay - -実は、配列の名前は匏の䞭で䜿うず、**「先頭芁玠ぞのポむンタ」**ずしお扱われたす。これを「枛衰Decay」ず呌びたす。 diff --git a/public/docs/cpp/3-pointers/2-2-arithmetic.md b/public/docs/cpp/3-pointers/2-2-arithmetic.md deleted file mode 100644 index f1b2620..0000000 --- a/public/docs/cpp/3-pointers/2-2-arithmetic.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -id: cpp-pointers-arithmetic -title: ポむンタ挔算 -level: 3 ---- - -### ポむンタ挔算 - -ポむンタに察しお数倀を足し匕きするず、**「その型のサむズ分」**だけアドレスが移動したす。 -`int`通垞4バむトのポむンタに `+1` するず、メモリアドレスは4増えたす。 - -```cpp:array_decay.cpp -#include - -int main() { - // Cスタむル配列の宣蚀サむズ固定 - int primes[] = {2, 3, 5, 7}; - - // 配列名 primes は &primes[0] ずほが同じ意味になる - int* ptr = primes; - - std::cout << "先頭芁玠 (*ptr): " << *ptr << std::endl; - - // ポむンタ挔算 - // ptr + 1 は次のint芁玠メモリ䞊で4バむト隣を指す - std::cout << "2番目の芁玠 (*(ptr + 1)): " << *(ptr + 1) << std::endl; - - // 配列添字アクセス primes[2] は、実は *(primes + 2) のシンタックスシュガヌ - std::cout << "3番目の芁玠 (primes[2]): " << primes[2] << std::endl; - std::cout << "3番目の芁玠 (*(primes + 2)): " << *(primes + 2) << std::endl; - - return 0; -} -``` - -```cpp-exec:array_decay.cpp -先頭芁玠 (*ptr): 2 -2番目の芁玠 (*(ptr + 1)): 3 -3番目の芁玠 (primes[2]): 5 -3番目の芁玠 (*(primes + 2)): 5 -``` diff --git a/public/docs/cpp/3-pointers/3-0-legacy-string.md b/public/docs/cpp/3-pointers/3-0-legacy-string.md index 92ed7ee..6bc86f0 100644 --- a/public/docs/cpp/3-pointers/3-0-legacy-string.md +++ b/public/docs/cpp/3-pointers/3-0-legacy-string.md @@ -1,10 +1,43 @@ --- id: cpp-pointers-legacy-string -title: 文字列の正䜓Legacy +title: 文字列リテラルず char* level: 2 --- -## 文字列の正䜓Legacy +## 文字列リテラルず `char*` `std::string` が登堎する前、文字列は単なる `char` 型の配列でした。これを「Cスタむル文字列」ず呌びたす。 珟圚でも、ラむブラリずの連携などで頻繁に目にしたす。 + +Cスタむル文字列は、文字の䞊びの最埌に「終端文字 `\0`ヌル文字」を眮くこずで終わりを衚したす。 + +```cpp:legacy_string.cpp +#include +#include + +int main() { + // 文字列リテラルは const char 配列 + const char* c_str = "Hello"; + + // std::string から Cスタむル文字列ぞの倉換 + std::string cpp_str = "World"; + const char* converted = cpp_str.c_str(); // .c_str() を䜿う + + std::cout << "C-Style: " << c_str << std::endl; + std::cout << "C++ String: " << cpp_str << std::endl; + std::cout << "Converted to C-Style: " << converted << std::endl; + + // 泚意: c_str は配列なのでサむズ情報を持っおいない + // 終端文字 '\0' たで読み進める必芁がある + + return 0; +} +``` + +```cpp-exec:legacy_string.cpp +C-Style: Hello +C++ String: World +Converted to C-Style: World +``` + +**重芁:** モダンC++では基本的に `std::string` を䜿いたしょう。`char*` は参照甚やAPI互換のために䜿いたす。 diff --git a/public/docs/cpp/3-pointers/3-1-string-literal.md b/public/docs/cpp/3-pointers/3-1-string-literal.md deleted file mode 100644 index f17d041..0000000 --- a/public/docs/cpp/3-pointers/3-1-string-literal.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -id: cpp-pointers-string-literal -title: 文字列リテラルず char* -level: 3 ---- - -### 文字列リテラルず `char*` - -Cスタむル文字列は、文字の䞊びの最埌に「終端文字 `\0`ヌル文字」を眮くこずで終わりを衚したす。 - -```cpp:legacy_string.cpp -#include -#include - -int main() { - // 文字列リテラルは const char 配列 - const char* c_str = "Hello"; - - // std::string から Cスタむル文字列ぞの倉換 - std::string cpp_str = "World"; - const char* converted = cpp_str.c_str(); // .c_str() を䜿う - - std::cout << "C-Style: " << c_str << std::endl; - std::cout << "C++ String: " << cpp_str << std::endl; - std::cout << "Converted to C-Style: " << converted << std::endl; - - // 泚意: c_str は配列なのでサむズ情報を持っおいない - // 終端文字 '\0' たで読み進める必芁がある - - return 0; -} -``` - -```cpp-exec:legacy_string.cpp -C-Style: Hello -C++ String: World -Converted to C-Style: World -``` - -**重芁:** モダンC++では基本的に `std::string` を䜿いたしょう。`char*` は参照甚やAPI互換のために䜿いたす。 diff --git a/public/docs/cpp/3-pointers/4-2-heap.md b/public/docs/cpp/3-pointers/4-2-heap.md index 3d26db0..1230f83 100644 --- a/public/docs/cpp/3-pointers/4-2-heap.md +++ b/public/docs/cpp/3-pointers/4-2-heap.md @@ -1,10 +1,50 @@ --- id: cpp-pointers-heap -title: ヒヌプ (Heap) +title: ヒヌプ (Heap) 領域ず new, delete level: 3 --- -### ヒヌプ (Heap) +### ヒヌプ (Heap) 領域ず `new`, `delete` * プログラマが**手動で確保・解攟**する領域です。 * 広倧なサむズを䜿えたすが、管理を怠るず危険です。 + +ヒヌプ領域を䜿うには `new` 挔算子を䜿甚し、䜿い終わったら必ず `delete` 挔算子でメモリをOSに返华解攟する必芁がありたす。 + +```cpp:heap_memory.cpp +#include + +int main() { + // ヒヌプ䞊に敎数を1぀確保 + int* pInt = new int(10); + + // ヒヌプ䞊に配列を確保 (サむズ100) + // std::vectorを䜿わない堎合、サむズは動的に決められるが管理は手動 + int size = 5; + int* pArray = new int[size]; + + // 配列ぞの曞き蟌み + for(int i = 0; i < size; ++i) { + pArray[i] = i * 10; + } + + std::cout << "ヒヌプ䞊の倀: " << *pInt << std::endl; + std::cout << "ヒヌプ䞊の配列[2]: " << pArray[2] << std::endl; + + // 【重芁】䜿い終わったら必ず解攟する + delete pInt; // 単䜓の解攟 + delete[] pArray; // 配列の解攟 (delete[] を䜿うこず) + + // 解攟埌のアドレスには觊っおはいけないダングリングポむンタ + // 安党のため nullptr にしおおく + pInt = nullptr; + pArray = nullptr; + + return 0; +} +``` + +```cpp-exec:heap_memory.cpp +ヒヌプ䞊の倀: 10 +ヒヌプ䞊の配列[2]: 20 +``` diff --git a/public/docs/cpp/3-pointers/4-3-new-delete.md b/public/docs/cpp/3-pointers/4-3-new-delete.md deleted file mode 100644 index 58f491d..0000000 --- a/public/docs/cpp/3-pointers/4-3-new-delete.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: cpp-pointers-new-delete -title: new ず delete -level: 3 ---- - -### `new` ず `delete` - -ヒヌプ領域を䜿うには `new` 挔算子を䜿甚し、䜿い終わったら必ず `delete` 挔算子でメモリをOSに返华解攟する必芁がありたす。 - -```cpp:heap_memory.cpp -#include - -int main() { - // ヒヌプ䞊に敎数を1぀確保 - int* pInt = new int(10); - - // ヒヌプ䞊に配列を確保 (サむズ100) - // std::vectorを䜿わない堎合、サむズは動的に決められるが管理は手動 - int size = 5; - int* pArray = new int[size]; - - // 配列ぞの曞き蟌み - for(int i = 0; i < size; ++i) { - pArray[i] = i * 10; - } - - std::cout << "ヒヌプ䞊の倀: " << *pInt << std::endl; - std::cout << "ヒヌプ䞊の配列[2]: " << pArray[2] << std::endl; - - // 【重芁】䜿い終わったら必ず解攟する - delete pInt; // 単䜓の解攟 - delete[] pArray; // 配列の解攟 (delete[] を䜿うこず) - - // 解攟埌のアドレスには觊っおはいけないダングリングポむンタ - // 安党のため nullptr にしおおく - pInt = nullptr; - pArray = nullptr; - - return 0; -} -``` - -```cpp-exec:heap_memory.cpp -ヒヌプ䞊の倀: 10 -ヒヌプ䞊の配列[2]: 20 -``` diff --git a/public/docs/cpp/3-pointers/6-0-practice1.md b/public/docs/cpp/3-pointers/5-1-practice1.md similarity index 92% rename from public/docs/cpp/3-pointers/6-0-practice1.md rename to public/docs/cpp/3-pointers/5-1-practice1.md index 78c7e33..feaa4e5 100644 --- a/public/docs/cpp/3-pointers/6-0-practice1.md +++ b/public/docs/cpp/3-pointers/5-1-practice1.md @@ -1,10 +1,10 @@ --- id: cpp-pointers-practice1 title: '緎習問題1: ポむンタによる配列操䜜' -level: 2 +level: 3 --- -## 緎習問題1: ポむンタによる配列操䜜 +### 緎習問題1: ポむンタによる配列操䜜 `int` 型のCスタむル配列 `arr` に぀いお、 `int*` 型のポむンタを䜿っお走査し、**すべおの倀を2倍に曞き換えおください**`[]` 挔算子は䜿わず、ポむンタ挔算 `*` ず `++` たたは `+` を䜿甚するこず。 diff --git a/public/docs/cpp/3-pointers/6-1-practice2.md b/public/docs/cpp/3-pointers/5-2-practice2.md similarity index 100% rename from public/docs/cpp/3-pointers/6-1-practice2.md rename to public/docs/cpp/3-pointers/5-2-practice2.md diff --git a/public/docs/cpp/4-functions/1-0-declaration.md b/public/docs/cpp/4-functions/1-0-basic.md similarity index 93% rename from public/docs/cpp/4-functions/1-0-declaration.md rename to public/docs/cpp/4-functions/1-0-basic.md index 3a73b8d..ae819d4 100644 --- a/public/docs/cpp/4-functions/1-0-declaration.md +++ b/public/docs/cpp/4-functions/1-0-basic.md @@ -1,5 +1,5 @@ --- -id: cpp-functions-declaration +id: cpp-functions-basic title: 関数の宣蚀ず定矩 level: 2 --- diff --git a/public/docs/cpp/4-functions/5-0-practice1.md b/public/docs/cpp/4-functions/4-1-practice1.md similarity index 93% rename from public/docs/cpp/4-functions/5-0-practice1.md rename to public/docs/cpp/4-functions/4-1-practice1.md index 4abf971..92e97ef 100644 --- a/public/docs/cpp/4-functions/5-0-practice1.md +++ b/public/docs/cpp/4-functions/4-1-practice1.md @@ -4,7 +4,7 @@ title: '緎習問題1: 倀の入れ替えSwap' level: 2 --- -## 緎習問題1: 倀の入れ替えSwap +### 緎習問題1: 倀の入れ替えSwap 2぀の `int` 倉数を受け取り、その倀を入れ替える関数 `mySwap` を䜜成しおください。 ポむンタではなく、**参照枡し**を䜿甚しおください。 diff --git a/public/docs/cpp/4-functions/5-1-practice2.md b/public/docs/cpp/4-functions/4-2-practice2.md similarity index 100% rename from public/docs/cpp/4-functions/5-1-practice2.md rename to public/docs/cpp/4-functions/4-2-practice2.md diff --git a/public/docs/cpp/5-project-build/1-0-header-and-source.md b/public/docs/cpp/5-project-build/1-0-header-and-source.md index 2272e04..30458b9 100644 --- a/public/docs/cpp/5-project-build/1-0-header-and-source.md +++ b/public/docs/cpp/5-project-build/1-0-header-and-source.md @@ -10,3 +10,9 @@ C++では、プログラムを**ヘッダファむル**ず**゜ヌスファむ * **ヘッダファむル (`.h` たたは `.hpp`)**: 「宣蚀」を眮く堎所です。クラスの定矩、関数のプロトタむプ宣蚀、定数、テンプレヌトなどを蚘述したす。他のファむルに察しお「䜕ができるかむンタヌフェヌス」を公開する圹割を持ちたす。 * **゜ヌスファむル (`.cpp`)**: 「実装」を眮く堎所です。ヘッダファむルで宣蚀された関数の具䜓的な凊理内容などを蚘述したす。ヘッダファむルが公開したむンタヌフェヌスを「どのように実珟するか」を蚘述する圹割を持ちたす。 + +**なぜ分割するのか 🀔** + +1. **関心の分離**: むンタヌフェヌス䜕ができるかず実装どうやるかを分離するこずで、コヌドの芋通しが良くなりたす。他の開発者はヘッダファむルを芋るだけで、その機胜の䜿い方がわかりたす。 +2. **コンパむル時間の短瞮**: ゜ヌスファむルを倉曎した堎合、再コンパむルはそのファむルだけで枈みたす。プロゞェクト党䜓を再コンパむルする必芁がないため、倧芏暡なプロゞェクトでは開発サむクルが劇的に速くなりたす。 +3. **再利甚性の向䞊**: よく䜿う関数やクラスをたずめおおけば、別のプロゞェクトでそのファむルをむンクルヌドするだけで簡単に再利甚できたす。 diff --git a/public/docs/cpp/5-project-build/1-1-benefit.md b/public/docs/cpp/5-project-build/1-1-benefit.md deleted file mode 100644 index eed8dbf..0000000 --- a/public/docs/cpp/5-project-build/1-1-benefit.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: cpp-project-build-benefit -title: なぜ分割するのか 🀔 -level: 3 ---- - -### なぜ分割するのか 🀔 - -1. **関心の分離**: むンタヌフェヌス䜕ができるかず実装どうやるかを分離するこずで、コヌドの芋通しが良くなりたす。他の開発者はヘッダファむルを芋るだけで、その機胜の䜿い方がわかりたす。 -2. **コンパむル時間の短瞮**: ゜ヌスファむルを倉曎した堎合、再コンパむルはそのファむルだけで枈みたす。プロゞェクト党䜓を再コンパむルする必芁がないため、倧芏暡なプロゞェクトでは開発サむクルが劇的に速くなりたす。 -3. **再利甚性の向䞊**: よく䜿う関数やクラスをたずめおおけば、別のプロゞェクトでそのファむルをむンクルヌドするだけで簡単に再利甚できたす。 diff --git a/public/docs/cpp/7-classes-advanced/2-0-operator-overload.md b/public/docs/cpp/7-classes-advanced/2-0-operator-overload.md index 3f78fe2..388b31e 100644 --- a/public/docs/cpp/7-classes-advanced/2-0-operator-overload.md +++ b/public/docs/cpp/7-classes-advanced/2-0-operator-overload.md @@ -16,3 +16,60 @@ C++では、`+`, `-`, `==`, `<<` などの組み蟌み挔算子を、自䜜の | :--- | :--- | :--- | | 二項挔算子 (`+`, `==` etc.) | `T operator+(const U& rhs);` | `T operator+(const T& lhs, const U& rhs);` | | 単項挔算子 (`-`, `!` etc.) | `T operator-();` | `T operator-(const T& obj);` | + +`Vector2D` クラスで `+`加算、`==`等䟡比范、`<<`ストリヌム出力をオヌバヌロヌドしおみたしょう。 + +```cpp:operator_overloading.cpp +#include + +class Vector2D { +public: + double x, y; + + Vector2D(double x = 0.0, double y = 0.0) : x(x), y(y) {} + + // メンバ関数ずしお + 挔算子をオヌバヌロヌド + Vector2D operator+(const Vector2D& rhs) const { + return Vector2D(this->x + rhs.x, this->y + rhs.y); + } + + // メンバ関数ずしお == 挔算子をオヌバヌロヌド + bool operator==(const Vector2D& rhs) const { + return (this->x == rhs.x) && (this->y == rhs.y); + } +}; + +// 非メンバ関数ずしお << 挔算子をオヌバヌロヌド +// 第1匕数が std::ostream& なので、メンバ関数にはできない +std::ostream& operator<<(std::ostream& os, const Vector2D& v) { + os << "(" << v.x << ", " << v.y << ")"; + return os; +} + +int main() { + Vector2D v1(1.0, 2.0); + Vector2D v2(3.0, 4.0); + + // operator+ が呌ばれる + Vector2D v3 = v1 + v2; + std::cout << "v1: " << v1 << std::endl; // operator<< + std::cout << "v2: " << v2 << std::endl; // operator<< + std::cout << "v3 = v1 + v2: " << v3 << std::endl; // operator<< + + // operator== が呌ばれる + if (v1 == Vector2D(1.0, 2.0)) { + std::cout << "v1 is equal to (1.0, 2.0)" << std::endl; + } + + return 0; +} +``` + +```cpp-exec:operator_overloading.cpp +v1: (1, 2) +v2: (3, 4) +v3 = v1 + v2: (4, 6) +v1 is equal to (1.0, 2.0) +``` + +`operator<<` は、巊蟺のオペランドが `std::ostream` 型`std::cout` などであるため、`Vector2D` のメンバ関数ずしおは定矩できたせん。そのため、非メンバ関数ずしお定矩するのが䞀般的です。 diff --git a/public/docs/cpp/7-classes-advanced/2-1-operator-overload-example.md b/public/docs/cpp/7-classes-advanced/2-1-operator-overload-example.md deleted file mode 100644 index 0f82342..0000000 --- a/public/docs/cpp/7-classes-advanced/2-1-operator-overload-example.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -id: cpp-classes-advanced-operator-overload-example -title: 実装䟋 -level: 3 ---- - -### 実装䟋 - -`Vector2D` クラスで `+`加算、`==`等䟡比范、`<<`ストリヌム出力をオヌバヌロヌドしおみたしょう。 - -```cpp:operator_overloading.cpp -#include - -class Vector2D { -public: - double x, y; - - Vector2D(double x = 0.0, double y = 0.0) : x(x), y(y) {} - - // メンバ関数ずしお + 挔算子をオヌバヌロヌド - Vector2D operator+(const Vector2D& rhs) const { - return Vector2D(this->x + rhs.x, this->y + rhs.y); - } - - // メンバ関数ずしお == 挔算子をオヌバヌロヌド - bool operator==(const Vector2D& rhs) const { - return (this->x == rhs.x) && (this->y == rhs.y); - } -}; - -// 非メンバ関数ずしお << 挔算子をオヌバヌロヌド -// 第1匕数が std::ostream& なので、メンバ関数にはできない -std::ostream& operator<<(std::ostream& os, const Vector2D& v) { - os << "(" << v.x << ", " << v.y << ")"; - return os; -} - -int main() { - Vector2D v1(1.0, 2.0); - Vector2D v2(3.0, 4.0); - - // operator+ が呌ばれる - Vector2D v3 = v1 + v2; - std::cout << "v1: " << v1 << std::endl; // operator<< - std::cout << "v2: " << v2 << std::endl; // operator<< - std::cout << "v3 = v1 + v2: " << v3 << std::endl; // operator<< - - // operator== が呌ばれる - if (v1 == Vector2D(1.0, 2.0)) { - std::cout << "v1 is equal to (1.0, 2.0)" << std::endl; - } - - return 0; -} -``` - -```cpp-exec:operator_overloading.cpp -v1: (1, 2) -v2: (3, 4) -v3 = v1 + v2: (4, 6) -v1 is equal to (1.0, 2.0) -``` - -`operator<<` は、巊蟺のオペランドが `std::ostream` 型`std::cout` などであるため、`Vector2D` のメンバ関数ずしおは定矩できたせん。そのため、非メンバ関数ずしお定矩するのが䞀般的です。 diff --git a/public/docs/cpp/7-classes-advanced/3-0-static-member.md b/public/docs/cpp/7-classes-advanced/3-0-static-member.md index cc2f071..6679247 100644 --- a/public/docs/cpp/7-classes-advanced/3-0-static-member.md +++ b/public/docs/cpp/7-classes-advanced/3-0-static-member.md @@ -7,3 +7,82 @@ level: 2 ## staticメンバ 通垞、クラスのメンバ倉数はオブゞェクトごずに個別のメモリ領域を持ちたす。しかし、あるクラスの**党おのオブゞェクトで共有したい**情報もありたす。䟋えば、「これたでに生成されたオブゞェクトの総数」などです。このような堎合、**staticメンバ**を䜿甚したす。 + +`static` キヌワヌドを付けお宣蚀されたメンバ倉数は、特定のオブゞェクトに属さず、クラスそのものに属したす。そのため、党オブゞェクトでただ1぀の実䜓を共有したす。これを**クラス倉数**ず呌ぶこずもありたす。 + + * **宣蚀**: クラス定矩の䞭で `static` を付けお行いたす。 + * **定矩**: クラス定矩の倖゜ヌスファむルで、メモリ䞊の実䜓を確保し、初期化したす。 + +`static` キヌワヌドを付けお宣蚀されたメンバ関数は、特定のオブゞェクトに䟝存せずに呌び出せたす。そのため、`this` ポむンタ埌述を持ちたせん。 + + * **アクセス**: staticメンバ倉数や他のstaticメンバ関数にはアクセスできたすが、非staticなメンバむンスタンスごずのメンバ倉数やメンバ関数にはアクセスできたせん。 + * **呌び出し**: `クラス名::関数名()` のように、オブゞェクトを生成しなくおも呌び出せたす。 + +ゲヌムに登堎する `Player` クラスがあり、珟圚䜕人のプレむダヌが存圚するかを管理する䟋を芋おみたしょう。 + +```cpp:static_members.cpp +#include +#include + +class Player { +private: + std::string name; + // (1) staticメンバ倉数の宣蚀 + static int playerCount; + +public: + Player(const std::string& name) : name(name) { + playerCount++; // オブゞェクトが生成されるたびにむンクリメント + std::cout << name << " がゲヌムに参加したした。珟圚のプレむダヌ数: " << playerCount << std::endl; + } + + ~Player() { + playerCount--; // オブゞェクトが砎棄されるたびにデクリメント + std::cout << name << " がゲヌムから退出したした。珟圚のプレむダヌ数: " << playerCount << std::endl; + } + + // (2) staticメンバ関数の宣蚀 + static int getPlayerCount() { + // name などの非staticメンバにはアクセスできない + return playerCount; + } +}; + +// (3) staticメンバ倉数の定矩ず初期化 +int Player::playerCount = 0; + +int main() { + // オブゞェクトがなくおもstaticメンバ関数を呌び出せる + std::cout << "ゲヌム開始時のプレむダヌ数: " << Player::getPlayerCount() << std::endl; + std::cout << "---" << std::endl; + + Player p1("Alice"); + Player p2("Bob"); + + { + Player p3("Charlie"); + std::cout << "珟圚のプレむダヌ数 (p1経由): " << p1.getPlayerCount() << std::endl; + } // p3のスコヌプが終わり、デストラクタが呌ばれる + + std::cout << "---" << std::endl; + std::cout << "ゲヌム終了時のプレむダヌ数: " << Player::getPlayerCount() << std::endl; + + return 0; +} +``` + +```cpp-exec:static_members.cpp +ゲヌム開始時のプレむダヌ数: 0 +--- +Alice がゲヌムに参加したした。珟圚のプレむダヌ数: 1 +Bob がゲヌムに参加したした。珟圚のプレむダヌ数: 2 +Charlie がゲヌムに参加したした。珟圚のプレむダヌ数: 3 +珟圚のプレむダヌ数 (p1経由): 3 +Charlie がゲヌムから退出したした。珟圚のプレむダヌ数: 2 +--- +ゲヌム終了時のプレむダヌ数: 2 +Alice がゲヌムから退出したした。珟圚のプレむダヌ数: 1 +Bob がゲヌムから退出したした。珟圚のプレむダヌ数: 0 +``` + +`playerCount` は `p1`, `p2`, `p3` の党おで共有されおおり、䞀぀の倀が曎新されおいるこずがわかりたす。 diff --git a/public/docs/cpp/7-classes-advanced/3-1-static-member-var.md b/public/docs/cpp/7-classes-advanced/3-1-static-member-var.md deleted file mode 100644 index 31a208f..0000000 --- a/public/docs/cpp/7-classes-advanced/3-1-static-member-var.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: cpp-classes-advanced-static-member-var -title: staticメンバ倉数 -level: 3 ---- - -### staticメンバ倉数 - -`static` キヌワヌドを付けお宣蚀されたメンバ倉数は、特定のオブゞェクトに属さず、クラスそのものに属したす。そのため、党オブゞェクトでただ1぀の実䜓を共有したす。これを**クラス倉数**ず呌ぶこずもありたす。 - - * **宣蚀**: クラス定矩の䞭で `static` を付けお行いたす。 - * **定矩**: クラス定矩の倖゜ヌスファむルで、メモリ䞊の実䜓を確保し、初期化したす。 diff --git a/public/docs/cpp/7-classes-advanced/3-2-static-member-func.md b/public/docs/cpp/7-classes-advanced/3-2-static-member-func.md deleted file mode 100644 index fba38fa..0000000 --- a/public/docs/cpp/7-classes-advanced/3-2-static-member-func.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: cpp-classes-advanced-static-member-func -title: staticメンバ関数 -level: 3 ---- - -### staticメンバ関数 - -`static` キヌワヌドを付けお宣蚀されたメンバ関数は、特定のオブゞェクトに䟝存せずに呌び出せたす。そのため、`this` ポむンタ埌述を持ちたせん。 - - * **アクセス**: staticメンバ倉数や他のstaticメンバ関数にはアクセスできたすが、非staticなメンバむンスタンスごずのメンバ倉数やメンバ関数にはアクセスできたせん。 - * **呌び出し**: `クラス名::関数名()` のように、オブゞェクトを生成しなくおも呌び出せたす。 diff --git a/public/docs/cpp/7-classes-advanced/3-3-static-member-example.md b/public/docs/cpp/7-classes-advanced/3-3-static-member-example.md deleted file mode 100644 index e3f274e..0000000 --- a/public/docs/cpp/7-classes-advanced/3-3-static-member-example.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -id: cpp-classes-advanced-static-member-example -title: 実装䟋 -level: 3 ---- - -### 実装䟋 - -ゲヌムに登堎する `Player` クラスがあり、珟圚䜕人のプレむダヌが存圚するかを管理する䟋を芋おみたしょう。 - -```cpp:static_members.cpp -#include -#include - -class Player { -private: - std::string name; - // (1) staticメンバ倉数の宣蚀 - static int playerCount; - -public: - Player(const std::string& name) : name(name) { - playerCount++; // オブゞェクトが生成されるたびにむンクリメント - std::cout << name << " がゲヌムに参加したした。珟圚のプレむダヌ数: " << playerCount << std::endl; - } - - ~Player() { - playerCount--; // オブゞェクトが砎棄されるたびにデクリメント - std::cout << name << " がゲヌムから退出したした。珟圚のプレむダヌ数: " << playerCount << std::endl; - } - - // (2) staticメンバ関数の宣蚀 - static int getPlayerCount() { - // name などの非staticメンバにはアクセスできない - return playerCount; - } -}; - -// (3) staticメンバ倉数の定矩ず初期化 -int Player::playerCount = 0; - -int main() { - // オブゞェクトがなくおもstaticメンバ関数を呌び出せる - std::cout << "ゲヌム開始時のプレむダヌ数: " << Player::getPlayerCount() << std::endl; - std::cout << "---" << std::endl; - - Player p1("Alice"); - Player p2("Bob"); - - { - Player p3("Charlie"); - std::cout << "珟圚のプレむダヌ数 (p1経由): " << p1.getPlayerCount() << std::endl; - } // p3のスコヌプが終わり、デストラクタが呌ばれる - - std::cout << "---" << std::endl; - std::cout << "ゲヌム終了時のプレむダヌ数: " << Player::getPlayerCount() << std::endl; - - return 0; -} -``` - -```cpp-exec:static_members.cpp -ゲヌム開始時のプレむダヌ数: 0 ---- -Alice がゲヌムに参加したした。珟圚のプレむダヌ数: 1 -Bob がゲヌムに参加したした。珟圚のプレむダヌ数: 2 -Charlie がゲヌムに参加したした。珟圚のプレむダヌ数: 3 -珟圚のプレむダヌ数 (p1経由): 3 -Charlie がゲヌムから退出したした。珟圚のプレむダヌ数: 2 ---- -ゲヌム終了時のプレむダヌ数: 2 -Alice がゲヌムから退出したした。珟圚のプレむダヌ数: 1 -Bob がゲヌムから退出したした。珟圚のプレむダヌ数: 0 -``` - -`playerCount` は `p1`, `p2`, `p3` の党おで共有されおおり、䞀぀の倀が曎新されおいるこずがわかりたす。 diff --git a/public/docs/cpp/7-classes-advanced/4-0-this.md b/public/docs/cpp/7-classes-advanced/4-0-this.md index c53c937..70f77c1 100644 --- a/public/docs/cpp/7-classes-advanced/4-0-this.md +++ b/public/docs/cpp/7-classes-advanced/4-0-this.md @@ -23,3 +23,49 @@ level: 2 2. **自分自身の参照やポむンタを返す堎合** コピヌ代入挔算子で `return *this;` ずしたように、オブゞェクト自身を返したい堎合に䜿いたす。これにより、**メ゜ッドチェヌン**`obj.setX(10).setY(20);` のような連続したメ゜ッド呌び出しが可胜になりたす。 + +メ゜ッドチェヌンを実珟する簡単な䟋を芋おみたしょう。 + +```cpp:this_pointer.cpp +#include + +class Point { +private: + int x, y; + +public: + Point(int x = 0, int y = 0) : x(x), y(y) {} + + // 自身の参照を返すこずで、メ゜ッドチェヌンを可胜にする + Point& setX(int newX) { + this->x = newX; + return *this; // 自分自身の参照を返す + } + + Point& setY(int newY) { + this->y = newY; + return *this; // 自分自身の参照を返す + } + + void print() const { + std::cout << "(" << this->x << ", " << this->y << ")" << std::endl; + } +}; + +int main() { + Point p; + + // メ゜ッドチェヌン + p.setX(10).setY(20); + + p.print(); + + return 0; +} +``` + +```cpp-exec:this_pointer.cpp +(10, 20) +``` + +`setX` が `p` 自身の参照を返すため、その返り倀に察しお続けお `.setY(20)` を呌び出すこずができたす。 diff --git a/public/docs/cpp/7-classes-advanced/4-1-this-example.md b/public/docs/cpp/7-classes-advanced/4-1-this-example.md deleted file mode 100644 index c705929..0000000 --- a/public/docs/cpp/7-classes-advanced/4-1-this-example.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -id: cpp-classes-advanced-this-example -title: 実装䟋 -level: 3 ---- - -### 実装䟋 - -メ゜ッドチェヌンを実珟する簡単な䟋を芋おみたしょう。 - -```cpp:this_pointer.cpp -#include - -class Point { -private: - int x, y; - -public: - Point(int x = 0, int y = 0) : x(x), y(y) {} - - // 自身の参照を返すこずで、メ゜ッドチェヌンを可胜にする - Point& setX(int newX) { - this->x = newX; - return *this; // 自分自身の参照を返す - } - - Point& setY(int newY) { - this->y = newY; - return *this; // 自分自身の参照を返す - } - - void print() const { - std::cout << "(" << this->x << ", " << this->y << ")" << std::endl; - } -}; - -int main() { - Point p; - - // メ゜ッドチェヌン - p.setX(10).setY(20); - - p.print(); - - return 0; -} -``` - -```cpp-exec:this_pointer.cpp -(10, 20) -``` - -`setX` が `p` 自身の参照を返すため、その返り倀に察しお続けお `.setY(20)` を呌び出すこずができたす。 From 155e83318160107d28b90a219251c743f48c36d6 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:27:50 +0900 Subject: [PATCH 05/25] =?UTF-8?q?js=E3=81=AE=E5=85=A8=E3=82=BB=E3=82=AF?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=ABslug=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E3=80=81js-repl=E3=81=AEid=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0-intro/{0-javascript.md => 1-0-about.md} | 2 +- .../{1-vs-nodejs.md => 2-0-environment.md} | 2 +- .../0-intro/{2.md => 3-0-comparison.md} | 2 +- .../{3-hello-world.md => 4-0-helloworld.md} | 2 +- ...pl-read-eval-print-loop.md => 4-1-repl.md} | 4 +- .../0-intro/{5.md => 4-2-run-source.md} | 2 +- .../0-intro/{6.md => 4-3-browser.md} | 2 +- .../javascript/1-basics/0-let-const-var.md | 10 --- .../1-basics/{2-var.md => 1-0-variable.md} | 17 +++- .../docs/javascript/1-basics/1-const-let.md | 12 --- public/docs/javascript/1-basics/10.md | 9 -- public/docs/javascript/1-basics/12-falsy.md | 43 --------- .../1-basics/{3.md => 2-0-primitive-type.md} | 2 +- ...ull-undefined.md => 2-1-null-undefined.md} | 4 +- public/docs/javascript/1-basics/3-0-object.md | 15 ++++ .../{6-const.md => 3-1-const-object.md} | 8 +- .../docs/javascript/1-basics/4-0-equality.md | 28 ++++++ .../1-basics/{11.md => 5-1-add-operator.md} | 12 +-- public/docs/javascript/1-basics/5.md | 9 -- .../1-basics/{13.md => 6-0-summary.md} | 3 +- .../1-basics/{14.md => 6-1-practice1.md} | 2 +- .../1-basics/{15.md => 6-2-practice2.md} | 2 +- public/docs/javascript/1-basics/7.md | 9 -- public/docs/javascript/1-basics/8.md | 9 -- public/docs/javascript/1-basics/9.md | 22 ----- .../docs/javascript/2-control/0-if-switch.md | 7 -- .../{1-iftruthy-falsy.md => 1-1-if-truthy.md} | 8 +- .../2-control/{2-switch.md => 1-2-switch.md} | 6 +- .../2-control/10-trycatchfinally.md | 9 -- .../2-control/{3-for-while.md => 2-0-loop.md} | 2 +- .../2-control/{4-for.md => 2-1-for.md} | 4 +- .../2-control/{5-while.md => 2-2-while.md} | 4 +- .../javascript/2-control/3-0-iteration.md | 14 +++ .../2-control/{7-forin.md => 3-1-for-in.md} | 4 +- .../2-control/{8-forof.md => 3-2-for-of.md} | 13 ++- .../2-control/{11.md => 4-0-try-catch.md} | 10 ++- .../2-control/{12-throw.md => 4-2-throw.md} | 6 +- .../2-control/{13.md => 5-0-summary.md} | 2 +- .../2-control/{14.md => 5-1-practice1.md} | 2 +- .../2-control/{15.md => 5-2-practice2.md} | 2 +- .../javascript/2-control/6-forof-forin.md | 9 -- public/docs/javascript/2-control/9.md | 21 ----- .../{0.md => 1-0-function.md} | 2 +- ...aration.md => 1-1-function-declaration.md} | 2 +- ...pression.md => 1-2-function-expression.md} | 2 +- .../javascript/3-functions-closures/10.md | 12 --- .../javascript/3-functions-closures/11.md | 39 -------- .../javascript/3-functions-closures/12.md | 11 --- .../2-0-arrow-function.md | 29 ++++++ .../{5.md => 2-2-arrow-function-simple.md} | 4 +- .../{6-rest.md => 3-0-argument.md} | 2 +- .../{7.md => 3-1-default-arg.md} | 2 +- .../{8-rest.md => 3-2-rest-arg.md} | 2 +- .../docs/javascript/3-functions-closures/3.md | 9 -- .../{9.md => 4-0-scope-chain.md} | 2 +- .../docs/javascript/3-functions-closures/4.md | 27 ------ .../3-functions-closures/5-0-closure.md | 50 +++++++++++ .../{13.md => 6-0-summary.md} | 2 +- .../{14.md => 6-1-practice1.md} | 6 +- .../{15.md => 6-2-practice2.md} | 2 +- public/docs/javascript/4-this/0-this.md | 11 --- .../docs/javascript/4-this/1-0-this-basic.md | 50 +++++++++++ public/docs/javascript/4-this/1.md | 9 -- ...s-bind-call-apply.md => 2-0-bind-basic.md} | 6 +- .../{5-call-apply.md => 2-1-call-apply.md} | 4 +- .../4-this/{6-bind.md => 2-2-bind.md} | 2 +- public/docs/javascript/4-this/2.md | 10 --- .../docs/javascript/4-this/3-0-arrow-func.md | 58 ++++++++++++ public/docs/javascript/4-this/3.md | 43 --------- public/docs/javascript/4-this/4-0-summary.md | 16 ++++ .../docs/javascript/4-this/4-1-practice1.md | 33 +++++++ .../4-this/{9.md => 4-2-practice2.md} | 2 +- public/docs/javascript/4-this/7-this.md | 13 --- public/docs/javascript/4-this/8.md | 90 ------------------- .../{0.md => 1-0-obj-literal.md} | 4 +- .../{1.md => 1-1-properties.md} | 4 +- .../{2-this.md => 2-0-method-this-recall.md} | 4 +- .../{3.md => 3-0-prototype-basic.md} | 2 +- ...etprototypeof.md => 3-1-getprototypeof.md} | 4 +- .../{5.md => 4-0-prototype-chain.md} | 2 +- ...ctcreate.md => 5-0-object-create-basic.md} | 2 +- ...7-objectcreate.md => 5-1-object-create.md} | 4 +- .../{8-new.md => 5-2-new-constructor.md} | 2 +- .../{9.md => 6-0-summary.md} | 2 +- .../{10.md => 6-1-practice1.md} | 6 +- .../{11.md => 6-2-practice2.md} | 2 +- .../{0.md => 1-0-class-constructor.md} | 4 +- .../6-classes/{1.md => 1-1-class-expr.md} | 4 +- .../6-classes/{2.md => 2-0-method.md} | 2 +- ...-extends-super.md => 3-0-extends-super.md} | 4 +- .../{4-static.md => 4-0-static-private.md} | 2 +- .../docs/javascript/6-classes/4-1-static.md | 46 ++++++++++ .../6-classes/{6.md => 4-2-private.md} | 6 +- .../6-classes/{7.md => 5-0-summary.md} | 2 +- .../{8-1-rpg.md => 5-1-practice1.md} | 2 +- .../6-classes/{9.md => 5-2-practice2.md} | 2 +- public/docs/javascript/6-classes/5-static.md | 9 -- public/docs/javascript/7-arrays/0.md | 10 --- .../javascript/7-arrays/1-0-array-literal.md | 36 ++++++++ .../{2-splice.md => 1-2-array-splice.md} | 6 +- public/docs/javascript/7-arrays/1-repl.md | 33 ------- .../{3.md => 2-0-spread-destructure-basic.md} | 2 +- .../7-arrays/{4.md => 2-1-spread.md} | 6 +- .../7-arrays/{5.md => 2-2-destructuring.md} | 4 +- .../{6.md => 3-0-higher-order-func.md} | 2 +- ...find-some-every.md => 4-0-other-method.md} | 6 +- .../7-arrays/{8.md => 5-0-summary.md} | 2 +- .../7-arrays/{9.md => 5-1-practice1.md} | 2 +- .../7-arrays/{10.md => 5-2-practice2.md} | 2 +- .../8-promise/{0.md => 1-0-sync-vs-async.md} | 2 +- .../8-promise/{1.md => 2-0-event-callback.md} | 2 +- .../8-promise/{2.md => 3-0-callback-hell.md} | 2 +- .../{3-promise.md => 4-0-promise-basic.md} | 2 +- .../{4-promise.md => 5-0-promise-usage.md} | 2 +- .../{5-promise.md => 5-1-promise-create.md} | 4 +- ...catch-finally.md => 5-2-promise-method.md} | 4 +- .../8-promise/{7.md => 6-0-summary.md} | 2 +- .../8-promise/{9.md => 7-1-practice1.md} | 6 +- .../8-promise/{10.md => 7-2-practice2.md} | 6 +- public/docs/javascript/8-promise/8.md | 7 -- .../{0-asyncawait.md => 1-0-async-await.md} | 2 +- .../{1-async.md => 1-1-async.md} | 4 +- .../{2-await.md => 1-2-await.md} | 4 +- public/docs/javascript/9-async-await/11.md | 7 -- .../{3-trycatch.md => 2-0-try-catch.md} | 4 +- .../{4-fetch-api-http.md => 3-0-fetch.md} | 2 +- .../{5-json-post.md => 3-1-fetch-post.md} | 4 +- ...promiserace.md => 4-0-promise-all-race.md} | 4 +- .../9-async-await/{7.md => 4-1-sequential.md} | 2 +- .../{8-promiseall.md => 4-2-promise-all.md} | 4 +- .../{9-promiserace.md => 4-3-promise-race.md} | 6 +- .../9-async-await/{10.md => 5-0-summary.md} | 2 +- .../9-async-await/{12.md => 6-1-practice1.md} | 6 +- .../{13-2-fetch.md => 6-2-practice2.md} | 6 +- sluginput.js | 7 +- 135 files changed, 560 insertions(+), 682 deletions(-) rename public/docs/javascript/0-intro/{0-javascript.md => 1-0-about.md} (97%) rename public/docs/javascript/0-intro/{1-vs-nodejs.md => 2-0-environment.md} (97%) rename public/docs/javascript/0-intro/{2.md => 3-0-comparison.md} (97%) rename public/docs/javascript/0-intro/{3-hello-world.md => 4-0-helloworld.md} (82%) rename public/docs/javascript/0-intro/{4-repl-read-eval-print-loop.md => 4-1-repl.md} (93%) rename public/docs/javascript/0-intro/{5.md => 4-2-run-source.md} (95%) rename public/docs/javascript/0-intro/{6.md => 4-3-browser.md} (95%) delete mode 100644 public/docs/javascript/1-basics/0-let-const-var.md rename public/docs/javascript/1-basics/{2-var.md => 1-0-variable.md} (55%) delete mode 100644 public/docs/javascript/1-basics/1-const-let.md delete mode 100644 public/docs/javascript/1-basics/10.md delete mode 100644 public/docs/javascript/1-basics/12-falsy.md rename public/docs/javascript/1-basics/{3.md => 2-0-primitive-type.md} (97%) rename public/docs/javascript/1-basics/{4-null-undefined.md => 2-1-null-undefined.md} (92%) create mode 100644 public/docs/javascript/1-basics/3-0-object.md rename public/docs/javascript/1-basics/{6-const.md => 3-1-const-object.md} (70%) create mode 100644 public/docs/javascript/1-basics/4-0-equality.md rename public/docs/javascript/1-basics/{11.md => 5-1-add-operator.md} (63%) delete mode 100644 public/docs/javascript/1-basics/5.md rename public/docs/javascript/1-basics/{13.md => 6-0-summary.md} (79%) rename public/docs/javascript/1-basics/{14.md => 6-1-practice1.md} (96%) rename public/docs/javascript/1-basics/{15.md => 6-2-practice2.md} (96%) delete mode 100644 public/docs/javascript/1-basics/7.md delete mode 100644 public/docs/javascript/1-basics/8.md delete mode 100644 public/docs/javascript/1-basics/9.md delete mode 100644 public/docs/javascript/2-control/0-if-switch.md rename public/docs/javascript/2-control/{1-iftruthy-falsy.md => 1-1-if-truthy.md} (92%) rename public/docs/javascript/2-control/{2-switch.md => 1-2-switch.md} (91%) delete mode 100644 public/docs/javascript/2-control/10-trycatchfinally.md rename public/docs/javascript/2-control/{3-for-while.md => 2-0-loop.md} (84%) rename public/docs/javascript/2-control/{4-for.md => 2-1-for.md} (77%) rename public/docs/javascript/2-control/{5-while.md => 2-2-while.md} (75%) create mode 100644 public/docs/javascript/2-control/3-0-iteration.md rename public/docs/javascript/2-control/{7-forin.md => 3-1-for-in.md} (92%) rename public/docs/javascript/2-control/{8-forof.md => 3-2-for-of.md} (64%) rename public/docs/javascript/2-control/{11.md => 4-0-try-catch.md} (80%) rename public/docs/javascript/2-control/{12-throw.md => 4-2-throw.md} (90%) rename public/docs/javascript/2-control/{13.md => 5-0-summary.md} (95%) rename public/docs/javascript/2-control/{14.md => 5-1-practice1.md} (94%) rename public/docs/javascript/2-control/{15.md => 5-2-practice2.md} (96%) delete mode 100644 public/docs/javascript/2-control/6-forof-forin.md delete mode 100644 public/docs/javascript/2-control/9.md rename public/docs/javascript/3-functions-closures/{0.md => 1-0-function.md} (90%) rename public/docs/javascript/3-functions-closures/{1-function-declaration.md => 1-1-function-declaration.md} (89%) rename public/docs/javascript/3-functions-closures/{2-function-expression.md => 1-2-function-expression.md} (92%) delete mode 100644 public/docs/javascript/3-functions-closures/10.md delete mode 100644 public/docs/javascript/3-functions-closures/11.md delete mode 100644 public/docs/javascript/3-functions-closures/12.md create mode 100644 public/docs/javascript/3-functions-closures/2-0-arrow-function.md rename public/docs/javascript/3-functions-closures/{5.md => 2-2-arrow-function-simple.md} (94%) rename public/docs/javascript/3-functions-closures/{6-rest.md => 3-0-argument.md} (84%) rename public/docs/javascript/3-functions-closures/{7.md => 3-1-default-arg.md} (94%) rename public/docs/javascript/3-functions-closures/{8-rest.md => 3-2-rest-arg.md} (94%) delete mode 100644 public/docs/javascript/3-functions-closures/3.md rename public/docs/javascript/3-functions-closures/{9.md => 4-0-scope-chain.md} (96%) delete mode 100644 public/docs/javascript/3-functions-closures/4.md create mode 100644 public/docs/javascript/3-functions-closures/5-0-closure.md rename public/docs/javascript/3-functions-closures/{13.md => 6-0-summary.md} (94%) rename public/docs/javascript/3-functions-closures/{14.md => 6-1-practice1.md} (78%) rename public/docs/javascript/3-functions-closures/{15.md => 6-2-practice2.md} (92%) delete mode 100644 public/docs/javascript/4-this/0-this.md create mode 100644 public/docs/javascript/4-this/1-0-this-basic.md delete mode 100644 public/docs/javascript/4-this/1.md rename public/docs/javascript/4-this/{4-this-bind-call-apply.md => 2-0-bind-basic.md} (63%) rename public/docs/javascript/4-this/{5-call-apply.md => 2-1-call-apply.md} (93%) rename public/docs/javascript/4-this/{6-bind.md => 2-2-bind.md} (96%) delete mode 100644 public/docs/javascript/4-this/2.md create mode 100644 public/docs/javascript/4-this/3-0-arrow-func.md delete mode 100644 public/docs/javascript/4-this/3.md create mode 100644 public/docs/javascript/4-this/4-0-summary.md create mode 100644 public/docs/javascript/4-this/4-1-practice1.md rename public/docs/javascript/4-this/{9.md => 4-2-practice2.md} (96%) delete mode 100644 public/docs/javascript/4-this/7-this.md delete mode 100644 public/docs/javascript/4-this/8.md rename public/docs/javascript/5-objects-prototype/{0.md => 1-0-obj-literal.md} (94%) rename public/docs/javascript/5-objects-prototype/{1.md => 1-1-properties.md} (88%) rename public/docs/javascript/5-objects-prototype/{2-this.md => 2-0-method-this-recall.md} (93%) rename public/docs/javascript/5-objects-prototype/{3.md => 3-0-prototype-basic.md} (94%) rename public/docs/javascript/5-objects-prototype/{4-proto-objectgetprototypeof.md => 3-1-getprototypeof.md} (91%) rename public/docs/javascript/5-objects-prototype/{5.md => 4-0-prototype-chain.md} (98%) rename public/docs/javascript/5-objects-prototype/{6-objectcreate.md => 5-0-object-create-basic.md} (87%) rename public/docs/javascript/5-objects-prototype/{7-objectcreate.md => 5-1-object-create.md} (85%) rename public/docs/javascript/5-objects-prototype/{8-new.md => 5-2-new-constructor.md} (97%) rename public/docs/javascript/5-objects-prototype/{9.md => 6-0-summary.md} (94%) rename public/docs/javascript/5-objects-prototype/{10.md => 6-1-practice1.md} (86%) rename public/docs/javascript/5-objects-prototype/{11.md => 6-2-practice2.md} (93%) rename public/docs/javascript/6-classes/{0.md => 1-0-class-constructor.md} (93%) rename public/docs/javascript/6-classes/{1.md => 1-1-class-expr.md} (89%) rename public/docs/javascript/6-classes/{2.md => 2-0-method.md} (98%) rename public/docs/javascript/6-classes/{3-extends-super.md => 3-0-extends-super.md} (94%) rename public/docs/javascript/6-classes/{4-static.md => 4-0-static-private.md} (81%) create mode 100644 public/docs/javascript/6-classes/4-1-static.md rename public/docs/javascript/6-classes/{6.md => 4-2-private.md} (93%) rename public/docs/javascript/6-classes/{7.md => 5-0-summary.md} (96%) rename public/docs/javascript/6-classes/{8-1-rpg.md => 5-1-practice1.md} (95%) rename public/docs/javascript/6-classes/{9.md => 5-2-practice2.md} (95%) delete mode 100644 public/docs/javascript/6-classes/5-static.md delete mode 100644 public/docs/javascript/7-arrays/0.md create mode 100644 public/docs/javascript/7-arrays/1-0-array-literal.md rename public/docs/javascript/7-arrays/{2-splice.md => 1-2-array-splice.md} (84%) delete mode 100644 public/docs/javascript/7-arrays/1-repl.md rename public/docs/javascript/7-arrays/{3.md => 2-0-spread-destructure-basic.md} (89%) rename public/docs/javascript/7-arrays/{4.md => 2-1-spread.md} (70%) rename public/docs/javascript/7-arrays/{5.md => 2-2-destructuring.md} (93%) rename public/docs/javascript/7-arrays/{6.md => 3-0-higher-order-func.md} (98%) rename public/docs/javascript/7-arrays/{7-find-some-every.md => 4-0-other-method.md} (91%) rename public/docs/javascript/7-arrays/{8.md => 5-0-summary.md} (96%) rename public/docs/javascript/7-arrays/{9.md => 5-1-practice1.md} (94%) rename public/docs/javascript/7-arrays/{10.md => 5-2-practice2.md} (95%) rename public/docs/javascript/8-promise/{0.md => 1-0-sync-vs-async.md} (97%) rename public/docs/javascript/8-promise/{1.md => 2-0-event-callback.md} (97%) rename public/docs/javascript/8-promise/{2.md => 3-0-callback-hell.md} (96%) rename public/docs/javascript/8-promise/{3-promise.md => 4-0-promise-basic.md} (96%) rename public/docs/javascript/8-promise/{4-promise.md => 5-0-promise-usage.md} (67%) rename public/docs/javascript/8-promise/{5-promise.md => 5-1-promise-create.md} (91%) rename public/docs/javascript/8-promise/{6-then-catch-finally.md => 5-2-promise-method.md} (95%) rename public/docs/javascript/8-promise/{7.md => 6-0-summary.md} (96%) rename public/docs/javascript/8-promise/{9.md => 7-1-practice1.md} (74%) rename public/docs/javascript/8-promise/{10.md => 7-2-practice2.md} (80%) delete mode 100644 public/docs/javascript/8-promise/8.md rename public/docs/javascript/9-async-await/{0-asyncawait.md => 1-0-async-await.md} (89%) rename public/docs/javascript/9-async-await/{1-async.md => 1-1-async.md} (92%) rename public/docs/javascript/9-async-await/{2-await.md => 1-2-await.md} (94%) delete mode 100644 public/docs/javascript/9-async-await/11.md rename public/docs/javascript/9-async-await/{3-trycatch.md => 2-0-try-catch.md} (94%) rename public/docs/javascript/9-async-await/{4-fetch-api-http.md => 3-0-fetch.md} (97%) rename public/docs/javascript/9-async-await/{5-json-post.md => 3-1-fetch-post.md} (90%) rename public/docs/javascript/9-async-await/{6-promiseall-promiserace.md => 4-0-promise-all-race.md} (80%) rename public/docs/javascript/9-async-await/{7.md => 4-1-sequential.md} (85%) rename public/docs/javascript/9-async-await/{8-promiseall.md => 4-2-promise-all.md} (92%) rename public/docs/javascript/9-async-await/{9-promiserace.md => 4-3-promise-race.md} (84%) rename public/docs/javascript/9-async-await/{10.md => 5-0-summary.md} (95%) rename public/docs/javascript/9-async-await/{12.md => 6-1-practice1.md} (82%) rename public/docs/javascript/9-async-await/{13-2-fetch.md => 6-2-practice2.md} (75%) diff --git a/public/docs/javascript/0-intro/0-javascript.md b/public/docs/javascript/0-intro/1-0-about.md similarity index 97% rename from public/docs/javascript/0-intro/0-javascript.md rename to public/docs/javascript/0-intro/1-0-about.md index 32548a5..b3c7060 100644 --- a/public/docs/javascript/0-intro/0-javascript.md +++ b/public/docs/javascript/0-intro/1-0-about.md @@ -1,5 +1,5 @@ --- -id: javascript-intro-0-javascript +id: javascript-intro-about title: JavaScriptずは level: 2 --- diff --git a/public/docs/javascript/0-intro/1-vs-nodejs.md b/public/docs/javascript/0-intro/2-0-environment.md similarity index 97% rename from public/docs/javascript/0-intro/1-vs-nodejs.md rename to public/docs/javascript/0-intro/2-0-environment.md index 7e01e77..3ea0003 100644 --- a/public/docs/javascript/0-intro/1-vs-nodejs.md +++ b/public/docs/javascript/0-intro/2-0-environment.md @@ -1,5 +1,5 @@ --- -id: javascript-intro-1-vs-nodejs +id: javascript-intro-environment title: '実行環境: ブラりザ vs Node.js' level: 2 --- diff --git a/public/docs/javascript/0-intro/2.md b/public/docs/javascript/0-intro/3-0-comparison.md similarity index 97% rename from public/docs/javascript/0-intro/2.md rename to public/docs/javascript/0-intro/3-0-comparison.md index 633ced6..fc4f4cb 100644 --- a/public/docs/javascript/0-intro/2.md +++ b/public/docs/javascript/0-intro/3-0-comparison.md @@ -1,5 +1,5 @@ --- -id: javascript-intro-2 +id: javascript-intro-comparison title: 他蚀語ずの比范 level: 2 --- diff --git a/public/docs/javascript/0-intro/3-hello-world.md b/public/docs/javascript/0-intro/4-0-helloworld.md similarity index 82% rename from public/docs/javascript/0-intro/3-hello-world.md rename to public/docs/javascript/0-intro/4-0-helloworld.md index 8aadc3b..f4c9a9e 100644 --- a/public/docs/javascript/0-intro/3-hello-world.md +++ b/public/docs/javascript/0-intro/4-0-helloworld.md @@ -1,5 +1,5 @@ --- -id: javascript-intro-3-hello-world +id: javascript-intro-helloworld title: '"Hello, World!"' level: 2 --- diff --git a/public/docs/javascript/0-intro/4-repl-read-eval-print-loop.md b/public/docs/javascript/0-intro/4-1-repl.md similarity index 93% rename from public/docs/javascript/0-intro/4-repl-read-eval-print-loop.md rename to public/docs/javascript/0-intro/4-1-repl.md index ab19279..173a54b 100644 --- a/public/docs/javascript/0-intro/4-repl-read-eval-print-loop.md +++ b/public/docs/javascript/0-intro/4-1-repl.md @@ -1,5 +1,5 @@ --- -id: javascript-intro-4-repl-read-eval-print +id: javascript-intro-repl title: REPL (Read-Eval-Print Loop) での実行 level: 3 --- @@ -10,7 +10,7 @@ level: 3 このりェブサむトではドキュメント内にJavaScriptの実行環境を埋め蟌んでおり、以䞋のように緑枠で囲われたコヌド䟋には自由にJavaScriptコヌドを曞いお詊すこずができたす。ただしNode.jsずは環境が異なり、Node.js特有の機胜は䜿甚できたせん。 -```js-repl:1 +```js-repl > console.log("Hello, World from REPL!"); Hello, World from REPL! undefined diff --git a/public/docs/javascript/0-intro/5.md b/public/docs/javascript/0-intro/4-2-run-source.md similarity index 95% rename from public/docs/javascript/0-intro/5.md rename to public/docs/javascript/0-intro/4-2-run-source.md index 64f2181..d174f4d 100644 --- a/public/docs/javascript/0-intro/5.md +++ b/public/docs/javascript/0-intro/4-2-run-source.md @@ -1,5 +1,5 @@ --- -id: javascript-intro-5 +id: javascript-intro-run-source title: ゜ヌスファむルからの実行 level: 3 --- diff --git a/public/docs/javascript/0-intro/6.md b/public/docs/javascript/0-intro/4-3-browser.md similarity index 95% rename from public/docs/javascript/0-intro/6.md rename to public/docs/javascript/0-intro/4-3-browser.md index f852846..9e816cf 100644 --- a/public/docs/javascript/0-intro/6.md +++ b/public/docs/javascript/0-intro/4-3-browser.md @@ -1,5 +1,5 @@ --- -id: javascript-intro-6 +id: javascript-intro-browser title: ブラりザでの実行 (参考) level: 3 --- diff --git a/public/docs/javascript/1-basics/0-let-const-var.md b/public/docs/javascript/1-basics/0-let-const-var.md deleted file mode 100644 index aa27021..0000000 --- a/public/docs/javascript/1-basics/0-let-const-var.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: javascript-basics-0-let-const-var -title: '倉数宣蚀: let, const, var' -level: 2 ---- - -## 倉数宣蚀: let, const, var - -珟代のJavaScript開発においお、倉数宣蚀のルヌルは非垞にシンプルです。 -**「基本は `const`、再代入が必芁な堎合のみ `let` を䜿い、`var` は決しお䜿わない」** これが鉄則です。 diff --git a/public/docs/javascript/1-basics/2-var.md b/public/docs/javascript/1-basics/1-0-variable.md similarity index 55% rename from public/docs/javascript/1-basics/2-var.md rename to public/docs/javascript/1-basics/1-0-variable.md index 4d0e19e..6ce8f0e 100644 --- a/public/docs/javascript/1-basics/2-var.md +++ b/public/docs/javascript/1-basics/1-0-variable.md @@ -1,10 +1,19 @@ --- -id: javascript-basics-2-var -title: var の危険性 (関数スコヌプず巻き䞊げ) -level: 3 +id: javascript-basics-variable +title: '倉数宣蚀: let, const, var' +level: 2 --- -### var の危険性 (関数スコヌプず巻き䞊げ) +## 倉数宣蚀: let, const, var + +珟代のJavaScript開発においお、倉数宣蚀のルヌルは非垞にシンプルです。 +**「基本は `const`、再代入が必芁な堎合のみ `let` を䜿い、`var` は決しお䜿わない」** これが鉄則です。 + +ES62015幎で導入された `const` ず `let` は、C++やJava、C\#などず同様に**ブロックスコヌプ**を持ちたす。 + + * **const**: 再代入䞍可胜な倉数を宣蚀したす。定数だけでなく、再代入しない倉数はすべおこれで宣蚀したす。 + * **let**: 再代入可胜な倉数を宣蚀したす。ルヌプカりンタや、状態が倉わる倀に䜿甚したす。 + なぜ `var` を䜿うべきではないのでしょうか。それは `var` が**関数スコヌプ**であり、意図しない倉数の共有や「巻き䞊げHoisting」によるバグを匕き起こしやすいからです。 diff --git a/public/docs/javascript/1-basics/1-const-let.md b/public/docs/javascript/1-basics/1-const-let.md deleted file mode 100644 index 202812b..0000000 --- a/public/docs/javascript/1-basics/1-const-let.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: javascript-basics-1-const-let -title: const ず let (ブロックスコヌプ) -level: 3 ---- - -### const ず let (ブロックスコヌプ) - -ES62015幎で導入された `const` ず `let` は、C++やJava、C\#などず同様に**ブロックスコヌプ**を持ちたす。 - - * **const**: 再代入䞍可胜な倉数を宣蚀したす。定数だけでなく、再代入しない倉数はすべおこれで宣蚀したす。 - * **let**: 再代入可胜な倉数を宣蚀したす。ルヌプカりンタや、状態が倉わる倀に䜿甚したす。 diff --git a/public/docs/javascript/1-basics/10.md b/public/docs/javascript/1-basics/10.md deleted file mode 100644 index 7b3c359..0000000 --- a/public/docs/javascript/1-basics/10.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-basics-10 -title: 型倉換暗黙的な型倉換の眠 -level: 2 ---- - -## 型倉換暗黙的な型倉換の眠 - -JavaScriptは文脈に応じお勝手に型を倉換しようずしたす。 diff --git a/public/docs/javascript/1-basics/12-falsy.md b/public/docs/javascript/1-basics/12-falsy.md deleted file mode 100644 index 83d4aa2..0000000 --- a/public/docs/javascript/1-basics/12-falsy.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -id: javascript-basics-12-falsy -title: Falsyな倀 -level: 3 ---- - -### Falsyな倀 - -条件匏if文などで `false` ずみなされる倀を「Falsyな倀」ず呌びたす。これ以倖はすべお `true`Truthyずしお扱われたす。 - -**Falsyな倀のリスト:** - -1. `false` -2. `0` (数倀のれロ) -3. `-0` -4. `0n` (BigIntのれロ) -5. `""` (空文字) -6. `null` -7. `undefined` -8. `NaN` (Not a Number) - -**泚意:** 空の配列 `[]` や空のオブゞェクト `{}` は **Truthy** です。 - -```js:falsy_check.js -const values = [0, "0", [], null, undefined, ""]; - -values.forEach(val => { - if (val) { - console.log(`Value: [${val}] is Truthy`); - } else { - console.log(`Value: [${val}] is Falsy`); - } -}); -``` - -```js-exec:falsy_check.js -Value: [0] is Falsy -Value: [0] is Truthy -Value: [] is Truthy -Value: [null] is Falsy -Value: [undefined] is Falsy -Value: [] is Falsy -``` diff --git a/public/docs/javascript/1-basics/3.md b/public/docs/javascript/1-basics/2-0-primitive-type.md similarity index 97% rename from public/docs/javascript/1-basics/3.md rename to public/docs/javascript/1-basics/2-0-primitive-type.md index 3885180..22c79ff 100644 --- a/public/docs/javascript/1-basics/3.md +++ b/public/docs/javascript/1-basics/2-0-primitive-type.md @@ -1,5 +1,5 @@ --- -id: javascript-basics-3 +id: javascript-basics-primitive-type title: 'デヌタ型: プリミティブ型' level: 2 --- diff --git a/public/docs/javascript/1-basics/4-null-undefined.md b/public/docs/javascript/1-basics/2-1-null-undefined.md similarity index 92% rename from public/docs/javascript/1-basics/4-null-undefined.md rename to public/docs/javascript/1-basics/2-1-null-undefined.md index 03d9e9d..a7d9e94 100644 --- a/public/docs/javascript/1-basics/4-null-undefined.md +++ b/public/docs/javascript/1-basics/2-1-null-undefined.md @@ -1,5 +1,5 @@ --- -id: javascript-basics-4-null-undefined +id: javascript-basics-null-undefined title: null ず undefined の違い level: 3 --- @@ -11,7 +11,7 @@ level: 3 * **undefined**: システムJavaScript゚ンゞンが「倀がただない」こずを瀺すために䜿うこずが倚い。 * **null**: プログラマが「ここには倀がない」こずを明瀺するために䜿うこずが倚い。 -```js-repl:1 +```js-repl > let unassigned; undefined > unassigned diff --git a/public/docs/javascript/1-basics/3-0-object.md b/public/docs/javascript/1-basics/3-0-object.md new file mode 100644 index 0000000..b904441 --- /dev/null +++ b/public/docs/javascript/1-basics/3-0-object.md @@ -0,0 +1,15 @@ +--- +id: javascript-basics-object +title: 'デヌタ型: オブゞェクト型' +level: 2 +--- + +## デヌタ型: オブゞェクト型 + +プリミティブ以倖のすべおの倀は**オブゞェクト参照型**です。これらはメモリ䞊のアドレス参照ずしお扱われたす。 + +䞻なオブゞェクト型には以䞋がありたす。 + + * **Object**: キヌず倀のペアの集合蟞曞、ハッシュマップに近い。 + * **Array**: 順序付きリスト。 + * **Function**: JavaScriptでは関数もオブゞェクトであり、倉数に代入したり匕数ずしお枡すこずができたす第䞀玚関数。 diff --git a/public/docs/javascript/1-basics/6-const.md b/public/docs/javascript/1-basics/3-1-const-object.md similarity index 70% rename from public/docs/javascript/1-basics/6-const.md rename to public/docs/javascript/1-basics/3-1-const-object.md index 7761184..5ce7e07 100644 --- a/public/docs/javascript/1-basics/6-const.md +++ b/public/docs/javascript/1-basics/3-1-const-object.md @@ -1,5 +1,5 @@ --- -id: javascript-basics-6-const +id: javascript-basics-const-object title: const ずオブゞェクトの倉曎 level: 3 --- @@ -31,9 +31,3 @@ console.log(colors); { name: 'Bob', id: 1 } [ 'Red', 'Green', 'Blue' ] ``` - -䞻なオブゞェクト型には以䞋がありたす。 - - * **Object**: キヌず倀のペアの集合蟞曞、ハッシュマップに近い。 - * **Array**: 順序付きリスト。 - * **Function**: JavaScriptでは関数もオブゞェクトであり、倉数に代入したり匕数ずしお枡すこずができたす第䞀玚関数。 diff --git a/public/docs/javascript/1-basics/4-0-equality.md b/public/docs/javascript/1-basics/4-0-equality.md new file mode 100644 index 0000000..0386506 --- /dev/null +++ b/public/docs/javascript/1-basics/4-0-equality.md @@ -0,0 +1,28 @@ +--- +id: javascript-basics-equality +title: 挔算子ず等䟡性 (== vs ===) +level: 2 +--- + +## 挔算子ず等䟡性 (== vs ===) + +JavaScriptにおける最倧の萜ずし穎の䞀぀が「等䟡挔算子」です。 + +**厳密等䟡挔算子 (`===`) **は「倀」ず「型」の䞡方が等しいかを比范したす。 + +**等䟡挔算子 (`==`) **は、比范する前に**暗黙的な型倉換**を行いたす。これにより、盎感的ではない結果が生じるこずがありたす。 + +基本的には垞に `===` および `!==`を䜿甚するようにしおください。 + +```js-repl +> 1 === "1" // 型が違うので false掚奚 +false +> 1 == "1" // 文字列が数倀に倉換されお比范されるため true非掚奚 +true +> 0 == false // true +true +> null == undefined // trueここだけは䟋倖的に蚱容するスタむルもあるが、基本は避ける +true +> [] == ![] // 非垞に難解な挙動trueになる +true +``` diff --git a/public/docs/javascript/1-basics/11.md b/public/docs/javascript/1-basics/5-1-add-operator.md similarity index 63% rename from public/docs/javascript/1-basics/11.md rename to public/docs/javascript/1-basics/5-1-add-operator.md index 736dec4..d93cbfc 100644 --- a/public/docs/javascript/1-basics/11.md +++ b/public/docs/javascript/1-basics/5-1-add-operator.md @@ -1,14 +1,16 @@ --- -id: javascript-basics-11 -title: 加算挔算子 (+) の挙動 -level: 3 +id: javascript-basics-add-operator +title: 加算挔算子 (+) での暗黙的な型倉換 +level: 2 --- -### 加算挔算子 (+) の挙動 +## 加算挔算子 (+) での暗黙的な型倉換 + +JavaScriptは文脈に応じお勝手に型を倉換しようずしたす。 `+` 挔算子は、数倀の加算だけでなく文字列の連結にも䜿われたす。片方が文字列であれば、もう片方も文字列に倉換されお連結されたす。 -```js-repl:3 +```js-repl > 10 + 20 30 > 10 + "20" // 数倀が文字列 "10" に倉換され連結される diff --git a/public/docs/javascript/1-basics/5.md b/public/docs/javascript/1-basics/5.md deleted file mode 100644 index 64f3f73..0000000 --- a/public/docs/javascript/1-basics/5.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-basics-5 -title: 'デヌタ型: オブゞェクト型' -level: 2 ---- - -## デヌタ型: オブゞェクト型 - -プリミティブ以倖のすべおの倀は**オブゞェクト参照型**です。これらはメモリ䞊のアドレス参照ずしお扱われたす。 diff --git a/public/docs/javascript/1-basics/13.md b/public/docs/javascript/1-basics/6-0-summary.md similarity index 79% rename from public/docs/javascript/1-basics/13.md rename to public/docs/javascript/1-basics/6-0-summary.md index c473ae6..94000f8 100644 --- a/public/docs/javascript/1-basics/13.md +++ b/public/docs/javascript/1-basics/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: javascript-basics-13 +id: javascript-basics-summary title: この章のたずめ level: 2 --- @@ -10,4 +10,3 @@ level: 2 * プリミティブ型は倀枡し、オブゞェクト型配列含むは参照枡しである。 * `const` で宣蚀したオブゞェクトの䞭身は倉曎可胜である。 * 比范には必ず `===`厳密等䟡挔算子を䜿甚し、`==` による暗黙の型倉換を避ける。 - * `0`, `""`, `null`, `undefined` などが「Falsyな倀」ずしお扱われるこずを理解する。 diff --git a/public/docs/javascript/1-basics/14.md b/public/docs/javascript/1-basics/6-1-practice1.md similarity index 96% rename from public/docs/javascript/1-basics/14.md rename to public/docs/javascript/1-basics/6-1-practice1.md index 6bd6639..200b76b 100644 --- a/public/docs/javascript/1-basics/14.md +++ b/public/docs/javascript/1-basics/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: javascript-basics-14 +id: javascript-basics-practice1 title: '緎習問題1: テンプレヌトリテラルず型倉換' level: 3 --- diff --git a/public/docs/javascript/1-basics/15.md b/public/docs/javascript/1-basics/6-2-practice2.md similarity index 96% rename from public/docs/javascript/1-basics/15.md rename to public/docs/javascript/1-basics/6-2-practice2.md index 641a3c2..b9fef4a 100644 --- a/public/docs/javascript/1-basics/15.md +++ b/public/docs/javascript/1-basics/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: javascript-basics-15 +id: javascript-basics-practice2 title: '緎習問題2: オブゞェクトの操䜜ず参照' level: 3 --- diff --git a/public/docs/javascript/1-basics/7.md b/public/docs/javascript/1-basics/7.md deleted file mode 100644 index 0635b40..0000000 --- a/public/docs/javascript/1-basics/7.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-basics-7 -title: 挔算子ず等䟡性 (== vs ===) -level: 2 ---- - -## 挔算子ず等䟡性 (== vs ===) - -JavaScriptにおける最倧の萜ずし穎の䞀぀が「等䟡挔算子」です。 diff --git a/public/docs/javascript/1-basics/8.md b/public/docs/javascript/1-basics/8.md deleted file mode 100644 index 6949964..0000000 --- a/public/docs/javascript/1-basics/8.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-basics-8 -title: 厳密等䟡挔算子 (===) を䜿う -level: 3 ---- - -### 厳密等䟡挔算子 (===) を䜿う - -垞に `===` および `!==`を䜿甚しおください。これは「倀」ず「型」の䞡方が等しいかを比范したす。 diff --git a/public/docs/javascript/1-basics/9.md b/public/docs/javascript/1-basics/9.md deleted file mode 100644 index 6fd7d0a..0000000 --- a/public/docs/javascript/1-basics/9.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: javascript-basics-9 -title: 等䟡挔算子 (==) の眠 -level: 3 ---- - -### 等䟡挔算子 (==) の眠 - -`==` は、比范する前に**暗黙的な型倉換**を行いたす。これにより、盎感的ではない結果が生じるこずがありたす。 - -```js-repl:2 -> 1 === "1" // 型が違うので false掚奚 -false -> 1 == "1" // 文字列が数倀に倉換されお比范されるため true非掚奚 -true -> 0 == false // true -true -> null == undefined // trueここだけは䟋倖的に蚱容するスタむルもあるが、基本は避ける -true -> [] == ![] // 非垞に難解な挙動trueになる -true -``` diff --git a/public/docs/javascript/2-control/0-if-switch.md b/public/docs/javascript/2-control/0-if-switch.md deleted file mode 100644 index e50be16..0000000 --- a/public/docs/javascript/2-control/0-if-switch.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: javascript-control-0-if-switch -title: 条件分岐 (if, switch) -level: 2 ---- - -## 条件分岐 (if, switch) diff --git a/public/docs/javascript/2-control/1-iftruthy-falsy.md b/public/docs/javascript/2-control/1-1-if-truthy.md similarity index 92% rename from public/docs/javascript/2-control/1-iftruthy-falsy.md rename to public/docs/javascript/2-control/1-1-if-truthy.md index 1cda406..f6232a4 100644 --- a/public/docs/javascript/2-control/1-iftruthy-falsy.md +++ b/public/docs/javascript/2-control/1-1-if-truthy.md @@ -1,10 +1,10 @@ --- -id: javascript-control-1-iftruthy-falsy +id: javascript-control-if-truthy title: if文ずTruthy / Falsy -level: 3 +level: 2 --- -### if文ずTruthy / Falsy +## `if`文ずTruthy / Falsy 基本的な `if` 文の構造はC蚀語やJavaず同様です。しかし、条件匏における評䟡はJavaScript特有の**Truthy真ず芋なされる倀**ず**Falsy停ず芋なされる倀**の抂念を理解する必芁がありたす。 @@ -25,7 +25,7 @@ level: 3 * **泚意:** 空の配列 `[]` や 空のオブゞェクト `{}` は **Truthy** ですPythonなどの経隓者は泚意が必芁です。 * 文字列の `"0"` や `"false"` もTruthyです。 -```js-repl:1 +```js-repl > if (0) { 'True'; } else { 'False'; } 'False' diff --git a/public/docs/javascript/2-control/2-switch.md b/public/docs/javascript/2-control/1-2-switch.md similarity index 91% rename from public/docs/javascript/2-control/2-switch.md rename to public/docs/javascript/2-control/1-2-switch.md index d9383d2..49494c7 100644 --- a/public/docs/javascript/2-control/2-switch.md +++ b/public/docs/javascript/2-control/1-2-switch.md @@ -1,10 +1,10 @@ --- -id: javascript-control-2-switch +id: javascript-control-switch title: switch文 -level: 3 +level: 2 --- -### switch文 +## `switch`文 `switch` 文も暙準的ですが、比范が **厳密等䟡挔算子 (`===`)** で行われる点に泚意しおください。型倉換は行われたせん。 diff --git a/public/docs/javascript/2-control/10-trycatchfinally.md b/public/docs/javascript/2-control/10-trycatchfinally.md deleted file mode 100644 index cf22993..0000000 --- a/public/docs/javascript/2-control/10-trycatchfinally.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-control-10-trycatchfinally -title: 䟋倖凊理 (try...catch...finally) -level: 2 ---- - -## 䟋倖凊理 (try...catch...finally) - -JavaScriptの䟋倖凊理は `try...catch...finally` 構文を䜿甚したす。 diff --git a/public/docs/javascript/2-control/3-for-while.md b/public/docs/javascript/2-control/2-0-loop.md similarity index 84% rename from public/docs/javascript/2-control/3-for-while.md rename to public/docs/javascript/2-control/2-0-loop.md index a7a267e..ca89529 100644 --- a/public/docs/javascript/2-control/3-for-while.md +++ b/public/docs/javascript/2-control/2-0-loop.md @@ -1,5 +1,5 @@ --- -id: javascript-control-3-for-while +id: javascript-control-loop title: 繰り返し (for, while) level: 2 --- diff --git a/public/docs/javascript/2-control/4-for.md b/public/docs/javascript/2-control/2-1-for.md similarity index 77% rename from public/docs/javascript/2-control/4-for.md rename to public/docs/javascript/2-control/2-1-for.md index c93bfcc..7020490 100644 --- a/public/docs/javascript/2-control/4-for.md +++ b/public/docs/javascript/2-control/2-1-for.md @@ -1,12 +1,12 @@ --- -id: javascript-control-4-for +id: javascript-control-for title: 叀兞的な for ルヌプ level: 3 --- ### 叀兞的な for ルヌプ -```js-repl:2 +```js-repl > for (let i = 0; i < 3; i++) { console.log(i); } 0 1 diff --git a/public/docs/javascript/2-control/5-while.md b/public/docs/javascript/2-control/2-2-while.md similarity index 75% rename from public/docs/javascript/2-control/5-while.md rename to public/docs/javascript/2-control/2-2-while.md index 58d5454..52980bc 100644 --- a/public/docs/javascript/2-control/5-while.md +++ b/public/docs/javascript/2-control/2-2-while.md @@ -1,12 +1,12 @@ --- -id: javascript-control-5-while +id: javascript-control-while title: while ルヌプ level: 3 --- ### while ルヌプ -```js-repl:3 +```js-repl > let count = 0; > while (count < 3) { console.log(count++); } 0 diff --git a/public/docs/javascript/2-control/3-0-iteration.md b/public/docs/javascript/2-control/3-0-iteration.md new file mode 100644 index 0000000..e77f339 --- /dev/null +++ b/public/docs/javascript/2-control/3-0-iteration.md @@ -0,0 +1,14 @@ +--- +id: javascript-control-iteration +title: 'むテレヌション: for...of ず for...in の違い' +level: 2 +--- + +## むテレヌション: `for...of` ず `for...in` の違い + +珟代のJavaScript開発においお、最も重芁なのがこの2぀のルヌプの䜿い分けです。これらは䌌おいたすが、圹割が明確に異なりたす。 + +| 構文 | 取埗するもの | 察象 | 掚奚ナヌスケヌス | +| :--- | :--- | :--- | :--- | +| **`for...in`** | **キヌ (Key)** | Object | オブゞェクトのプロパティ調査 | +| **`for...of`** | **倀 (Value)** | Array, String, Map, Set | 配列やリストデヌタの凊理 | diff --git a/public/docs/javascript/2-control/7-forin.md b/public/docs/javascript/2-control/3-1-for-in.md similarity index 92% rename from public/docs/javascript/2-control/7-forin.md rename to public/docs/javascript/2-control/3-1-for-in.md index ebc5da5..6ec4f1b 100644 --- a/public/docs/javascript/2-control/7-forin.md +++ b/public/docs/javascript/2-control/3-1-for-in.md @@ -1,10 +1,10 @@ --- -id: javascript-control-7-forin +id: javascript-control-for-in title: for...in ルヌププロパティ名の列挙 level: 3 --- -### for...in ルヌププロパティ名の列挙 +### `for...in` ルヌププロパティ名の列挙 `for...in` はオブゞェクトの **キヌプロパティ名** を列挙するために蚭蚈されおいたす。 配列に察しお䜿甚するず、むンデックス"0", "1", ...が文字列ずしお返っおくるだけでなく、プロトタむプチェヌン䞊のプロパティたで列挙しおしたうリスクがあるため、**配列ぞの䜿甚は掚奚されたせん**。 diff --git a/public/docs/javascript/2-control/8-forof.md b/public/docs/javascript/2-control/3-2-for-of.md similarity index 64% rename from public/docs/javascript/2-control/8-forof.md rename to public/docs/javascript/2-control/3-2-for-of.md index 1ae9ed7..09293b7 100644 --- a/public/docs/javascript/2-control/8-forof.md +++ b/public/docs/javascript/2-control/3-2-for-of.md @@ -1,10 +1,10 @@ --- -id: javascript-control-8-forof +id: javascript-control-for-of title: for...of ルヌプ反埩可胜オブゞェクトの走査 level: 3 --- -### for...of ルヌプ反埩可胜オブゞェクトの走査 +### `for...of` ルヌプ反埩可胜オブゞェクトの走査 ES2015 (ES6) で導入された `for...of` は、**倀Values** を反埩したす。 配列、文字列、Map、Setなどの **Iterable反埩可胜** なオブゞェクトに察しお䜿甚したす。配列の䞭身を順番に凊理したい堎合は、こちらが正解です。 @@ -31,3 +31,12 @@ Go A I ``` + +> **Tips:** オブゞェクトの䞭身を `for...of` で回したい堎合は、`Object.keys()`, `Object.values()`, `Object.entries()` を䜿うのがモダンな手法です。 + +```js +const obj = { a: 1, b: 2 }; +for (const [key, val] of Object.entries(obj)) { + console.log(key, val); +} +``` diff --git a/public/docs/javascript/2-control/11.md b/public/docs/javascript/2-control/4-0-try-catch.md similarity index 80% rename from public/docs/javascript/2-control/11.md rename to public/docs/javascript/2-control/4-0-try-catch.md index 4e92b06..5af3554 100644 --- a/public/docs/javascript/2-control/11.md +++ b/public/docs/javascript/2-control/4-0-try-catch.md @@ -1,10 +1,12 @@ --- -id: javascript-control-11 -title: 基本的な゚ラヌハンドリング -level: 3 +id: javascript-control-try-catch +title: 䟋倖凊理 (try...catch...finally) +level: 2 --- -### 基本的な゚ラヌハンドリング +## 䟋倖凊理 (`try...catch...finally`) + +JavaScriptの䟋倖凊理は `try...catch...finally` 構文を䜿甚したす。 実行時に゚ラヌが発生するず、凊理が䞭断され `catch` ブロックに移行したす。 diff --git a/public/docs/javascript/2-control/12-throw.md b/public/docs/javascript/2-control/4-2-throw.md similarity index 90% rename from public/docs/javascript/2-control/12-throw.md rename to public/docs/javascript/2-control/4-2-throw.md index 4f060d2..306a27a 100644 --- a/public/docs/javascript/2-control/12-throw.md +++ b/public/docs/javascript/2-control/4-2-throw.md @@ -1,14 +1,14 @@ --- -id: javascript-control-12-throw +id: javascript-control-throw title: throw に぀いお level: 3 --- -### throw に぀いお +### `throw` に぀いお JavaScriptでは `throw` で䟋倖を投げるこずができたす。`Error` オブゞェクトを投げるのが䞀般的ですが、技術的には文字列や数倀など、任意の倀を投げるこずが可胜ですただし、スタックトレヌスが取れなくなるため掚奚されたせん。 -```js-repl:5 +```js-repl > try { throw new Error("Something went wrong"); } catch (e) { console.log(e.message); } Something went wrong diff --git a/public/docs/javascript/2-control/13.md b/public/docs/javascript/2-control/5-0-summary.md similarity index 95% rename from public/docs/javascript/2-control/13.md rename to public/docs/javascript/2-control/5-0-summary.md index fbdb969..f9bb212 100644 --- a/public/docs/javascript/2-control/13.md +++ b/public/docs/javascript/2-control/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: javascript-control-13 +id: javascript-control-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/javascript/2-control/14.md b/public/docs/javascript/2-control/5-1-practice1.md similarity index 94% rename from public/docs/javascript/2-control/14.md rename to public/docs/javascript/2-control/5-1-practice1.md index a2dc179..05b2f95 100644 --- a/public/docs/javascript/2-control/14.md +++ b/public/docs/javascript/2-control/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: javascript-control-14 +id: javascript-control-practice1 title: '緎習問題1: 配列のフィルタリングず集蚈' level: 3 --- diff --git a/public/docs/javascript/2-control/15.md b/public/docs/javascript/2-control/5-2-practice2.md similarity index 96% rename from public/docs/javascript/2-control/15.md rename to public/docs/javascript/2-control/5-2-practice2.md index 09025ca..be8ff50 100644 --- a/public/docs/javascript/2-control/15.md +++ b/public/docs/javascript/2-control/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: javascript-control-15 +id: javascript-control-practice2 title: '問題 2: 簡易コマンドディスパッチャ' level: 3 --- diff --git a/public/docs/javascript/2-control/6-forof-forin.md b/public/docs/javascript/2-control/6-forof-forin.md deleted file mode 100644 index 9759476..0000000 --- a/public/docs/javascript/2-control/6-forof-forin.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-control-6-forof-forin -title: 'むテレヌション: for...of ず for...in の違い' -level: 2 ---- - -## むテレヌション: for...of ず for...in の違い - -珟代のJavaScript開発においお、最も重芁なのがこの2぀のルヌプの䜿い分けです。これらは䌌おいたすが、圹割が明確に異なりたす。 diff --git a/public/docs/javascript/2-control/9.md b/public/docs/javascript/2-control/9.md deleted file mode 100644 index 63b76af..0000000 --- a/public/docs/javascript/2-control/9.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: javascript-control-9 -title: 䜿い分けのたずめ -level: 3 ---- - -### 䜿い分けのたずめ - -| 構文 | 取埗するもの | 察象 | 掚奚ナヌスケヌス | -| :--- | :--- | :--- | :--- | -| **`for...in`** | **キヌ (Key)** | Object | オブゞェクトのプロパティ調査 | -| **`for...of`** | **倀 (Value)** | Array, String, Map, Set | 配列やリストデヌタの凊理 | - -> **Tips:** オブゞェクトの䞭身を `for...of` で回したい堎合は、`Object.keys()`, `Object.values()`, `Object.entries()` を䜿うのがモダンな手法です。 - -```js-repl:4 -> const obj = { a: 1, b: 2 }; -> for (const [key, val] of Object.entries(obj)) { console.log(key, val); } -a 1 -b 2 -``` diff --git a/public/docs/javascript/3-functions-closures/0.md b/public/docs/javascript/3-functions-closures/1-0-function.md similarity index 90% rename from public/docs/javascript/3-functions-closures/0.md rename to public/docs/javascript/3-functions-closures/1-0-function.md index 8e3278b..fb8b748 100644 --- a/public/docs/javascript/3-functions-closures/0.md +++ b/public/docs/javascript/3-functions-closures/1-0-function.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-0 +id: javascript-functions-basic title: 関数の定矩関数宣蚀 vs 関数匏 level: 2 --- diff --git a/public/docs/javascript/3-functions-closures/1-function-declaration.md b/public/docs/javascript/3-functions-closures/1-1-function-declaration.md similarity index 89% rename from public/docs/javascript/3-functions-closures/1-function-declaration.md rename to public/docs/javascript/3-functions-closures/1-1-function-declaration.md index 87c41f1..f09462f 100644 --- a/public/docs/javascript/3-functions-closures/1-function-declaration.md +++ b/public/docs/javascript/3-functions-closures/1-1-function-declaration.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-1-function-declaration +id: javascript-function-declaration title: 1. 関数宣蚀 (Function Declaration) level: 3 --- diff --git a/public/docs/javascript/3-functions-closures/2-function-expression.md b/public/docs/javascript/3-functions-closures/1-2-function-expression.md similarity index 92% rename from public/docs/javascript/3-functions-closures/2-function-expression.md rename to public/docs/javascript/3-functions-closures/1-2-function-expression.md index e93d8d1..75f4c83 100644 --- a/public/docs/javascript/3-functions-closures/2-function-expression.md +++ b/public/docs/javascript/3-functions-closures/1-2-function-expression.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-2-function-expression +id: javascript-function-expression title: 2. 関数匏 (Function Expression) level: 3 --- diff --git a/public/docs/javascript/3-functions-closures/10.md b/public/docs/javascript/3-functions-closures/10.md deleted file mode 100644 index 179b48c..0000000 --- a/public/docs/javascript/3-functions-closures/10.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: javascript-functions-closures-10 -title: クロヌゞャ関数が状態を持぀仕組み -level: 2 ---- - -## クロヌゞャ関数が状態を持぀仕組み - -クロヌゞャ (Closure) は、この章の最重芁トピックです。 -䞀蚀で蚀えば、**「倖偎の関数のスコヌプにある倉数を、倖偎の関数の実行終了埌も参照し続ける関数」**のこずです。 - -通垞、関数(`createCounter`)の実行が終わるず、そのロヌカル倉数(`count`)はメモリから砎棄されたす。しかし、その倉数を参照しおいる内郚関数(`increment`)が存圚し、その内郚関数が倖郚に返された堎合、倉数は砎棄されずに保持され続けたす。 diff --git a/public/docs/javascript/3-functions-closures/11.md b/public/docs/javascript/3-functions-closures/11.md deleted file mode 100644 index a051098..0000000 --- a/public/docs/javascript/3-functions-closures/11.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -id: javascript-functions-closures-11 -title: クロヌゞャの実䟋カりンタ -level: 3 ---- - -### クロヌゞャの実䟋カりンタ - -プラむベヌトな倉数を持぀カりンタを䜜っおみたしょう。 - -```js:closure_counter.js -const createCounter = () => { - let count = 0; // この倉数は倖郚から盎接アクセスできないプラむベヌト倉数的な圹割 - - return () => { - count++; - console.log(`Current count: ${count}`); - }; -}; - -const counterA = createCounter(); // counterA専甚のスコヌプ環境が䜜られる -const counterB = createCounter(); // counterB専甚のスコヌプが別に䜜られる - -counterA(); // 1 -counterA(); // 2 -counterA(); // 3 - -console.log("--- switching to B ---"); - -counterB(); // 1 (Aの状態ずは独立しおいる) -``` - -```js-exec:closure_counter.js -Current count: 1 -Current count: 2 -Current count: 3 ---- switching to B --- -Current count: 1 -``` diff --git a/public/docs/javascript/3-functions-closures/12.md b/public/docs/javascript/3-functions-closures/12.md deleted file mode 100644 index b89902d..0000000 --- a/public/docs/javascript/3-functions-closures/12.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: javascript-functions-closures-12 -title: なぜクロヌゞャを䜿うのか -level: 3 ---- - -### なぜクロヌゞャを䜿うのか - -1. **カプセル化 (Encapsulation):** 倉数を隠蔜し、特定の関数経由でしか倉曎できないようにするこずで、予期せぬバグを防ぎたす。 -2. **状態の保持:** グロヌバル倉数を䜿わずに、関数単䜍で氞続的な状態を持おたす。 -3. **関数ファクトリ:** 蚭定の異なる関数を動的に生成する堎合に圹立ちたす。 diff --git a/public/docs/javascript/3-functions-closures/2-0-arrow-function.md b/public/docs/javascript/3-functions-closures/2-0-arrow-function.md new file mode 100644 index 0000000..d785025 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/2-0-arrow-function.md @@ -0,0 +1,29 @@ +--- +id: javascript-arrow-function-basic +title: 'アロヌ関数 (=>) の構文ず特城' +level: 2 +--- + +## アロヌ関数 (`=>`) の構文ず特城 + +ES2015 (ES6) で導入されたアロヌ関数は、関数匏をより短く蚘述するための構文です。 +`function` キヌワヌドを省略し、`=>` (矢印) を䜿っお定矩したす。 +Javaのラムダ匏やPythonのlambdaに䌌おいたすが、いく぀か独自の特城がありたす。 + +```js:arrow_function.js +// 埓来の関数匏 +const add = function(a, b) { + return a + b; +}; + +// アロヌ関数 +const addArrow = (a, b) => { + return a + b; +}; + +console.log(addArrow(3, 5)); +``` + +```js-exec:arrow_function.js +8 +``` diff --git a/public/docs/javascript/3-functions-closures/5.md b/public/docs/javascript/3-functions-closures/2-2-arrow-function-simple.md similarity index 94% rename from public/docs/javascript/3-functions-closures/5.md rename to public/docs/javascript/3-functions-closures/2-2-arrow-function-simple.md index da89ad0..de01221 100644 --- a/public/docs/javascript/3-functions-closures/5.md +++ b/public/docs/javascript/3-functions-closures/2-2-arrow-function-simple.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-5 +id: javascript-arrow-function-simple title: 省略蚘法 level: 3 --- @@ -11,7 +11,7 @@ level: 3 1. **匕数が1぀の堎合**: カッコ `()` を省略可胜。 2. **凊理が1行でreturnする堎合**: 䞭括匧 `{}` ず `return` キヌワヌドを省略可胜暗黙のreturn。 -```js-repl:4 +```js-repl > const square = x => x * x; // 匕数の()ずreturnを省略 > square(5); 25 diff --git a/public/docs/javascript/3-functions-closures/6-rest.md b/public/docs/javascript/3-functions-closures/3-0-argument.md similarity index 84% rename from public/docs/javascript/3-functions-closures/6-rest.md rename to public/docs/javascript/3-functions-closures/3-0-argument.md index 23517a9..7e8b9f2 100644 --- a/public/docs/javascript/3-functions-closures/6-rest.md +++ b/public/docs/javascript/3-functions-closures/3-0-argument.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-6-rest +id: javascript-functions-argument title: 匕数デフォルト匕数、Restパラメヌタ (...) level: 2 --- diff --git a/public/docs/javascript/3-functions-closures/7.md b/public/docs/javascript/3-functions-closures/3-1-default-arg.md similarity index 94% rename from public/docs/javascript/3-functions-closures/7.md rename to public/docs/javascript/3-functions-closures/3-1-default-arg.md index e53098d..fb97136 100644 --- a/public/docs/javascript/3-functions-closures/7.md +++ b/public/docs/javascript/3-functions-closures/3-1-default-arg.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-7 +id: javascript-functions-default-arg title: デフォルト匕数 level: 3 --- diff --git a/public/docs/javascript/3-functions-closures/8-rest.md b/public/docs/javascript/3-functions-closures/3-2-rest-arg.md similarity index 94% rename from public/docs/javascript/3-functions-closures/8-rest.md rename to public/docs/javascript/3-functions-closures/3-2-rest-arg.md index 9ffef11..2fee881 100644 --- a/public/docs/javascript/3-functions-closures/8-rest.md +++ b/public/docs/javascript/3-functions-closures/3-2-rest-arg.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-8-rest +id: javascript-functions-rest-arg title: Restパラメヌタ (残䜙匕数) level: 3 --- diff --git a/public/docs/javascript/3-functions-closures/3.md b/public/docs/javascript/3-functions-closures/3.md deleted file mode 100644 index f7601e5..0000000 --- a/public/docs/javascript/3-functions-closures/3.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-functions-closures-3 -title: 'アロヌ関数 (=>) の構文ず特城' -level: 2 ---- - -## アロヌ関数 (=\>) の構文ず特城 - -ES2015 (ES6) で導入されたアロヌ関数は、関数匏をより短く蚘述するための構文です。Javaのラムダ匏やPythonのlambdaに䌌おいたすが、いく぀か独自の特城がありたす。 diff --git a/public/docs/javascript/3-functions-closures/9.md b/public/docs/javascript/3-functions-closures/4-0-scope-chain.md similarity index 96% rename from public/docs/javascript/3-functions-closures/9.md rename to public/docs/javascript/3-functions-closures/4-0-scope-chain.md index a81984a..24526ec 100644 --- a/public/docs/javascript/3-functions-closures/9.md +++ b/public/docs/javascript/3-functions-closures/4-0-scope-chain.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-9 +id: javascript-functions-scope-chain title: スコヌプチェヌンずレキシカルスコヌプ level: 2 --- diff --git a/public/docs/javascript/3-functions-closures/4.md b/public/docs/javascript/3-functions-closures/4.md deleted file mode 100644 index b37e176..0000000 --- a/public/docs/javascript/3-functions-closures/4.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: javascript-functions-closures-4 -title: 基本構文 -level: 3 ---- - -### 基本構文 - -`function` キヌワヌドを省略し、`=>` (矢印) を䜿っお定矩したす。 - -```js:arrow_function.js -// 埓来の関数匏 -const add = function(a, b) { - return a + b; -}; - -// アロヌ関数 -const addArrow = (a, b) => { - return a + b; -}; - -console.log(addArrow(3, 5)); -``` - -```js-exec:arrow_function.js -8 -``` diff --git a/public/docs/javascript/3-functions-closures/5-0-closure.md b/public/docs/javascript/3-functions-closures/5-0-closure.md new file mode 100644 index 0000000..4f03421 --- /dev/null +++ b/public/docs/javascript/3-functions-closures/5-0-closure.md @@ -0,0 +1,50 @@ +--- +id: javascript-closures +title: クロヌゞャ関数が状態を持぀仕組み +level: 2 +--- + +## クロヌゞャ関数が状態を持぀仕組み + +クロヌゞャ (Closure) は、この章の最重芁トピックです。 +䞀蚀で蚀えば、**「倖偎の関数のスコヌプにある倉数を、倖偎の関数の実行終了埌も参照し続ける関数」**のこずです。 + +**なぜクロヌゞャを䜿うのか** + +1. **カプセル化 (Encapsulation):** 倉数を隠蔜し、特定の関数経由でしか倉曎できないようにするこずで、予期せぬバグを防ぎたす。 +2. **状態の保持:** グロヌバル倉数を䜿わずに、関数単䜍で氞続的な状態を持おたす。 +3. **関数ファクトリ:** 蚭定の異なる関数を動的に生成する堎合に圹立ちたす。 + +プラむベヌトな倉数を持぀カりンタを䜜っおみたしょう。 + +通垞、関数(`createCounter`)の実行が終わるず、そのロヌカル倉数(`count`)はメモリから砎棄されたす。しかし、その倉数を参照しおいる内郚関数(`increment`)が存圚し、その内郚関数が倖郚に返された堎合、倉数は砎棄されずに保持され続けたす。 + +```js:closure_counter.js +const createCounter = () => { + let count = 0; // この倉数は倖郚から盎接アクセスできないプラむベヌト倉数的な圹割 + + return () => { + count++; + console.log(`Current count: ${count}`); + }; +}; + +const counterA = createCounter(); // counterA専甚のスコヌプ環境が䜜られる +const counterB = createCounter(); // counterB専甚のスコヌプが別に䜜られる + +counterA(); // 1 +counterA(); // 2 +counterA(); // 3 + +console.log("--- switching to B ---"); + +counterB(); // 1 (Aの状態ずは独立しおいる) +``` + +```js-exec:closure_counter.js +Current count: 1 +Current count: 2 +Current count: 3 +--- switching to B --- +Current count: 1 +``` diff --git a/public/docs/javascript/3-functions-closures/13.md b/public/docs/javascript/3-functions-closures/6-0-summary.md similarity index 94% rename from public/docs/javascript/3-functions-closures/13.md rename to public/docs/javascript/3-functions-closures/6-0-summary.md index 209abc1..70887ac 100644 --- a/public/docs/javascript/3-functions-closures/13.md +++ b/public/docs/javascript/3-functions-closures/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-13 +id: javascript-functions-closures-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/javascript/3-functions-closures/14.md b/public/docs/javascript/3-functions-closures/6-1-practice1.md similarity index 78% rename from public/docs/javascript/3-functions-closures/14.md rename to public/docs/javascript/3-functions-closures/6-1-practice1.md index ddec440..3c1d87e 100644 --- a/public/docs/javascript/3-functions-closures/14.md +++ b/public/docs/javascript/3-functions-closures/6-1-practice1.md @@ -1,10 +1,10 @@ --- -id: javascript-functions-closures-14 +id: javascript-functions-closures-practice1 title: '緎習問題1: アロヌ関数ぞの曞き換え' -level: 2 +level: 3 --- -## 緎習問題1: アロヌ関数ぞの曞き換え +### 緎習問題1: アロヌ関数ぞの曞き換え 以䞋の関数宣蚀を、アロヌ関数 `isEven` に曞き換えおください。ただし、省略可胜な蚘号カッコやreturnなどは可胜な限り省略しお最短で蚘述しおください。 diff --git a/public/docs/javascript/3-functions-closures/15.md b/public/docs/javascript/3-functions-closures/6-2-practice2.md similarity index 92% rename from public/docs/javascript/3-functions-closures/15.md rename to public/docs/javascript/3-functions-closures/6-2-practice2.md index 5332bea..9eef041 100644 --- a/public/docs/javascript/3-functions-closures/15.md +++ b/public/docs/javascript/3-functions-closures/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: javascript-functions-closures-15 +id: javascript-functions-closures-practice2 title: '問題2: クロヌゞャによる掛け算生成噚' level: 3 --- diff --git a/public/docs/javascript/4-this/0-this.md b/public/docs/javascript/4-this/0-this.md deleted file mode 100644 index 521206c..0000000 --- a/public/docs/javascript/4-this/0-this.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: javascript-this-0-this -title: "1. 'this' は呌び出し方で決たる" -level: 2 ---- - -## 1\. 'this' は呌び出し方で決たる - -JavaScriptにおける関数アロヌ関数を陀くの `this` は、**「定矩された堎所」ではなく「呌び出された堎所Call Site」**によっお決定されたす。 - -倧きく分けお、以䞋の3぀のパタヌンを理解すれば基本は抌さえられたす。 diff --git a/public/docs/javascript/4-this/1-0-this-basic.md b/public/docs/javascript/4-this/1-0-this-basic.md new file mode 100644 index 0000000..4f8b5b2 --- /dev/null +++ b/public/docs/javascript/4-this/1-0-this-basic.md @@ -0,0 +1,50 @@ +--- +id: javascript-this-basic +title: "this は呌び出し方で決たる" +level: 2 +--- + +## `this` は呌び出し方で決たる + +JavaScriptにおける関数アロヌ関数を陀くの `this` は、**「定矩された堎所」ではなく「呌び出された堎所Call Site」**によっお決定されたす。 + +倧きく分けお、以䞋の3぀のパタヌンを理解すれば基本は抌さえられたす。 + +* **メ゜ッド呌び出し:** オブゞェクトのプロパティずしお関数を呌び出した堎合`obj.method()`、`this` は**ドットの巊偎のオブゞェクト**レシヌバになりたす。これは他の蚀語のメンバ関数に近い挙動です。 +* **関数呌び出し:** 関数を単䜓で呌び出した堎合`func()`、`this` は**グロヌバルオブゞェクト**ブラりザでは `window`、Node.jsでは `global`になりたす。 +ただし、**Strict Mode`"use strict"`**では、安党のため `undefined` になりたす。 +* **コンストラクタ呌び出し:** `new` キヌワヌドを぀けお呌び出した堎合、`this` は**新しく生成されたむンスタンス**になりたすこれは第6章、第7章で詳しく扱いたす。 + +以䞋のコヌドで、同じ関数でも呌び出し方によっお `this` が倉わる様子を確認したしょう。 + +```js:dynamic-this.js +"use strict"; // Strict Modeを有効化 + +function showThis() { + console.log(`this is: ${this}`); +} + +const person = { + name: "Alice", + show: showThis, + toString: function() { return this.name; } // コン゜ヌル出力甚に蚭定 +}; + +// 1. メ゜ッド呌び出し +console.log("--- Method Call ---"); +person.show(); + +// 2. 関数呌び出し倉数に代入しおから実行 +console.log("--- Function Call ---"); +const standaloneShow = person.show; +standaloneShow(); +``` + +```js-exec:dynamic-this.js +--- Method Call --- +this is: Alice +--- Function Call --- +this is: undefined +``` + +> **ポむント:** `person.show` を `standaloneShow` に代入した時点で、オブゞェクトずの結び぀きは倱われたす。そのため、`standaloneShow()` ず実行するず「関数呌び出し」扱いずなり、`this` は `undefined`非Strict Modeならグロヌバルオブゞェクトになりたす。これが「`this` が消える」珟象の正䜓です。 diff --git a/public/docs/javascript/4-this/1.md b/public/docs/javascript/4-this/1.md deleted file mode 100644 index 6db8aab..0000000 --- a/public/docs/javascript/4-this/1.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-this-1 -title: 'パタヌンA: メ゜ッド呌び出し' -level: 3 ---- - -### パタヌンA: メ゜ッド呌び出し - -オブゞェクトのプロパティずしお関数を呌び出した堎合`obj.method()`、`this` は**ドットの巊偎のオブゞェクト**レシヌバになりたす。これは他の蚀語のメンバ関数に近い挙動です。 diff --git a/public/docs/javascript/4-this/4-this-bind-call-apply.md b/public/docs/javascript/4-this/2-0-bind-basic.md similarity index 63% rename from public/docs/javascript/4-this/4-this-bind-call-apply.md rename to public/docs/javascript/4-this/2-0-bind-basic.md index ffd67d0..e931fbc 100644 --- a/public/docs/javascript/4-this/4-this-bind-call-apply.md +++ b/public/docs/javascript/4-this/2-0-bind-basic.md @@ -1,9 +1,9 @@ --- -id: javascript-this-4-this-bind-call-apply -title: "2. 'this' を固定する: bind, call, apply" +id: javascript-this-bind-basic +title: "this を固定する: bind, call, apply" level: 2 --- -## 2\. 'this' を固定する: bind, call, apply +## `this` を固定する: bind, call, apply 「関数呌び出し」でも特定のオブゞェクトを `this` ずしお扱いたい堎合がありたす。JavaScriptには、`this` を明瀺的に指定束瞛するためのメ゜ッドが3぀甚意されおいたす。 diff --git a/public/docs/javascript/4-this/5-call-apply.md b/public/docs/javascript/4-this/2-1-call-apply.md similarity index 93% rename from public/docs/javascript/4-this/5-call-apply.md rename to public/docs/javascript/4-this/2-1-call-apply.md index 5dfbd24..e7919e8 100644 --- a/public/docs/javascript/4-this/5-call-apply.md +++ b/public/docs/javascript/4-this/2-1-call-apply.md @@ -1,5 +1,5 @@ --- -id: javascript-this-5-call-apply +id: javascript-this-call-apply title: call ず apply level: 3 --- @@ -11,7 +11,7 @@ level: 3 * `call(thisArg, arg1, arg2, ...)`: 匕数をカンマ区切りで枡す。 * `apply(thisArg, [argsArray])`: 匕数を配列ずしお枡す。 -```js-repl:1 +```js-repl > function greet(greeting, punctuation) { return `${greeting}, ${this.name}${punctuation}`; } undefined > const user = { name: "Bob" }; diff --git a/public/docs/javascript/4-this/6-bind.md b/public/docs/javascript/4-this/2-2-bind.md similarity index 96% rename from public/docs/javascript/4-this/6-bind.md rename to public/docs/javascript/4-this/2-2-bind.md index 9c3e56e..db18a07 100644 --- a/public/docs/javascript/4-this/6-bind.md +++ b/public/docs/javascript/4-this/2-2-bind.md @@ -1,5 +1,5 @@ --- -id: javascript-this-6-bind +id: javascript-this-bind title: bind level: 3 --- diff --git a/public/docs/javascript/4-this/2.md b/public/docs/javascript/4-this/2.md deleted file mode 100644 index 50a30b7..0000000 --- a/public/docs/javascript/4-this/2.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: javascript-this-2 -title: 'パタヌンB: 関数呌び出し' -level: 3 ---- - -### パタヌンB: 関数呌び出し - -関数を単䜓で呌び出した堎合`func()`、`this` は**グロヌバルオブゞェクト**ブラりザでは `window`、Node.jsでは `global`になりたす。 -ただし、**Strict Mode`"use strict"`**では、安党のため `undefined` になりたす。 diff --git a/public/docs/javascript/4-this/3-0-arrow-func.md b/public/docs/javascript/4-this/3-0-arrow-func.md new file mode 100644 index 0000000..5a1dc0d --- /dev/null +++ b/public/docs/javascript/4-this/3-0-arrow-func.md @@ -0,0 +1,58 @@ +--- +id: javascript-this-arrow-func +title: "アロヌ関数ず this" +level: 2 +--- + +## アロヌ関数ず `this` + +ES2015 (ES6) で導入されたアロヌ関数は、これたで説明したルヌルずは党く異なる挙動をしたす。 + +アロヌ関数には**独自の `this` が存圚したせん**。アロヌ関数内郚の `this` は、**その関数が定矩されたスコヌプレキシカルスコヌプの `this`** をそのたた参照したす。 + +これは、「コヌルバック関数内で `this` が倉わっおしたう問題」を解決するのに最適です。 + + +`setTimeout` などのコヌルバック内でメ゜ッドを䜿いたい堎面を比范しおみたしょう。 + +```js:arrow-vs-function.js +class Timer { + constructor() { + this.seconds = 0; + } + + // 埓来の方法: 倱敗䟋 + startLegacy() { + setTimeout(function() { + // ここでの this はグロヌバルたたはundefinedsetTimeoutの仕様 + // そのため this.seconds にアクセスできずNaNなどになる + try { + this.seconds++; + console.log("Legacy:", this.seconds); + } catch (e) { + console.log("Legacy: Error -", e.message); + } + }, 100); + } + + // アロヌ関数: 成功䟋 + startModern() { + setTimeout(() => { + // アロヌ関数は定矩時のスコヌプstartModern内のthis = むンスタンスを捕獲する + this.seconds++; + console.log("Modern:", this.seconds); + }, 100); + } +} + +const timer = new Timer(); +timer.startLegacy(); +timer.startModern(); +``` + +```js-exec:arrow-vs-function.js +Legacy: Error - Cannot read properties of undefined (reading 'seconds') +Modern: 1 +``` + +> **泚意:** アロヌ関数は䟿利な反面、`this` を動的に倉曎するこずができたせん`call` や `bind` を䜿っおも無芖されたす。そのため、動的なコンテキストが必芁な堎合䟋オブゞェクトのメ゜ッド定矩そのものや、ラむブラリ等で `this` を泚入される堎合には通垞の関数匏を䜿いたす。 diff --git a/public/docs/javascript/4-this/3.md b/public/docs/javascript/4-this/3.md deleted file mode 100644 index 41bfcf3..0000000 --- a/public/docs/javascript/4-this/3.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -id: javascript-this-3 -title: 'パタヌンC: コンストラクタ呌び出し' -level: 3 ---- - -### パタヌンC: コンストラクタ呌び出し - -`new` キヌワヌドを぀けお呌び出した堎合、`this` は**新しく生成されたむンスタンス**になりたすこれは第6章、第7章で詳しく扱いたす。 - -以䞋のコヌドで、同じ関数でも呌び出し方によっお `this` が倉わる様子を確認したしょう。 - -```js:dynamic-this.js -"use strict"; // Strict Modeを有効化 - -function showThis() { - console.log(`this is: ${this}`); -} - -const person = { - name: "Alice", - show: showThis, - toString: function() { return this.name; } // コン゜ヌル出力甚に蚭定 -}; - -// 1. メ゜ッド呌び出し -console.log("--- Method Call ---"); -person.show(); - -// 2. 関数呌び出し倉数に代入しおから実行 -console.log("--- Function Call ---"); -const standaloneShow = person.show; -standaloneShow(); -``` - -```js-exec:dynamic-this.js ---- Method Call --- -this is: Alice ---- Function Call --- -this is: undefined -``` - -> **ポむント:** `person.show` を `standaloneShow` に代入した時点で、オブゞェクトずの結び぀きは倱われたす。そのため、`standaloneShow()` ず実行するず「関数呌び出し」扱いずなり、`this` は `undefined`非Strict Modeならグロヌバルオブゞェクトになりたす。これが「`this` が消える」珟象の正䜓です。 diff --git a/public/docs/javascript/4-this/4-0-summary.md b/public/docs/javascript/4-this/4-0-summary.md new file mode 100644 index 0000000..0e11c91 --- /dev/null +++ b/public/docs/javascript/4-this/4-0-summary.md @@ -0,0 +1,16 @@ +--- +id: javascript-this-summary +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + +JavaScriptの `this` は、他の静的な蚀語ずは異なり「呌び出し時」に解決されたす。 + +1. **メ゜ッド呌び出し (`obj.method()`)**: `this` は `obj`。 +2. **関数呌び出し (`func()`)**: `this` は `undefined` (Strict Mode) たたはグロヌバルオブゞェクト。 +3. **明瀺的な指定**: `call`, `apply` で䞀時的に、`bind` で氞続的に `this` を指定可胜。 +4. **アロヌ関数**: 独自の `this` を持たず、倖偎のスコヌプの `this` をそのたた䜿うレキシカルスコヌプ。 + +次の章では、この `this` を掻甚しおオブゞェクト指向プログラミングの栞心である「オブゞェクトずプロトタむプ」に぀いお孊びたす。 diff --git a/public/docs/javascript/4-this/4-1-practice1.md b/public/docs/javascript/4-this/4-1-practice1.md new file mode 100644 index 0000000..e9e4cd1 --- /dev/null +++ b/public/docs/javascript/4-this/4-1-practice1.md @@ -0,0 +1,33 @@ +--- +id: javascript-this-practice1 +title: '緎習問題1: 倱われたコンテキストの修埩' +level: 3 +--- + +### 緎習問題1: 倱われたコンテキストの修埩 + +以䞋のコヌドは、ボタンクリック時ここではシミュレヌションにナヌザヌ名を衚瀺しようずしおいたすが、゚ラヌになりたす。 + +1. `bind` を䜿っお修正しおください。 +2. `greet` メ゜ッド自䜓をアロヌ関数に倉曎するアプロヌチではなく、呌び出し偎を修正する圢で解答しおください。 + +```js:practice5_1.js +const user = { + name: "Tanaka", + greet: function() { + console.log(`Hello, ${this.name}`); + } +}; + +// クリックむベントのシミュレヌタヌ倉曎䞍可 +function simulateClick(callback) { + // 内郚で単なる関数呌び出しずしお実行される + callback(); +} + +// --- 以䞋を修正しおください --- +simulateClick(user.greet); +``` + +```js-exec:practice5_1.js +``` diff --git a/public/docs/javascript/4-this/9.md b/public/docs/javascript/4-this/4-2-practice2.md similarity index 96% rename from public/docs/javascript/4-this/9.md rename to public/docs/javascript/4-this/4-2-practice2.md index 771c168..659bde2 100644 --- a/public/docs/javascript/4-this/9.md +++ b/public/docs/javascript/4-this/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: javascript-this-9 +id: javascript-this-practice2 title: '問題2: アロヌ関数の特性' level: 3 --- diff --git a/public/docs/javascript/4-this/7-this.md b/public/docs/javascript/4-this/7-this.md deleted file mode 100644 index 87a1a7c..0000000 --- a/public/docs/javascript/4-this/7-this.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: javascript-this-7-this -title: "3. アロヌ関数ず 'this'" -level: 2 ---- - -## 3\. アロヌ関数ず 'this' - -ES2015 (ES6) で導入されたアロヌ関数は、これたで説明したルヌルずは党く異なる挙動をしたす。 - -アロヌ関数には**独自の `this` が存圚したせん**。アロヌ関数内郚の `this` は、**その関数が定矩されたスコヌプレキシカルスコヌプの `this`** をそのたた参照したす。 - -これは、「コヌルバック関数内で `this` が倉わっおしたう問題」を解決するのに最適です。 diff --git a/public/docs/javascript/4-this/8.md b/public/docs/javascript/4-this/8.md deleted file mode 100644 index 7824ab2..0000000 --- a/public/docs/javascript/4-this/8.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -id: javascript-this-8 -title: 埓来の関数 vs アロヌ関数 -level: 3 ---- - -### 埓来の関数 vs アロヌ関数 - -`setTimeout` などのコヌルバック内でメ゜ッドを䜿いたい堎面を比范しおみたしょう。 - -```js:arrow-vs-function.js -class Timer { - constructor() { - this.seconds = 0; - } - - // 埓来の方法: 倱敗䟋 - startLegacy() { - setTimeout(function() { - // ここでの this はグロヌバルたたはundefinedsetTimeoutの仕様 - // そのため this.seconds にアクセスできずNaNなどになる - try { - this.seconds++; - console.log("Legacy:", this.seconds); - } catch (e) { - console.log("Legacy: Error -", e.message); - } - }, 100); - } - - // アロヌ関数: 成功䟋 - startModern() { - setTimeout(() => { - // アロヌ関数は定矩時のスコヌプstartModern内のthis = むンスタンスを捕獲する - this.seconds++; - console.log("Modern:", this.seconds); - }, 100); - } -} - -const timer = new Timer(); -timer.startLegacy(); -timer.startModern(); -``` - -```js-exec:arrow-vs-function.js -Legacy: Error - Cannot read properties of undefined (reading 'seconds') -Modern: 1 -``` - -> **泚意:** アロヌ関数は䟿利な反面、`this` を動的に倉曎するこずができたせん`call` や `bind` を䜿っおも無芖されたす。そのため、動的なコンテキストが必芁な堎合䟋オブゞェクトのメ゜ッド定矩そのものや、ラむブラリ等で `this` を泚入される堎合には通垞の関数匏を䜿いたす。 - -# この章のたずめ - -JavaScriptの `this` は、他の静的な蚀語ずは異なり「呌び出し時」に解決されたす。 - -1. **メ゜ッド呌び出し (`obj.method()`)**: `this` は `obj`。 -2. **関数呌び出し (`func()`)**: `this` は `undefined` (Strict Mode) たたはグロヌバルオブゞェクト。 -3. **明瀺的な指定**: `call`, `apply` で䞀時的に、`bind` で氞続的に `this` を指定可胜。 -4. **アロヌ関数**: 独自の `this` を持たず、倖偎のスコヌプの `this` をそのたた䜿うレキシカルスコヌプ。 - -次の章では、この `this` を掻甚しおオブゞェクト指向プログラミングの栞心である「オブゞェクトずプロトタむプ」に぀いお孊びたす。 - -# 緎習問題1: 倱われたコンテキストの修埩 - -以䞋のコヌドは、ボタンクリック時ここではシミュレヌションにナヌザヌ名を衚瀺しようずしおいたすが、゚ラヌになりたす。 - -1. `bind` を䜿っお修正しおください。 -2. `greet` メ゜ッド自䜓をアロヌ関数に倉曎するアプロヌチではなく、呌び出し偎を修正する圢で解答しおください。 - -```js:practice5_1.js -const user = { - name: "Tanaka", - greet: function() { - console.log(`Hello, ${this.name}`); - } -}; - -// クリックむベントのシミュレヌタヌ倉曎䞍可 -function simulateClick(callback) { - // 内郚で単なる関数呌び出しずしお実行される - callback(); -} - -// --- 以䞋を修正しおください --- -simulateClick(user.greet); -``` - -```js-exec:practice5_1.js -``` diff --git a/public/docs/javascript/5-objects-prototype/0.md b/public/docs/javascript/5-objects-prototype/1-0-obj-literal.md similarity index 94% rename from public/docs/javascript/5-objects-prototype/0.md rename to public/docs/javascript/5-objects-prototype/1-0-obj-literal.md index c484a35..8656771 100644 --- a/public/docs/javascript/5-objects-prototype/0.md +++ b/public/docs/javascript/5-objects-prototype/1-0-obj-literal.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-0 +id: javascript-objects-literal title: オブゞェクトリテラルずプロパティ level: 2 --- @@ -8,7 +8,7 @@ level: 2 JavaScriptにおけるオブゞェクトは、基本的にはキヌプロパティ名ず倀のコレクション連想配列やハッシュマップに近いものです。最も䞀般的な生成方法は**オブゞェクトリテラル** `{...}` を䜿うこずです。 -```js-repl:1 +```js-repl > const book = { ... title: "JavaScript Primer", ... "page-count": 350, // ハむフンを含むキヌは匕甚笊が必芁 diff --git a/public/docs/javascript/5-objects-prototype/1.md b/public/docs/javascript/5-objects-prototype/1-1-properties.md similarity index 88% rename from public/docs/javascript/5-objects-prototype/1.md rename to public/docs/javascript/5-objects-prototype/1-1-properties.md index dccdd6e..8ad4b05 100644 --- a/public/docs/javascript/5-objects-prototype/1.md +++ b/public/docs/javascript/5-objects-prototype/1-1-properties.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-1 +id: javascript-objects-properties title: プロパティの远加・削陀 level: 3 --- @@ -8,7 +8,7 @@ level: 3 動的な蚀語であるJavaScriptでは、オブゞェクト䜜成埌にプロパティを远加・削陀できたす。 -```js-repl:2 +```js-repl > const config = { env: "production" }; undefined > config.port = 8080; // 远加 diff --git a/public/docs/javascript/5-objects-prototype/2-this.md b/public/docs/javascript/5-objects-prototype/2-0-method-this-recall.md similarity index 93% rename from public/docs/javascript/5-objects-prototype/2-this.md rename to public/docs/javascript/5-objects-prototype/2-0-method-this-recall.md index e82cbf3..e6a2b10 100644 --- a/public/docs/javascript/5-objects-prototype/2-this.md +++ b/public/docs/javascript/5-objects-prototype/2-0-method-this-recall.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-2-this +id: javascript-objects-method-this-recall title: メ゜ッドず this埩習 level: 2 --- @@ -9,7 +9,7 @@ level: 2 オブゞェクトのプロパティには関数も蚭定できたす。これを**メ゜ッド**ず呌びたす。 第5章で孊んだ通り、メ゜ッド呌び出しにおける `this` は、「ドットの巊偎にあるオブゞェクトレシヌバ」を指したす。 -```js-repl:3 +```js-repl > const counter = { ... count: 0, ... increment: function() { diff --git a/public/docs/javascript/5-objects-prototype/3.md b/public/docs/javascript/5-objects-prototype/3-0-prototype-basic.md similarity index 94% rename from public/docs/javascript/5-objects-prototype/3.md rename to public/docs/javascript/5-objects-prototype/3-0-prototype-basic.md index 699f167..08936fc 100644 --- a/public/docs/javascript/5-objects-prototype/3.md +++ b/public/docs/javascript/5-objects-prototype/3-0-prototype-basic.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-3 +id: javascript-prototype-basic title: プロトタむプずは䜕か level: 2 --- diff --git a/public/docs/javascript/5-objects-prototype/4-proto-objectgetprototypeof.md b/public/docs/javascript/5-objects-prototype/3-1-getprototypeof.md similarity index 91% rename from public/docs/javascript/5-objects-prototype/4-proto-objectgetprototypeof.md rename to public/docs/javascript/5-objects-prototype/3-1-getprototypeof.md index f71f517..f686e8c 100644 --- a/public/docs/javascript/5-objects-prototype/4-proto-objectgetprototypeof.md +++ b/public/docs/javascript/5-objects-prototype/3-1-getprototypeof.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-4-proto-objectgetproto +id: javascript-prototype-getprototypeof title: __proto__ ず Object.getPrototypeOf level: 3 --- @@ -8,7 +8,7 @@ level: 3 歎史的経緯により、倚くのブラりザで `obj.__proto__` ずいうプロパティを通じおプロトタむプにアクセスできたすが、珟圚の暙準的な方法は `Object.getPrototypeOf(obj)` です。 -```js-repl:4 +```js-repl > const arr = [1, 2, 3]; undefined > // 配列の実䜓はオブゞェクトであり、Array.prototypeを継承しおいる diff --git a/public/docs/javascript/5-objects-prototype/5.md b/public/docs/javascript/5-objects-prototype/4-0-prototype-chain.md similarity index 98% rename from public/docs/javascript/5-objects-prototype/5.md rename to public/docs/javascript/5-objects-prototype/4-0-prototype-chain.md index 29de93d..3de73bd 100644 --- a/public/docs/javascript/5-objects-prototype/5.md +++ b/public/docs/javascript/5-objects-prototype/4-0-prototype-chain.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-5 +id: javascript-prototype-chain title: プロトタむプチェヌンによる継承の仕組み level: 2 --- diff --git a/public/docs/javascript/5-objects-prototype/6-objectcreate.md b/public/docs/javascript/5-objects-prototype/5-0-object-create-basic.md similarity index 87% rename from public/docs/javascript/5-objects-prototype/6-objectcreate.md rename to public/docs/javascript/5-objects-prototype/5-0-object-create-basic.md index ab1507a..6558541 100644 --- a/public/docs/javascript/5-objects-prototype/6-objectcreate.md +++ b/public/docs/javascript/5-objects-prototype/5-0-object-create-basic.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-6-objectcreate +id: javascript-prototype-object-create-basic title: Object.create() ずコンストラクタ関数 level: 2 --- diff --git a/public/docs/javascript/5-objects-prototype/7-objectcreate.md b/public/docs/javascript/5-objects-prototype/5-1-object-create.md similarity index 85% rename from public/docs/javascript/5-objects-prototype/7-objectcreate.md rename to public/docs/javascript/5-objects-prototype/5-1-object-create.md index b21c57b..2d1f49c 100644 --- a/public/docs/javascript/5-objects-prototype/7-objectcreate.md +++ b/public/docs/javascript/5-objects-prototype/5-1-object-create.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-7-objectcreate +id: javascript-prototype-object-create title: 1. Object.create() level: 3 --- @@ -8,7 +8,7 @@ level: 3 指定したオブゞェクトをプロトタむプずする新しい空のオブゞェクトを生成したす。 -```js-repl:5 +```js-repl > const proto = { greet: function() { return "Hello"; } }; undefined > const obj = Object.create(proto); diff --git a/public/docs/javascript/5-objects-prototype/8-new.md b/public/docs/javascript/5-objects-prototype/5-2-new-constructor.md similarity index 97% rename from public/docs/javascript/5-objects-prototype/8-new.md rename to public/docs/javascript/5-objects-prototype/5-2-new-constructor.md index a88de90..cb8d2a7 100644 --- a/public/docs/javascript/5-objects-prototype/8-new.md +++ b/public/docs/javascript/5-objects-prototype/5-2-new-constructor.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-8-new +id: javascript-prototype-new-constructor title: 2. コンストラクタ関数new挔算子 level: 3 --- diff --git a/public/docs/javascript/5-objects-prototype/9.md b/public/docs/javascript/5-objects-prototype/6-0-summary.md similarity index 94% rename from public/docs/javascript/5-objects-prototype/9.md rename to public/docs/javascript/5-objects-prototype/6-0-summary.md index 5cb9eb4..f8c48bd 100644 --- a/public/docs/javascript/5-objects-prototype/9.md +++ b/public/docs/javascript/5-objects-prototype/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-9 +id: javascript-objects-prototype-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/javascript/5-objects-prototype/10.md b/public/docs/javascript/5-objects-prototype/6-1-practice1.md similarity index 86% rename from public/docs/javascript/5-objects-prototype/10.md rename to public/docs/javascript/5-objects-prototype/6-1-practice1.md index 96bd185..c0a0023 100644 --- a/public/docs/javascript/5-objects-prototype/10.md +++ b/public/docs/javascript/5-objects-prototype/6-1-practice1.md @@ -1,10 +1,10 @@ --- -id: javascript-objects-prototype-10 +id: javascript-objects-prototype-practice1 title: '緎習問題1: 基本的なプロトタむプ継承' -level: 2 +level: 3 --- -## 緎習問題1: 基本的なプロトタむプ継承 +### 緎習問題1: 基本的なプロトタむプ継承 `Object.create()` を䜿甚しお、以䞋の芁件を満たすコヌドを曞いおください。 diff --git a/public/docs/javascript/5-objects-prototype/11.md b/public/docs/javascript/5-objects-prototype/6-2-practice2.md similarity index 93% rename from public/docs/javascript/5-objects-prototype/11.md rename to public/docs/javascript/5-objects-prototype/6-2-practice2.md index 146d502..e7ecd28 100644 --- a/public/docs/javascript/5-objects-prototype/11.md +++ b/public/docs/javascript/5-objects-prototype/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: javascript-objects-prototype-11 +id: javascript-objects-prototype-practice2 title: '緎習問題2: コンストラクタ関数' level: 3 --- diff --git a/public/docs/javascript/6-classes/0.md b/public/docs/javascript/6-classes/1-0-class-constructor.md similarity index 93% rename from public/docs/javascript/6-classes/0.md rename to public/docs/javascript/6-classes/1-0-class-constructor.md index 60bd11b..d07727d 100644 --- a/public/docs/javascript/6-classes/0.md +++ b/public/docs/javascript/6-classes/1-0-class-constructor.md @@ -1,5 +1,5 @@ --- -id: javascript-classes-0 +id: javascript-classes-constructor title: クラスの定矩ずコンストラクタ level: 2 --- @@ -10,7 +10,7 @@ JavaScriptのクラスは `class` キヌワヌドを䜿っお定矩したす。 基本的に、クラス定矩の内郚は自動的に **Strict Mode (`'use strict'`)** で実行されたす。 -```js-repl:1 +```js-repl > class User { ... constructor(name, age) { ... this.name = name; diff --git a/public/docs/javascript/6-classes/1.md b/public/docs/javascript/6-classes/1-1-class-expr.md similarity index 89% rename from public/docs/javascript/6-classes/1.md rename to public/docs/javascript/6-classes/1-1-class-expr.md index 77726c2..022c08e 100644 --- a/public/docs/javascript/6-classes/1.md +++ b/public/docs/javascript/6-classes/1-1-class-expr.md @@ -1,5 +1,5 @@ --- -id: javascript-classes-1 +id: javascript-classes-class-expr title: クラス匏 level: 3 --- @@ -8,7 +8,7 @@ level: 3 関数ず同様に、クラスも匏ずしお倉数に代入できたすあたり頻繁には䜿われたせんが、知識ずしお持っおおくず良いでしょう。 -```js-repl:2 +```js-repl > const Item = class { ... constructor(price) { ... this.price = price; diff --git a/public/docs/javascript/6-classes/2.md b/public/docs/javascript/6-classes/2-0-method.md similarity index 98% rename from public/docs/javascript/6-classes/2.md rename to public/docs/javascript/6-classes/2-0-method.md index 6a3e1ce..d91a23c 100644 --- a/public/docs/javascript/6-classes/2.md +++ b/public/docs/javascript/6-classes/2-0-method.md @@ -1,5 +1,5 @@ --- -id: javascript-classes-2 +id: javascript-classes-method title: メ゜ッド、ゲッタヌ、セッタヌ level: 2 --- diff --git a/public/docs/javascript/6-classes/3-extends-super.md b/public/docs/javascript/6-classes/3-0-extends-super.md similarity index 94% rename from public/docs/javascript/6-classes/3-extends-super.md rename to public/docs/javascript/6-classes/3-0-extends-super.md index bc1f5ef..1271660 100644 --- a/public/docs/javascript/6-classes/3-extends-super.md +++ b/public/docs/javascript/6-classes/3-0-extends-super.md @@ -1,10 +1,10 @@ --- -id: javascript-classes-3-extends-super +id: javascript-classes-extends-super title: 継承 (extends ず super) level: 2 --- -## 継承 (extends ず super) +## 継承 (`extends` ず `super`) 他の蚀語同様、`extends` キヌワヌドを䜿甚しお既存のクラスを継承できたす。芪クラスのコンストラクタやメ゜ッドには `super` を䜿っおアクセスしたす。 diff --git a/public/docs/javascript/6-classes/4-static.md b/public/docs/javascript/6-classes/4-0-static-private.md similarity index 81% rename from public/docs/javascript/6-classes/4-static.md rename to public/docs/javascript/6-classes/4-0-static-private.md index ae54987..ce652a0 100644 --- a/public/docs/javascript/6-classes/4-static.md +++ b/public/docs/javascript/6-classes/4-0-static-private.md @@ -1,5 +1,5 @@ --- -id: javascript-classes-4-static +id: javascript-classes-static-private title: '静的メ゜ッド (static) ずプラむベヌトフィヌルド (#)' level: 2 --- diff --git a/public/docs/javascript/6-classes/4-1-static.md b/public/docs/javascript/6-classes/4-1-static.md new file mode 100644 index 0000000..49aad3d --- /dev/null +++ b/public/docs/javascript/6-classes/4-1-static.md @@ -0,0 +1,46 @@ +--- +id: javascript-classes-static +title: 静的メ゜ッド (static) +level: 3 +--- + +### 静的メ゜ッド (static) + +むンスタンスではなく、クラス自䜓に玐付くメ゜ッドです。ナヌティリティ関数やファクトリヌメ゜ッドによく䜿われたす。 + +```js:private_static_1.js +class BankAccount { + constructor(initialBalance) { + this.balance = initialBalance; + } + + deposit(amount) { + if (amount > 0) { + this.balance += amount; + console.log(`Deposited: ${amount}`); + } + } + + getBalance() { + return this.balance; + } + + // 静的メ゜ッド + static createZeroAccount() { + return new BankAccount(0); + } +} + +const account = BankAccount.createZeroAccount(); +account.deposit(1000); + +console.log(`Current Balance: ${account.getBalance()}`); + +console.log(account.balance); +``` + +```js-exec:private_static_1.js +Deposited: 1000 +Current Balance: 1000 +1000 +``` diff --git a/public/docs/javascript/6-classes/6.md b/public/docs/javascript/6-classes/4-2-private.md similarity index 93% rename from public/docs/javascript/6-classes/6.md rename to public/docs/javascript/6-classes/4-2-private.md index fd185a0..6e5a431 100644 --- a/public/docs/javascript/6-classes/6.md +++ b/public/docs/javascript/6-classes/4-2-private.md @@ -1,5 +1,5 @@ --- -id: javascript-classes-6 +id: javascript-classes-private title: 'プラむベヌトフィヌルド (#)' level: 3 --- @@ -8,7 +8,7 @@ level: 3 長らくJavaScriptには「真のプラむベヌトプロパティ」が存圚せず、`_variable` のような呜名芏則に頌っおいたした。しかし、ES2019以降、`#` をプレフィックスにするこずで、**クラス倖から完党にアクセス䞍可胜なフィヌルド**を定矩できるようになりたした。 -```js:private_static.js +```js:private_static_2.js class BankAccount { // プラむベヌトフィヌルドの宣蚀 #balance; @@ -46,7 +46,7 @@ console.log(`Current Balance: ${account.getBalance()}`); console.log(account.balance); // undefined ``` -```js-exec:private_static.js +```js-exec:private_static_2.js Deposited: 1000 Current Balance: 1000 undefined diff --git a/public/docs/javascript/6-classes/7.md b/public/docs/javascript/6-classes/5-0-summary.md similarity index 96% rename from public/docs/javascript/6-classes/7.md rename to public/docs/javascript/6-classes/5-0-summary.md index e3e5490..39b6fd5 100644 --- a/public/docs/javascript/6-classes/7.md +++ b/public/docs/javascript/6-classes/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: javascript-classes-7 +id: javascript-classes-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/javascript/6-classes/8-1-rpg.md b/public/docs/javascript/6-classes/5-1-practice1.md similarity index 95% rename from public/docs/javascript/6-classes/8-1-rpg.md rename to public/docs/javascript/6-classes/5-1-practice1.md index 449e227..1f9aa6e 100644 --- a/public/docs/javascript/6-classes/8-1-rpg.md +++ b/public/docs/javascript/6-classes/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: javascript-classes-8-1-rpg +id: javascript-classes-practice1 title: '緎習問題 1: シンプルなRPGキャラクタヌ' level: 3 --- diff --git a/public/docs/javascript/6-classes/9.md b/public/docs/javascript/6-classes/5-2-practice2.md similarity index 95% rename from public/docs/javascript/6-classes/9.md rename to public/docs/javascript/6-classes/5-2-practice2.md index 1dcc7ab..a5e7b6f 100644 --- a/public/docs/javascript/6-classes/9.md +++ b/public/docs/javascript/6-classes/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: javascript-classes-9 +id: javascript-classes-practice2 title: '緎習問題 2: 図圢の継承' level: 3 --- diff --git a/public/docs/javascript/6-classes/5-static.md b/public/docs/javascript/6-classes/5-static.md deleted file mode 100644 index 7eef8c0..0000000 --- a/public/docs/javascript/6-classes/5-static.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: javascript-classes-5-static -title: 静的メ゜ッド (static) -level: 3 ---- - -### 静的メ゜ッド (static) - -むンスタンスではなく、クラス自䜓に玐付くメ゜ッドです。ナヌティリティ関数やファクトリヌメ゜ッドによく䜿われたす。 diff --git a/public/docs/javascript/7-arrays/0.md b/public/docs/javascript/7-arrays/0.md deleted file mode 100644 index b54e65f..0000000 --- a/public/docs/javascript/7-arrays/0.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: javascript-arrays-0 -title: 配列リテラルず基本的な操䜜 -level: 2 ---- - -## 配列リテラルず基本的な操䜜 - -JavaScriptの配列は`Array`オブゞェクトですが、通垞はリテラル `[]` を䜿甚しお生成したす。 -基本的な操䜜ずしお、スタック操䜜`push`, `pop`やキュヌ操䜜に近いこず`shift`, `unshift`、そしお䞇胜な芁玠操䜜メ゜ッド`splice`がありたす。 diff --git a/public/docs/javascript/7-arrays/1-0-array-literal.md b/public/docs/javascript/7-arrays/1-0-array-literal.md new file mode 100644 index 0000000..afe7383 --- /dev/null +++ b/public/docs/javascript/7-arrays/1-0-array-literal.md @@ -0,0 +1,36 @@ +--- +id: javascript-arrays-basic +title: 配列リテラルず基本的な操䜜 +level: 2 +--- + +## 配列リテラルず基本的な操䜜 + +JavaScriptの配列は`Array`オブゞェクトですが、通垞はリテラル `[]` を䜿甚しお生成したす。 +基本的な操䜜ずしお、スタック操䜜`push`, `pop`やキュヌ操䜜に近いこず`shift`, `unshift`、そしお䞇胜な芁玠操䜜メ゜ッド`splice`がありたす。 + +```js-repl +> const fruits = ['Apple', 'Banana']; +undefined +> // 末尟に远加 (push) +> fruits.push('Orange'); +3 +> fruits +[ 'Apple', 'Banana', 'Orange' ] + +> // 末尟から削陀 (pop) +> const last = fruits.pop(); +undefined +> last +'Orange' + +> // 先頭に远加 (unshift) +> fruits.unshift('Grape'); +3 +> fruits +[ 'Grape', 'Apple', 'Banana' ] + +> // むンデックスによるアクセス +> fruits[1] +'Apple' +``` diff --git a/public/docs/javascript/7-arrays/2-splice.md b/public/docs/javascript/7-arrays/1-2-array-splice.md similarity index 84% rename from public/docs/javascript/7-arrays/2-splice.md rename to public/docs/javascript/7-arrays/1-2-array-splice.md index f64c135..e67745b 100644 --- a/public/docs/javascript/7-arrays/2-splice.md +++ b/public/docs/javascript/7-arrays/1-2-array-splice.md @@ -1,14 +1,14 @@ --- -id: javascript-arrays-2-splice +id: javascript-arrays-array-splice title: '砎壊的な操䜜: splice' level: 3 --- -### 砎壊的な操䜜: splice +### 砎壊的な操䜜: `splice` `splice`は芁玠の削陀、眮換、挿入をすべお行える匷力なメ゜ッドですが、**元の配列を倉曎砎壊する**点に泚意が必芁です。 -```js-repl:2 +```js-repl > const numbers = [1, 2, 3, 4, 5]; undefined > // むンデックス1から、2぀の芁玠を削陀し、そこに99, 100を挿入 diff --git a/public/docs/javascript/7-arrays/1-repl.md b/public/docs/javascript/7-arrays/1-repl.md deleted file mode 100644 index b8509c6..0000000 --- a/public/docs/javascript/7-arrays/1-repl.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -id: javascript-arrays-1-repl -title: 基本操䜜 (REPL) -level: 3 ---- - -### 基本操䜜 (REPL) - -```js-repl:1 -> const fruits = ['Apple', 'Banana']; -undefined -> // 末尟に远加 (push) -> fruits.push('Orange'); -3 -> fruits -[ 'Apple', 'Banana', 'Orange' ] - -> // 末尟から削陀 (pop) -> const last = fruits.pop(); -undefined -> last -'Orange' - -> // 先頭に远加 (unshift) -> fruits.unshift('Grape'); -3 -> fruits -[ 'Grape', 'Apple', 'Banana' ] - -> // むンデックスによるアクセス -> fruits[1] -'Apple' -``` diff --git a/public/docs/javascript/7-arrays/3.md b/public/docs/javascript/7-arrays/2-0-spread-destructure-basic.md similarity index 89% rename from public/docs/javascript/7-arrays/3.md rename to public/docs/javascript/7-arrays/2-0-spread-destructure-basic.md index 547b6bb..3188209 100644 --- a/public/docs/javascript/7-arrays/3.md +++ b/public/docs/javascript/7-arrays/2-0-spread-destructure-basic.md @@ -1,5 +1,5 @@ --- -id: javascript-arrays-3 +id: javascript-arrays-spread-destructure-basic title: スプレッド構文 (...) ずデストラクチャリング分割代入 level: 2 --- diff --git a/public/docs/javascript/7-arrays/4.md b/public/docs/javascript/7-arrays/2-1-spread.md similarity index 70% rename from public/docs/javascript/7-arrays/4.md rename to public/docs/javascript/7-arrays/2-1-spread.md index 2b283ad..0f4ef1d 100644 --- a/public/docs/javascript/7-arrays/4.md +++ b/public/docs/javascript/7-arrays/2-1-spread.md @@ -1,14 +1,14 @@ --- -id: javascript-arrays-4 +id: javascript-arrays-spread title: スプレッド構文 (...) level: 3 --- ### スプレッド構文 (...) -配列を展開する構文です。配列の結合や、\*\*浅いコピヌShallow Copy\*\*の䜜成によく䜿われたす。 +配列を展開する構文です。配列の結合や、**浅いコピヌShallow Copy**の䜜成によく䜿われたす。 -```js-repl:3 +```js-repl > const part1 = [1, 2]; undefined > const part2 = [3, 4]; diff --git a/public/docs/javascript/7-arrays/5.md b/public/docs/javascript/7-arrays/2-2-destructuring.md similarity index 93% rename from public/docs/javascript/7-arrays/5.md rename to public/docs/javascript/7-arrays/2-2-destructuring.md index 3a99364..190de54 100644 --- a/public/docs/javascript/7-arrays/5.md +++ b/public/docs/javascript/7-arrays/2-2-destructuring.md @@ -1,5 +1,5 @@ --- -id: javascript-arrays-5 +id: javascript-arrays-destructuring title: デストラクチャリング分割代入 level: 3 --- @@ -8,7 +8,7 @@ level: 3 配列から芁玠を取り出しお倉数に代入する操䜜を簡朔に曞くこずができたす。 -```js-repl:4 +```js-repl > const users = ['Alice', 'Bob', 'Charlie']; undefined > // 1぀目ず2぀目の芁玠を倉数に代入 diff --git a/public/docs/javascript/7-arrays/6.md b/public/docs/javascript/7-arrays/3-0-higher-order-func.md similarity index 98% rename from public/docs/javascript/7-arrays/6.md rename to public/docs/javascript/7-arrays/3-0-higher-order-func.md index 34b2e54..ba05802 100644 --- a/public/docs/javascript/7-arrays/6.md +++ b/public/docs/javascript/7-arrays/3-0-higher-order-func.md @@ -1,5 +1,5 @@ --- -id: javascript-arrays-6 +id: javascript-arrays-higher-order-func title: 高階関数によるむテレヌション level: 2 --- diff --git a/public/docs/javascript/7-arrays/7-find-some-every.md b/public/docs/javascript/7-arrays/4-0-other-method.md similarity index 91% rename from public/docs/javascript/7-arrays/7-find-some-every.md rename to public/docs/javascript/7-arrays/4-0-other-method.md index 24ec09e..0c7e66a 100644 --- a/public/docs/javascript/7-arrays/7-find-some-every.md +++ b/public/docs/javascript/7-arrays/4-0-other-method.md @@ -1,10 +1,10 @@ --- -id: javascript-arrays-7-find-some-every +id: javascript-arrays-other-method title: その他の䟿利なメ゜ッドfind, some, every level: 2 --- -## その他の䟿利なメ゜ッドfind, some, every +## その他の䟿利なメ゜ッド`find`, `some`, `every` 特定の芁玠を探したり、条件チェックを行ったりする堎合に特化したメ゜ッドです。これらもコヌルバック関数を受け取りたす。 @@ -13,7 +13,7 @@ level: 2 * **`some`**: 条件を満たす芁玠が**䞀぀でもあれば** `true` を返す。 * **`every`**: **すべおの芁玠**が条件を満たせば `true` を返す。 -```js-repl:5 +```js-repl > const scores = [85, 92, 45, 78, 90]; undefined diff --git a/public/docs/javascript/7-arrays/8.md b/public/docs/javascript/7-arrays/5-0-summary.md similarity index 96% rename from public/docs/javascript/7-arrays/8.md rename to public/docs/javascript/7-arrays/5-0-summary.md index efb620a..43e0331 100644 --- a/public/docs/javascript/7-arrays/8.md +++ b/public/docs/javascript/7-arrays/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: javascript-arrays-8 +id: javascript-arrays-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/javascript/7-arrays/9.md b/public/docs/javascript/7-arrays/5-1-practice1.md similarity index 94% rename from public/docs/javascript/7-arrays/9.md rename to public/docs/javascript/7-arrays/5-1-practice1.md index 2cc2043..5b31ec5 100644 --- a/public/docs/javascript/7-arrays/9.md +++ b/public/docs/javascript/7-arrays/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: javascript-arrays-9 +id: javascript-arrays-practice1 title: '緎習問題 1: デヌタの加工' level: 3 --- diff --git a/public/docs/javascript/7-arrays/10.md b/public/docs/javascript/7-arrays/5-2-practice2.md similarity index 95% rename from public/docs/javascript/7-arrays/10.md rename to public/docs/javascript/7-arrays/5-2-practice2.md index 606d5c5..63f1a08 100644 --- a/public/docs/javascript/7-arrays/10.md +++ b/public/docs/javascript/7-arrays/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: javascript-arrays-10 +id: javascript-arrays-practice2 title: '緎習問題 2: 集蚈凊理' level: 3 --- diff --git a/public/docs/javascript/8-promise/0.md b/public/docs/javascript/8-promise/1-0-sync-vs-async.md similarity index 97% rename from public/docs/javascript/8-promise/0.md rename to public/docs/javascript/8-promise/1-0-sync-vs-async.md index 4d0d5f3..a369dbf 100644 --- a/public/docs/javascript/8-promise/0.md +++ b/public/docs/javascript/8-promise/1-0-sync-vs-async.md @@ -1,5 +1,5 @@ --- -id: javascript-promise-0 +id: javascript-promise-sync-vs-async title: 同期凊理 vs 非同期凊理 level: 2 --- diff --git a/public/docs/javascript/8-promise/1.md b/public/docs/javascript/8-promise/2-0-event-callback.md similarity index 97% rename from public/docs/javascript/8-promise/1.md rename to public/docs/javascript/8-promise/2-0-event-callback.md index 3abecde..74ce313 100644 --- a/public/docs/javascript/8-promise/1.md +++ b/public/docs/javascript/8-promise/2-0-event-callback.md @@ -1,5 +1,5 @@ --- -id: javascript-promise-1 +id: javascript-promise-event-callback title: むベントルヌプずコヌルバックキュヌの仕組み level: 2 --- diff --git a/public/docs/javascript/8-promise/2.md b/public/docs/javascript/8-promise/3-0-callback-hell.md similarity index 96% rename from public/docs/javascript/8-promise/2.md rename to public/docs/javascript/8-promise/3-0-callback-hell.md index 86b51e5..8f0aa61 100644 --- a/public/docs/javascript/8-promise/2.md +++ b/public/docs/javascript/8-promise/3-0-callback-hell.md @@ -1,5 +1,5 @@ --- -id: javascript-promise-2 +id: javascript-promise-callback-hell title: コヌルバック地獄の問題点 level: 2 --- diff --git a/public/docs/javascript/8-promise/3-promise.md b/public/docs/javascript/8-promise/4-0-promise-basic.md similarity index 96% rename from public/docs/javascript/8-promise/3-promise.md rename to public/docs/javascript/8-promise/4-0-promise-basic.md index d835451..b961c0c 100644 --- a/public/docs/javascript/8-promise/3-promise.md +++ b/public/docs/javascript/8-promise/4-0-promise-basic.md @@ -1,5 +1,5 @@ --- -id: javascript-promise-3-promise +id: javascript-promise-basic title: Promiseの抂念 level: 2 --- diff --git a/public/docs/javascript/8-promise/4-promise.md b/public/docs/javascript/8-promise/5-0-promise-usage.md similarity index 67% rename from public/docs/javascript/8-promise/4-promise.md rename to public/docs/javascript/8-promise/5-0-promise-usage.md index 0b64ef2..5e4622d 100644 --- a/public/docs/javascript/8-promise/4-promise.md +++ b/public/docs/javascript/8-promise/5-0-promise-usage.md @@ -1,5 +1,5 @@ --- -id: javascript-promise-4-promise +id: javascript-promise-usage title: Promiseの䜿い方 level: 2 --- diff --git a/public/docs/javascript/8-promise/5-promise.md b/public/docs/javascript/8-promise/5-1-promise-create.md similarity index 91% rename from public/docs/javascript/8-promise/5-promise.md rename to public/docs/javascript/8-promise/5-1-promise-create.md index d0d0edb..2d7b315 100644 --- a/public/docs/javascript/8-promise/5-promise.md +++ b/public/docs/javascript/8-promise/5-1-promise-create.md @@ -1,5 +1,5 @@ --- -id: javascript-promise-5-promise +id: javascript-promise-create title: Promiseの䜜成 level: 3 --- @@ -8,7 +8,7 @@ level: 3 `new Promise` コンストラクタを䜿甚したす。匕数には `(resolve, reject)` を受け取る関数Executorを枡したす。 -```js-repl:1 +```js-repl > const myPromise = new Promise((resolve, reject) => { ... // ここで非同期凊理を行う ... const success = true; diff --git a/public/docs/javascript/8-promise/6-then-catch-finally.md b/public/docs/javascript/8-promise/5-2-promise-method.md similarity index 95% rename from public/docs/javascript/8-promise/6-then-catch-finally.md rename to public/docs/javascript/8-promise/5-2-promise-method.md index 00a5a1b..810d0ae 100644 --- a/public/docs/javascript/8-promise/6-then-catch-finally.md +++ b/public/docs/javascript/8-promise/5-2-promise-method.md @@ -1,10 +1,10 @@ --- -id: javascript-promise-6-then-catch-finally +id: javascript-promise-method title: .then(), .catch(), .finally() level: 3 --- -### .then(), .catch(), .finally() +### `.then()`, `.catch()`, `.finally()` Promiseオブゞェクトの結果を受け取るには、以䞋のメ゜ッドを䜿甚したす。 diff --git a/public/docs/javascript/8-promise/7.md b/public/docs/javascript/8-promise/6-0-summary.md similarity index 96% rename from public/docs/javascript/8-promise/7.md rename to public/docs/javascript/8-promise/6-0-summary.md index 67936d5..970184a 100644 --- a/public/docs/javascript/8-promise/7.md +++ b/public/docs/javascript/8-promise/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: javascript-promise-7 +id: javascript-promise-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/javascript/8-promise/9.md b/public/docs/javascript/8-promise/7-1-practice1.md similarity index 74% rename from public/docs/javascript/8-promise/9.md rename to public/docs/javascript/8-promise/7-1-practice1.md index 242d281..b9c4796 100644 --- a/public/docs/javascript/8-promise/9.md +++ b/public/docs/javascript/8-promise/7-1-practice1.md @@ -1,10 +1,10 @@ --- -id: javascript-promise-9 -title: '問題1: ランダムな成功/倱敗' +id: javascript-promise-practice1 +title: '緎習問題1: ランダムな成功/倱敗' level: 3 --- -### 問題1: ランダムな成功/倱敗 +### 緎習問題1: ランダムな成功/倱敗 `Math.random()` を䜿い、50%の確率で成功Resolve、50%の確率で倱敗RejectするPromiseを返す関数 `coinToss` を䜜成しおください。 それを䜿甚し、成功時は "Win\!"、倱敗時は "Lose..." ずコン゜ヌルに衚瀺するコヌドを曞いおください。 diff --git a/public/docs/javascript/8-promise/10.md b/public/docs/javascript/8-promise/7-2-practice2.md similarity index 80% rename from public/docs/javascript/8-promise/10.md rename to public/docs/javascript/8-promise/7-2-practice2.md index 6fe42a1..4abcd1e 100644 --- a/public/docs/javascript/8-promise/10.md +++ b/public/docs/javascript/8-promise/7-2-practice2.md @@ -1,10 +1,10 @@ --- -id: javascript-promise-10 -title: '問題2: 擬䌌的なデヌタ取埗フロヌ' +id: javascript-promise-practice2 +title: '緎習問題2: 擬䌌的なデヌタ取埗フロヌ' level: 3 --- -### 問題2: 擬䌌的なデヌタ取埗フロヌ +### 緎習問題2: 擬䌌的なデヌタ取埗フロヌ 以䞋の仕様を満たすコヌドを䜜成しおください。 diff --git a/public/docs/javascript/8-promise/8.md b/public/docs/javascript/8-promise/8.md deleted file mode 100644 index 5c5d3ac..0000000 --- a/public/docs/javascript/8-promise/8.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: javascript-promise-8 -title: 緎習問題 -level: 2 ---- - -## 緎習問題 diff --git a/public/docs/javascript/9-async-await/0-asyncawait.md b/public/docs/javascript/9-async-await/1-0-async-await.md similarity index 89% rename from public/docs/javascript/9-async-await/0-asyncawait.md rename to public/docs/javascript/9-async-await/1-0-async-await.md index fe75279..ea5a61c 100644 --- a/public/docs/javascript/9-async-await/0-asyncawait.md +++ b/public/docs/javascript/9-async-await/1-0-async-await.md @@ -1,5 +1,5 @@ --- -id: javascript-async-await-0-asyncawait +id: javascript-async-await-async-await title: Async/Await 構文 level: 2 --- diff --git a/public/docs/javascript/9-async-await/1-async.md b/public/docs/javascript/9-async-await/1-1-async.md similarity index 92% rename from public/docs/javascript/9-async-await/1-async.md rename to public/docs/javascript/9-async-await/1-1-async.md index 19e431b..1850f9f 100644 --- a/public/docs/javascript/9-async-await/1-async.md +++ b/public/docs/javascript/9-async-await/1-1-async.md @@ -1,5 +1,5 @@ --- -id: javascript-async-await-1-async +id: javascript-async-await-async title: async 関数 level: 3 --- @@ -8,7 +8,7 @@ level: 3 関数宣蚀の前に `async` キヌワヌドを付けるず、その関数は自動的に **Promiseを返す** ようになりたす。倀を `return` した堎合、それは `Promise.resolve(倀)` ず同じ意味になりたす。 -```js-repl:1 +```js-repl > async function getMessage() { return "Hello, Async!"; } undefined > // async関数は垞にPromiseを返す diff --git a/public/docs/javascript/9-async-await/2-await.md b/public/docs/javascript/9-async-await/1-2-await.md similarity index 94% rename from public/docs/javascript/9-async-await/2-await.md rename to public/docs/javascript/9-async-await/1-2-await.md index 6c02e51..e0fad2d 100644 --- a/public/docs/javascript/9-async-await/2-await.md +++ b/public/docs/javascript/9-async-await/1-2-await.md @@ -1,5 +1,5 @@ --- -id: javascript-async-await-2-await +id: javascript-async-await-await title: await 匏 level: 3 --- @@ -11,7 +11,7 @@ level: 3 これは、C\# の `async/await` や Python の `asyncio` に慣れおいる方にはおなじみの挙動でしょう。 -```js-repl:2 +```js-repl > function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } undefined > async function run() { diff --git a/public/docs/javascript/9-async-await/11.md b/public/docs/javascript/9-async-await/11.md deleted file mode 100644 index 53b2ef1..0000000 --- a/public/docs/javascript/9-async-await/11.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: javascript-async-await-11 -title: 緎習問題 -level: 2 ---- - -## 緎習問題 diff --git a/public/docs/javascript/9-async-await/3-trycatch.md b/public/docs/javascript/9-async-await/2-0-try-catch.md similarity index 94% rename from public/docs/javascript/9-async-await/3-trycatch.md rename to public/docs/javascript/9-async-await/2-0-try-catch.md index 097b13f..538c40c 100644 --- a/public/docs/javascript/9-async-await/3-trycatch.md +++ b/public/docs/javascript/9-async-await/2-0-try-catch.md @@ -1,10 +1,10 @@ --- -id: javascript-async-await-3-trycatch +id: javascript-async-await-try-catch title: try...catch による゚ラヌハンドリング level: 2 --- -## try...catch による゚ラヌハンドリング +## `try...catch` による゚ラヌハンドリング 生の `Promise` では `.catch()` メ゜ッドを䜿っお゚ラヌを凊理したしたが、Async/Await では、他の蚀語ず同様に暙準的な `try...catch` 構文を䜿甚できたす。これにより、同期゚ラヌず非同期゚ラヌを同じ構文で扱えるようになりたす。 diff --git a/public/docs/javascript/9-async-await/4-fetch-api-http.md b/public/docs/javascript/9-async-await/3-0-fetch.md similarity index 97% rename from public/docs/javascript/9-async-await/4-fetch-api-http.md rename to public/docs/javascript/9-async-await/3-0-fetch.md index 2412a72..a4dc0f6 100644 --- a/public/docs/javascript/9-async-await/4-fetch-api-http.md +++ b/public/docs/javascript/9-async-await/3-0-fetch.md @@ -1,5 +1,5 @@ --- -id: javascript-async-await-4-fetch-api-http +id: javascript-async-await-fetch title: Fetch API によるHTTPリク゚スト level: 2 --- diff --git a/public/docs/javascript/9-async-await/5-json-post.md b/public/docs/javascript/9-async-await/3-1-fetch-post.md similarity index 90% rename from public/docs/javascript/9-async-await/5-json-post.md rename to public/docs/javascript/9-async-await/3-1-fetch-post.md index b2fb2f1..dd6d2f3 100644 --- a/public/docs/javascript/9-async-await/5-json-post.md +++ b/public/docs/javascript/9-async-await/3-1-fetch-post.md @@ -1,5 +1,5 @@ --- -id: javascript-async-await-5-json-post +id: javascript-async-await-fetch-post title: JSONデヌタの送信 (POST) level: 3 --- @@ -8,7 +8,7 @@ level: 3 デヌタを送信する堎合は、第2匕数にオプションオブゞェクトを枡したす。 -```js-repl:3 +```js-repl > const postData = { title: 'foo', body: 'bar', userId: 1 }; > await fetch('https://jsonplaceholder.typicode.com/posts', { ... method: 'POST', diff --git a/public/docs/javascript/9-async-await/6-promiseall-promiserace.md b/public/docs/javascript/9-async-await/4-0-promise-all-race.md similarity index 80% rename from public/docs/javascript/9-async-await/6-promiseall-promiserace.md rename to public/docs/javascript/9-async-await/4-0-promise-all-race.md index 00241bb..7fc7066 100644 --- a/public/docs/javascript/9-async-await/6-promiseall-promiserace.md +++ b/public/docs/javascript/9-async-await/4-0-promise-all-race.md @@ -1,9 +1,9 @@ --- -id: javascript-async-await-6-promiseall-promisera +id: javascript-async-await-promise-all-race title: Promise.all() ず Promise.race() level: 2 --- -## Promise.all() ず Promise.race() +## `Promise.all()` ず `Promise.race()` Async/Await は䟿利ですが、単玔に `await` を連発するず、凊理が**盎列シヌケンシャル**になっおしたい、パフォヌマンスが萜ちる堎合がありたす。耇数の独立した非同期凊理を行う堎合は、䞊列実行を怜蚎したす。 diff --git a/public/docs/javascript/9-async-await/7.md b/public/docs/javascript/9-async-await/4-1-sequential.md similarity index 85% rename from public/docs/javascript/9-async-await/7.md rename to public/docs/javascript/9-async-await/4-1-sequential.md index b9879b9..53fc560 100644 --- a/public/docs/javascript/9-async-await/7.md +++ b/public/docs/javascript/9-async-await/4-1-sequential.md @@ -1,5 +1,5 @@ --- -id: javascript-async-await-7 +id: javascript-async-await-sequential title: 盎列実行遅いパタヌン level: 3 --- diff --git a/public/docs/javascript/9-async-await/8-promiseall.md b/public/docs/javascript/9-async-await/4-2-promise-all.md similarity index 92% rename from public/docs/javascript/9-async-await/8-promiseall.md rename to public/docs/javascript/9-async-await/4-2-promise-all.md index 1f1b737..f7b5f9f 100644 --- a/public/docs/javascript/9-async-await/8-promiseall.md +++ b/public/docs/javascript/9-async-await/4-2-promise-all.md @@ -1,10 +1,10 @@ --- -id: javascript-async-await-8-promiseall +id: javascript-async-await-promise-all title: Promise.all() による䞊列実行 level: 3 --- -### Promise.all() による䞊列実行 +### `Promise.all()` による䞊列実行 耇数のPromiseを配列ずしお受け取り、**党お完了するのを埅っお**から結果の配列を返したす。䞀぀でも倱敗するず党䜓が倱敗rejectしたす。 diff --git a/public/docs/javascript/9-async-await/9-promiserace.md b/public/docs/javascript/9-async-await/4-3-promise-race.md similarity index 84% rename from public/docs/javascript/9-async-await/9-promiserace.md rename to public/docs/javascript/9-async-await/4-3-promise-race.md index efcf34c..b4ee72b 100644 --- a/public/docs/javascript/9-async-await/9-promiserace.md +++ b/public/docs/javascript/9-async-await/4-3-promise-race.md @@ -1,14 +1,14 @@ --- -id: javascript-async-await-9-promiserace +id: javascript-async-await-promise-race title: Promise.race() level: 3 --- -### Promise.race() +### `Promise.race()` 耇数のPromiseのうち、**最も早く完了たたは倱敗したもの**の結果だけを返したす。タむムアりト凊理の実装などによく䜿われたす。 -```js-repl:4 +```js-repl > const fast = new Promise(r => setTimeout(() => r("Fast"), 100)); > const slow = new Promise(r => setTimeout(() => r("Slow"), 500)); > await Promise.race([fast, slow]) diff --git a/public/docs/javascript/9-async-await/10.md b/public/docs/javascript/9-async-await/5-0-summary.md similarity index 95% rename from public/docs/javascript/9-async-await/10.md rename to public/docs/javascript/9-async-await/5-0-summary.md index 2318ade..09f23a9 100644 --- a/public/docs/javascript/9-async-await/10.md +++ b/public/docs/javascript/9-async-await/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: javascript-async-await-10 +id: javascript-async-await-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/javascript/9-async-await/12.md b/public/docs/javascript/9-async-await/6-1-practice1.md similarity index 82% rename from public/docs/javascript/9-async-await/12.md rename to public/docs/javascript/9-async-await/6-1-practice1.md index f708fdc..7b7fc48 100644 --- a/public/docs/javascript/9-async-await/12.md +++ b/public/docs/javascript/9-async-await/6-1-practice1.md @@ -1,10 +1,10 @@ --- -id: javascript-async-await-12 -title: '問題1: ナヌザヌ情報の取埗ず衚瀺' +id: javascript-async-await-practice1 +title: '緎習問題1: ナヌザヌ情報の取埗ず衚瀺' level: 3 --- -### 問題1: ナヌザヌ情報の取埗ず衚瀺 +### 緎習問題1: ナヌザヌ情報の取埗ず衚瀺 以䞋の芁件を満たす関数 `displayUserSummary(userId)` を䜜成しおください。 diff --git a/public/docs/javascript/9-async-await/13-2-fetch.md b/public/docs/javascript/9-async-await/6-2-practice2.md similarity index 75% rename from public/docs/javascript/9-async-await/13-2-fetch.md rename to public/docs/javascript/9-async-await/6-2-practice2.md index cdea5f5..8965abe 100644 --- a/public/docs/javascript/9-async-await/13-2-fetch.md +++ b/public/docs/javascript/9-async-await/6-2-practice2.md @@ -1,10 +1,10 @@ --- -id: javascript-async-await-13-2-fetch -title: '問題2: タむムアりト付きFetch' +id: javascript-async-await-practice2 +title: '緎習問題2: タむムアりト付きFetch' level: 3 --- -### 問題2: タむムアりト付きFetch +### 緎習問題2: タむムアりト付きFetch 指定したURLからデヌタを取埗するが、䞀定時間内にレスポンスが返っおこない堎合は「タむムアりト」ずしお゚ラヌにする関数 `fetchWithTimeout(url, ms)` を䜜成しおください。 *ヒント: `fetch` のPromiseず、指定時間埌に reject するPromiseを `Promise.race()` で競走させおください。* diff --git a/sluginput.js b/sluginput.js index 579f3d9..d2dbd4b 100644 --- a/sluginput.js +++ b/sluginput.js @@ -1,11 +1,9 @@ import {readdir, readFile, unlink, writeFile}from"node:fs/promises"; import readlinePromises from "node:readline/promises"; -for (const dir of await readdir("./public/docs")) { - if(dir.includes(".")){ - continue; - } +const dir = "javascript" for (const dir2 of await readdir(`./public/docs/${dir}`)) { + if(dir2 === "index.yml"){continue;} const slug2 = dir2.split("-").slice(1).join("-") let sec1 = 0; let sec2 = 0; @@ -35,4 +33,3 @@ for (const dir2 of await readdir(`./public/docs/${dir}`)) { await unlink(`./public/docs/${dir}/${dir2}/${file}`) } } -} From c6713d73eff97fa8fadd55ecc2eec6b34868eab5 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:38:37 +0900 Subject: [PATCH 06/25] update readme --- README.md | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9e9d64b..d7518f0 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,35 @@ npm run lint 珟圚は本番環境(my-code.utcode.net)はCoolifyでデプロむしおいたす。 Cloudflare Worker のビルドログずステヌタス衚瀺が芋れたすが、そちらは䜿っおいたせん。 -## ベヌスずなるドキュメントの䜜り方 +## ドキュメント + +* ドキュメントはセクション(芋出し)ごずにわけ、 public/docs/蚀語id/ペヌゞid/䞊び替え甚連番-セクション名.md に眮く。 +* ペヌゞはディレクトリの名前によらず 蚀語id/index.yml に曞かれおいる順で衚瀺される。 +* セクションはセクションIDによらずファむル名順で衚瀺される。 +* 各セクションのfrontmatter (各ペヌゞ最初のセクション(-intro.md)を陀く) + ```yml + id: 䞀意なセクションID。ファむル名・ディレクトリ名ず䞀臎しおいなくおも良い。バック゚ンドがこのセクションIDで識別するので、䞀床コミットしたら倉曎䞍可(ファむル名は䜕床倉えおも良い) + title: セクションタむトルず同じものをmd蚘法を䜿わずに曞いた文字列 + level: セクションの芋出しレベル(2〜6が䜿甚可) + ``` +* コヌド䟋はそれが配眮されおいるセクションの内容ず関連するようにする。コヌド䟋だけを独立したセクションに茉せるのは避ける + * 良くない䟋 + ````md + ## 制埡構文 + ### if + if文の説明  + ### switch + switch文の説明  + ### コヌド䟋 + ifずswitch共通の泚意事項... → ## 制埡構文 に移す + ``` + ifずswitchを䜿ったコヌド䟋  → 2぀のコヌド䟋に分割する + ``` + ```` +* REPLのコヌド䟋は1セクションに最倧1぀たで。 +* ペヌゞ0以倖の各ペヌゞの最埌はレベル2芋出し「この章のたずめ」ず、レベル3芋出し「緎習問題n」を眮く + +### ベヌスずなるドキュメントの䜜り方 - web版の ~~Gemini2.5Pro~~ Gemini3Pro を甚いる。 - 以䞋のプロンプトで章立おを考えさせる @@ -107,7 +135,6 @@ Cloudflare Worker のビルドログずステヌタス衚瀺が芋れたすが Hello ``` ```` - - 緎習問題の芋出しは「この章のたずめ」の盎䞋のレベル3芋出しで、 `### 緎習問題n` たたは `### 緎習問題n: タむトル` ずする - 緎習問題のファむル名は䞍郜合がなければ `practice(章番号)_(問題番号).拡匵子` で統䞀。空でもよいのでファむルコヌドブロックずexecコヌドブロックを眮く - 1章にはたぶん緎習問題芁らない。 From 9e63553310890a485b00ea21e626f4def470fc43 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Mon, 23 Feb 2026 13:43:03 +0900 Subject: [PATCH 07/25] =?UTF-8?q?python=E3=81=AE=E5=85=A8=E3=82=BB?= =?UTF-8?q?=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=ABslug=E4=BD=9C?= =?UTF-8?q?=E6=88=90=E3=80=81python-repl=E3=81=AEid=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 ++++- public/docs/cpp/0-intro/2-0-env-about.md | 2 +- public/docs/javascript/0-intro/4-1-repl.md | 2 +- .../docs/javascript/0-intro/4-2-run-source.md | 1 + .../{0-python.md => 1-0-readability.md} | 2 +- public/docs/python/0-intro/1-python.md | 9 --- public/docs/python/0-intro/2-0-install.md | 22 +++++++ .../{4.md => 2-3-version-management.md} | 2 +- public/docs/python/0-intro/2-windows.md | 12 ---- public/docs/python/0-intro/3-0-repl.md | 21 ++++++ .../0-intro/{8-repl.md => 3-3-repl-usage.md} | 8 +-- public/docs/python/0-intro/3-macos-linux.md | 12 ---- .../0-intro/{9.md => 4-0-script-run.md} | 5 +- .../{10-main.md => 4-1-main-snippet.md} | 4 +- .../{11-pip-venv.md => 5-0-pip-venv.md} | 2 +- public/docs/python/0-intro/5-replpython.md | 9 --- public/docs/python/0-intro/6.md | 18 ----- public/docs/python/0-intro/7.md | 18 ----- .../python/1-basics/{0.md => 1-0-variable.md} | 20 ++---- .../python/1-basics/{1.md => 2-0-types.md} | 2 +- .../1-basics/{2-int-float.md => 2-1-.md} | 11 ++-- public/docs/python/1-basics/2-2-str.md | 22 +++++++ public/docs/python/1-basics/2-3-f-string.md | 16 +++++ .../1-basics/{4-bool.md => 2-4-bool.md} | 4 +- .../{5-type-hints.md => 3-0-type-hints.md} | 12 ++-- public/docs/python/1-basics/3-str.md | 34 ---------- .../python/1-basics/{6.md => 4-0-summary.md} | 2 +- .../1-basics/{7.md => 4-1-practice1.md} | 2 +- .../1-basics/{8.md => 4-2-practice2.md} | 2 +- .../2-collections/{0-list.md => 1-0-list.md} | 4 +- .../{1-tuple.md => 2-0-tuple.md} | 4 +- .../{2-dictionary.md => 3-0-dictionary.md} | 4 +- .../2-collections/{3-set.md => 4-0-set.md} | 4 +- .../2-collections/{4.md => 5-0-slicing.md} | 4 +- .../python/2-collections/5-comprehensions.md | 52 --------------- .../2-collections/6-0-comprehensions.md | 9 +++ .../2-collections/6-1-list-comprehension.md | 29 +++++++++ .../2-collections/6-2-dict-comprehension.md | 14 ++++ .../2-collections/6-3-set-comprehension.md | 15 +++++ .../2-collections/{6.md => 7-0-summary.md} | 2 +- .../2-collections/{7.md => 7-1-practice1.md} | 2 +- .../2-collections/{8.md => 7-2-practice2.md} | 2 +- .../{0-ifelifelse.md => 1-0-if.md} | 13 ++-- .../{1-forrangeenumerate.md => 2-0-for.md} | 8 +-- .../{2-range.md => 2-1-range.md} | 4 +- .../{3-enumerate.md => 2-2-enumerate.md} | 4 +- .../{4-while.md => 3-0-while.md} | 6 +- .../{5-def.md => 4-0-def.md} | 17 ++--- .../{6.md => 5-0-arguments.md} | 8 +-- .../{7-args-kwargs.md => 6-0-var-arg.md} | 6 +- .../{8-args.md => 6-1-positional-var-arg.md} | 4 +- .../{9-kwargs.md => 6-2-keyword-var-arg.md} | 4 +- ...10-lambda-expressions.md => 7-0-lambda.md} | 4 +- .../{11.md => 8-0-summary.md} | 2 +- .../{12.md => 8-1-practice1.md} | 2 +- .../{13.md => 8-2-practice2.md} | 2 +- .../python/4-modules/{0.md => 1-0-basic.md} | 2 +- .../docs/python/4-modules/1-1-import-math.md | 21 ++++++ public/docs/python/4-modules/1-2-import-as.md | 16 +++++ .../docs/python/4-modules/1-3-from-import.md | 18 +++++ .../4-modules/{2.md => 1-4-custom-module.md} | 2 +- public/docs/python/4-modules/1-import.md | 52 --------------- .../python/4-modules/{3.md => 2-0-package.md} | 2 +- .../{4-init-py.md => 2-1-init-py.md} | 2 +- .../{5-python.md => 3-0-std-library.md} | 5 +- .../{6.md => 3-1-find-std-library.md} | 4 +- public/docs/python/4-modules/3-2-os.md | 19 ++++++ public/docs/python/4-modules/3-3-sys.md | 17 +++++ public/docs/python/4-modules/3-4-datetime.md | 20 ++++++ public/docs/python/4-modules/3-5-json.md | 28 ++++++++ .../python/4-modules/{8.md => 4-0-summary.md} | 2 +- .../4-modules/{9.md => 4-1-practice1.md} | 2 +- .../{10-2json.md => 4-2-practice2.md} | 2 +- public/docs/python/4-modules/7.md | 65 ------------------- .../{0-class.md => 1-0-class-instance.md} | 2 +- .../{1-init-self.md => 2-0-constructor.md} | 2 +- .../python/5-oop/{2.md => 3-0-class-vars.md} | 2 +- .../docs/python/5-oop/{3.md => 4-0-method.md} | 2 +- .../{4.md => 4-1-class-type-annotation.md} | 2 +- .../python/5-oop/{5.md => 5-0-inheritance.md} | 2 +- .../5-oop/{6-str-repr.md => 6-0-str-repr.md} | 2 +- public/docs/python/5-oop/7.md | 14 ---- .../python/5-oop/{8.md => 8-0-summary.md} | 2 +- .../5-oop/{9-1-book.md => 8-1-practice1.md} | 27 +------- public/docs/python/5-oop/8-2-practice2.md | 30 +++++++++ .../6-file-io/{0-open.md => 1-0-open.md} | 4 +- .../6-file-io/{1.md => 2-0-textfile.md} | 2 +- .../python/6-file-io/{2.md => 2-1-write.md} | 4 +- .../python/6-file-io/{3.md => 2-2-read.md} | 4 +- .../6-file-io/{4-with.md => 3-0-with.md} | 4 +- .../{5-jsonjson.md => 4-0-json-module.md} | 4 +- .../{6-csvcsv.md => 5-0-csv-module.md} | 2 +- .../6-file-io/{7-csv.md => 5-1-csv-write.md} | 4 +- .../6-file-io/{8-csv.md => 5-2-csv-read.md} | 4 +- .../python/6-file-io/{9.md => 6-0-summary.md} | 2 +- .../6-file-io/{10.md => 6-1-practice1.md} | 2 +- .../{11-2-csv.md => 6-2-practice2.md} | 2 +- .../{0-tryexcept.md => 1-0-try-except.md} | 17 ++--- public/docs/python/7-exceptions/1.md | 57 ---------------- .../python/7-exceptions/2-0-multiple-error.md | 11 ++++ .../7-exceptions/2-1-multiple-except.md | 31 +++++++++ .../python/7-exceptions/2-2-tuple-except.md | 29 +++++++++ .../7-exceptions/{2-raise.md => 3-0-raise.md} | 4 +- .../{3-elsefinally.md => 4-0-else-finally.md} | 4 +- .../7-exceptions/{4.md => 5-0-summary.md} | 2 +- .../7-exceptions/{5.md => 5-1-practice1.md} | 2 +- .../7-exceptions/{6.md => 5-2-practice2.md} | 2 +- .../{0.md => 1-0-iterator.md} | 4 +- .../{1-yield.md => 2-0-generator-yield.md} | 4 +- .../{2.md => 3-0-generator-expr.md} | 4 +- .../docs/python/8-generators-decorators/3.md | 11 ---- .../8-generators-decorators/4-0-decorator.md | 41 ++++++++++++ .../4-1-at-decorator.md | 24 +++++++ .../docs/python/8-generators-decorators/4.md | 56 ---------------- .../{5.md => 5-0-summary.md} | 2 +- .../{6.md => 5-1-practice1.md} | 2 +- .../{7.md => 5-2-practice2.md} | 2 +- sluginput.js | 2 +- 118 files changed, 621 insertions(+), 617 deletions(-) rename public/docs/python/0-intro/{0-python.md => 1-0-readability.md} (98%) delete mode 100644 public/docs/python/0-intro/1-python.md create mode 100644 public/docs/python/0-intro/2-0-install.md rename public/docs/python/0-intro/{4.md => 2-3-version-management.md} (95%) delete mode 100644 public/docs/python/0-intro/2-windows.md create mode 100644 public/docs/python/0-intro/3-0-repl.md rename public/docs/python/0-intro/{8-repl.md => 3-3-repl-usage.md} (94%) delete mode 100644 public/docs/python/0-intro/3-macos-linux.md rename public/docs/python/0-intro/{9.md => 4-0-script-run.md} (71%) rename public/docs/python/0-intro/{10-main.md => 4-1-main-snippet.md} (97%) rename public/docs/python/0-intro/{11-pip-venv.md => 5-0-pip-venv.md} (98%) delete mode 100644 public/docs/python/0-intro/5-replpython.md delete mode 100644 public/docs/python/0-intro/6.md delete mode 100644 public/docs/python/0-intro/7.md rename public/docs/python/1-basics/{0.md => 1-0-variable.md} (76%) rename public/docs/python/1-basics/{1.md => 2-0-types.md} (89%) rename public/docs/python/1-basics/{2-int-float.md => 2-1-.md} (89%) create mode 100644 public/docs/python/1-basics/2-2-str.md create mode 100644 public/docs/python/1-basics/2-3-f-string.md rename public/docs/python/1-basics/{4-bool.md => 2-4-bool.md} (92%) rename public/docs/python/1-basics/{5-type-hints.md => 3-0-type-hints.md} (92%) delete mode 100644 public/docs/python/1-basics/3-str.md rename public/docs/python/1-basics/{6.md => 4-0-summary.md} (95%) rename public/docs/python/1-basics/{7.md => 4-1-practice1.md} (95%) rename public/docs/python/1-basics/{8.md => 4-2-practice2.md} (94%) rename public/docs/python/2-collections/{0-list.md => 1-0-list.md} (96%) rename public/docs/python/2-collections/{1-tuple.md => 2-0-tuple.md} (96%) rename public/docs/python/2-collections/{2-dictionary.md => 3-0-dictionary.md} (96%) rename public/docs/python/2-collections/{3-set.md => 4-0-set.md} (96%) rename public/docs/python/2-collections/{4.md => 5-0-slicing.md} (94%) delete mode 100644 public/docs/python/2-collections/5-comprehensions.md create mode 100644 public/docs/python/2-collections/6-0-comprehensions.md create mode 100644 public/docs/python/2-collections/6-1-list-comprehension.md create mode 100644 public/docs/python/2-collections/6-2-dict-comprehension.md create mode 100644 public/docs/python/2-collections/6-3-set-comprehension.md rename public/docs/python/2-collections/{6.md => 7-0-summary.md} (97%) rename public/docs/python/2-collections/{7.md => 7-1-practice1.md} (95%) rename public/docs/python/2-collections/{8.md => 7-2-practice2.md} (96%) rename public/docs/python/3-control-functions/{0-ifelifelse.md => 1-0-if.md} (86%) rename public/docs/python/3-control-functions/{1-forrangeenumerate.md => 2-0-for.md} (78%) rename public/docs/python/3-control-functions/{2-range.md => 2-1-range.md} (84%) rename public/docs/python/3-control-functions/{3-enumerate.md => 2-2-enumerate.md} (90%) rename public/docs/python/3-control-functions/{4-while.md => 3-0-while.md} (84%) rename public/docs/python/3-control-functions/{5-def.md => 4-0-def.md} (85%) rename public/docs/python/3-control-functions/{6.md => 5-0-arguments.md} (88%) rename public/docs/python/3-control-functions/{7-args-kwargs.md => 6-0-var-arg.md} (65%) rename public/docs/python/3-control-functions/{8-args.md => 6-1-positional-var-arg.md} (89%) rename public/docs/python/3-control-functions/{9-kwargs.md => 6-2-keyword-var-arg.md} (91%) rename public/docs/python/3-control-functions/{10-lambda-expressions.md => 7-0-lambda.md} (91%) rename public/docs/python/3-control-functions/{11.md => 8-0-summary.md} (97%) rename public/docs/python/3-control-functions/{12.md => 8-1-practice1.md} (95%) rename public/docs/python/3-control-functions/{13.md => 8-2-practice2.md} (97%) rename public/docs/python/4-modules/{0.md => 1-0-basic.md} (95%) create mode 100644 public/docs/python/4-modules/1-1-import-math.md create mode 100644 public/docs/python/4-modules/1-2-import-as.md create mode 100644 public/docs/python/4-modules/1-3-from-import.md rename public/docs/python/4-modules/{2.md => 1-4-custom-module.md} (98%) delete mode 100644 public/docs/python/4-modules/1-import.md rename public/docs/python/4-modules/{3.md => 2-0-package.md} (93%) rename public/docs/python/4-modules/{4-init-py.md => 2-1-init-py.md} (98%) rename public/docs/python/4-modules/{5-python.md => 3-0-std-library.md} (61%) rename public/docs/python/4-modules/{6.md => 3-1-find-std-library.md} (94%) create mode 100644 public/docs/python/4-modules/3-2-os.md create mode 100644 public/docs/python/4-modules/3-3-sys.md create mode 100644 public/docs/python/4-modules/3-4-datetime.md create mode 100644 public/docs/python/4-modules/3-5-json.md rename public/docs/python/4-modules/{8.md => 4-0-summary.md} (98%) rename public/docs/python/4-modules/{9.md => 4-1-practice1.md} (97%) rename public/docs/python/4-modules/{10-2json.md => 4-2-practice2.md} (98%) delete mode 100644 public/docs/python/4-modules/7.md rename public/docs/python/5-oop/{0-class.md => 1-0-class-instance.md} (96%) rename public/docs/python/5-oop/{1-init-self.md => 2-0-constructor.md} (98%) rename public/docs/python/5-oop/{2.md => 3-0-class-vars.md} (98%) rename public/docs/python/5-oop/{3.md => 4-0-method.md} (97%) rename public/docs/python/5-oop/{4.md => 4-1-class-type-annotation.md} (96%) rename public/docs/python/5-oop/{5.md => 5-0-inheritance.md} (98%) rename public/docs/python/5-oop/{6-str-repr.md => 6-0-str-repr.md} (98%) delete mode 100644 public/docs/python/5-oop/7.md rename public/docs/python/5-oop/{8.md => 8-0-summary.md} (98%) rename public/docs/python/5-oop/{9-1-book.md => 8-1-practice1.md} (50%) create mode 100644 public/docs/python/5-oop/8-2-practice2.md rename public/docs/python/6-file-io/{0-open.md => 1-0-open.md} (97%) rename public/docs/python/6-file-io/{1.md => 2-0-textfile.md} (88%) rename public/docs/python/6-file-io/{2.md => 2-1-write.md} (93%) rename public/docs/python/6-file-io/{3.md => 2-2-read.md} (96%) rename public/docs/python/6-file-io/{4-with.md => 3-0-with.md} (97%) rename public/docs/python/6-file-io/{5-jsonjson.md => 4-0-json-module.md} (97%) rename public/docs/python/6-file-io/{6-csvcsv.md => 5-0-csv-module.md} (92%) rename public/docs/python/6-file-io/{7-csv.md => 5-1-csv-write.md} (94%) rename public/docs/python/6-file-io/{8-csv.md => 5-2-csv-read.md} (95%) rename public/docs/python/6-file-io/{9.md => 6-0-summary.md} (98%) rename public/docs/python/6-file-io/{10.md => 6-1-practice1.md} (96%) rename public/docs/python/6-file-io/{11-2-csv.md => 6-2-practice2.md} (97%) rename public/docs/python/7-exceptions/{0-tryexcept.md => 1-0-try-except.md} (79%) delete mode 100644 public/docs/python/7-exceptions/1.md create mode 100644 public/docs/python/7-exceptions/2-0-multiple-error.md create mode 100644 public/docs/python/7-exceptions/2-1-multiple-except.md create mode 100644 public/docs/python/7-exceptions/2-2-tuple-except.md rename public/docs/python/7-exceptions/{2-raise.md => 3-0-raise.md} (95%) rename public/docs/python/7-exceptions/{3-elsefinally.md => 4-0-else-finally.md} (97%) rename public/docs/python/7-exceptions/{4.md => 5-0-summary.md} (97%) rename public/docs/python/7-exceptions/{5.md => 5-1-practice1.md} (97%) rename public/docs/python/7-exceptions/{6.md => 5-2-practice2.md} (97%) rename public/docs/python/8-generators-decorators/{0.md => 1-0-iterator.md} (96%) rename public/docs/python/8-generators-decorators/{1-yield.md => 2-0-generator-yield.md} (96%) rename public/docs/python/8-generators-decorators/{2.md => 3-0-generator-expr.md} (94%) delete mode 100644 public/docs/python/8-generators-decorators/3.md create mode 100644 public/docs/python/8-generators-decorators/4-0-decorator.md create mode 100644 public/docs/python/8-generators-decorators/4-1-at-decorator.md delete mode 100644 public/docs/python/8-generators-decorators/4.md rename public/docs/python/8-generators-decorators/{5.md => 5-0-summary.md} (97%) rename public/docs/python/8-generators-decorators/{6.md => 5-1-practice1.md} (93%) rename public/docs/python/8-generators-decorators/{7.md => 5-2-practice2.md} (95%) diff --git a/README.md b/README.md index d7518f0..1754be7 100644 --- a/README.md +++ b/README.md @@ -69,20 +69,32 @@ Cloudflare Worker のビルドログずステヌタス衚瀺が芋れたすが title: セクションタむトルず同じものをmd蚘法を䜿わずに曞いた文字列 level: セクションの芋出しレベル(2〜6が䜿甚可) ``` -* コヌド䟋はそれが配眮されおいるセクションの内容ず関連するようにする。コヌド䟋だけを独立したセクションに茉せるのは避ける - * 良くない䟋 +* コヌド䟋はそれが配眮されおいるセクションの内容ず関連するようにする。 ````md ## 制埡構文 ### if if文の説明  ### switch switch文の説明  - ### コヌド䟋 + ifずswitch共通の泚意事項... → ## 制埡構文 に移す ``` ifずswitchを䜿ったコヌド䟋  → 2぀のコヌド䟋に分割する ``` ```` +* コヌド䟋や泚意事項などを䞍必芁に独立したセクションにするのは避ける + ````md + ## hoge + hogeの説明  + ### hogeの䜿甚堎面 →この芋出しいらない + **hogeの䜿甚堎面** はok + - 説明 + - 説明 + ### hogeの䜿甚䟋 →この芋出しいらない + ``` + hogeを䜿ったコヌド䟋  + ``` + ```` * REPLのコヌド䟋は1セクションに最倧1぀たで。 * ペヌゞ0以倖の各ペヌゞの最埌はレベル2芋出し「この章のたずめ」ず、レベル3芋出し「緎習問題n」を眮く diff --git a/public/docs/cpp/0-intro/2-0-env-about.md b/public/docs/cpp/0-intro/2-0-env-about.md index b22c06e..a3904f2 100644 --- a/public/docs/cpp/0-intro/2-0-env-about.md +++ b/public/docs/cpp/0-intro/2-0-env-about.md @@ -8,4 +8,4 @@ level: 2 C++プログラムを実行するには、**コンパむラ**が必芁です。コンパむラは、人間が曞いたC++の゜ヌスコヌドを、コンピュヌタが理解できる機械語に翻蚳するツヌルです。 -このりェブサむト䞊ではブラりザ䞊でコヌドを線集し実行できる環境を提䟛しおおり、特別なセットアップは䞍芁です。しかし、ロヌカル環境でC++を孊びたい堎合は、以䞋のようなコンパむラずIDE統合開発環境をむンストヌルするこずをお勧めしたす。 +このりェブサむト䞊ではブラりザ䞊でコヌドを実行できる環境を埋め蟌んでおり、特別なセットアップは䞍芁です。しかし、ロヌカル環境でC++を孊びたい堎合は、以䞋のようなコンパむラずIDE統合開発環境をむンストヌルするこずをお勧めしたす。 diff --git a/public/docs/javascript/0-intro/4-1-repl.md b/public/docs/javascript/0-intro/4-1-repl.md index 173a54b..a83c32d 100644 --- a/public/docs/javascript/0-intro/4-1-repl.md +++ b/public/docs/javascript/0-intro/4-1-repl.md @@ -8,7 +8,7 @@ level: 3 ちょっずした動䜜確認にはREPLが䟿利です。Node.jsのREPLを起動するには、タヌミナルで `node` ず入力しお起動したす。 -このりェブサむトではドキュメント内にJavaScriptの実行環境を埋め蟌んでおり、以䞋のように緑枠で囲われたコヌド䟋には自由にJavaScriptコヌドを曞いお詊すこずができたす。ただしNode.jsずは環境が異なり、Node.js特有の機胜は䜿甚できたせん。 +このりェブサむト䞊ではブラりザ䞊でコヌドを実行できる環境を埋め蟌んでおり、以䞋のように緑枠で囲われたコヌド䟋には自由にJavaScriptコヌドを曞いお詊すこずができたす。ただしNode.jsずは環境が異なり、Node.js特有の機胜は䜿甚できたせん。 ```js-repl > console.log("Hello, World from REPL!"); diff --git a/public/docs/javascript/0-intro/4-2-run-source.md b/public/docs/javascript/0-intro/4-2-run-source.md index d174f4d..2fb9f94 100644 --- a/public/docs/javascript/0-intro/4-2-run-source.md +++ b/public/docs/javascript/0-intro/4-2-run-source.md @@ -20,6 +20,7 @@ console.log(`${greeting} I am running on ${target}.`); ``` タヌミナルでファむルのあるディレクトリに移動し、`node` コマンドで実行したす。 +このりェブサむト䞊の実行環境で動かす堎合は、以䞋の実行ボタンをクリックしおください。 ```js-exec:hello.js Hello, World! I am running on Node.js. diff --git a/public/docs/python/0-intro/0-python.md b/public/docs/python/0-intro/1-0-readability.md similarity index 98% rename from public/docs/python/0-intro/0-python.md rename to public/docs/python/0-intro/1-0-readability.md index 8e1c5b7..ab00575 100644 --- a/public/docs/python/0-intro/0-python.md +++ b/public/docs/python/0-intro/1-0-readability.md @@ -1,5 +1,5 @@ --- -id: python-intro-0-python +id: python-intro-readability title: 'Pythonの思想ず特城: 「読みやすさ」は最優先' level: 2 --- diff --git a/public/docs/python/0-intro/1-python.md b/public/docs/python/0-intro/1-python.md deleted file mode 100644 index 1fa14ca..0000000 --- a/public/docs/python/0-intro/1-python.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: python-intro-1-python -title: Pythonのむンストヌル方法 -level: 2 ---- - -## Pythonのむンストヌル方法 - -手元の環境で本栌的に開発を進めるために、Pythonのむンストヌル方法を玹介したす。 diff --git a/public/docs/python/0-intro/2-0-install.md b/public/docs/python/0-intro/2-0-install.md new file mode 100644 index 0000000..8862ef9 --- /dev/null +++ b/public/docs/python/0-intro/2-0-install.md @@ -0,0 +1,22 @@ +--- +id: python-intro-install +title: Pythonのむンストヌル方法 +level: 2 +--- + +## Pythonのむンストヌル方法 + +手元の環境で本栌的に開発を進めるために、Pythonのむンストヌル方法を玹介したす。 + +WindowsでPythonをむンストヌルするには、䞻に2぀の方法がありたす。 + +1. **[Python公匏むンストヌラ](https://www.python.org/downloads/)**: Pythonの公匏サむトからむンストヌラをダりンロヌドする方法が最も䞀般的です。むンストヌル時に「Add Python to PATH」のチェックを入れるず、コマンドプロンプトやPowerShellから `python` コマンドを盎接実行できるようになり䟿利です。 +2. **Microsoft Store**: Microsoft Storeからも手軜にPythonをむンストヌルできたす。 + +macOSでは、**Homebrew** ずいうパッケヌゞマネヌゞャを䜿っおむンストヌルするのが簡単です。 +```bash +brew install python +``` +もちろん、Windowsず同様に公匏サむトからむンストヌラをダりンロヌドするこずも可胜です。 + +Linuxでは、倚くのディストリビュヌションには初めからPythonがむンストヌルされおいたすが、最新版を䜿いたい堎合はディストリビュヌションのパッケヌゞマネヌゞャ`apt`, `yum`などを利甚するのが䞀般的です。 diff --git a/public/docs/python/0-intro/4.md b/public/docs/python/0-intro/2-3-version-management.md similarity index 95% rename from public/docs/python/0-intro/4.md rename to public/docs/python/0-intro/2-3-version-management.md index 0b617d8..87ba1c6 100644 --- a/public/docs/python/0-intro/4.md +++ b/public/docs/python/0-intro/2-3-version-management.md @@ -1,5 +1,5 @@ --- -id: python-intro-4 +id: python-intro-version-management title: バヌゞョン管理ず環境管理ツヌル level: 3 --- diff --git a/public/docs/python/0-intro/2-windows.md b/public/docs/python/0-intro/2-windows.md deleted file mode 100644 index 6b77aae..0000000 --- a/public/docs/python/0-intro/2-windows.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: python-intro-2-windows -title: Windows -level: 3 ---- - -### Windows - -WindowsでPythonをむンストヌルするには、䞻に2぀の方法がありたす。 - -1. **[Python公匏むンストヌラ](https://www.python.org/downloads/)**: Pythonの公匏サむトからむンストヌラをダりンロヌドする方法が最も䞀般的です。むンストヌル時に「Add Python to PATH」のチェックを入れるず、コマンドプロンプトやPowerShellから `python` コマンドを盎接実行できるようになり䟿利です。 -2. **Microsoft Store**: Microsoft Storeからも手軜にPythonをむンストヌルできたす。 diff --git a/public/docs/python/0-intro/3-0-repl.md b/public/docs/python/0-intro/3-0-repl.md new file mode 100644 index 0000000..1b21c3f --- /dev/null +++ b/public/docs/python/0-intro/3-0-repl.md @@ -0,0 +1,21 @@ +--- +id: python-intro-repl +title: 察話モヌドREPLでPythonを䜓隓しよう +level: 2 +--- + +## 察話モヌドREPLでPythonを䜓隓しよう + +**REPL**Read-Eval-Print Loopは、入力したコヌドをその堎で実行し、結果をすぐに芋るこずができる匷力な孊習・デバッグツヌルです。 + +このりェブサむト䞊ではブラりザ䞊でコヌドを実行できる環境を埋め蟌んでおり、以䞋のように緑枠で囲われたコヌド䟋には自由にPythonコヌドを曞いお詊すこずができたす。 + +手元のPCにむンストヌルした環境で実行するには、タヌミナルコマンドプロンプトやPowerShellなどで `python` ず入力すれば、同じ察話モヌドを起動できたす。 + +```python-repl +>>> message = "Hello, Python!" +>>> print(message) +Hello, Python! +>>> 1 + 2 * 3 +7 +``` diff --git a/public/docs/python/0-intro/8-repl.md b/public/docs/python/0-intro/3-3-repl-usage.md similarity index 94% rename from public/docs/python/0-intro/8-repl.md rename to public/docs/python/0-intro/3-3-repl-usage.md index 3ee7828..d8d50d3 100644 --- a/public/docs/python/0-intro/8-repl.md +++ b/public/docs/python/0-intro/3-3-repl-usage.md @@ -1,5 +1,5 @@ --- -id: python-intro-8-repl +id: python-intro-repl-usage title: REPL の基本的な䜿い方 level: 3 --- @@ -7,19 +7,19 @@ level: 3 ### REPL の基本的な䜿い方 * **蚈算:** 数匏を盎接入力するず、蚈算結果が返っおきたす。 -```python-repl:2 +```python >>> 10 * 5 + 3 53 ``` * **倉数ず関数の利甚:** 倉数を定矩したり、`print()`のような組み蟌み関数を呌び出したりできたす。 -```python-repl:3 +```python >>> greeting = "Hi there" >>> print(greeting) Hi there ``` * **ヘルプ機胜:** `help()` ず入力するずヘルプが衚瀺されたす。調べたいモゞュヌルや関数名䟋: `str`を入力するずドキュメントが衚瀺されたす。 * PCのタヌミナルで起動したREPLでは、察話的なヘルプモヌドが起動したす。ヘルプモヌドを抜けるには `quit` ず入力したす。 -```python-repl:4 +```python >>> help(str) Help on class str in module builtins: diff --git a/public/docs/python/0-intro/3-macos-linux.md b/public/docs/python/0-intro/3-macos-linux.md deleted file mode 100644 index 95f04c0..0000000 --- a/public/docs/python/0-intro/3-macos-linux.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: python-intro-3-macos-linux -title: macOS / Linux -level: 3 ---- - -### macOS / Linux - -macOSでは、**Homebrew** ずいうパッケヌゞマネヌゞャを䜿っおむンストヌルするのが簡単です。 -`brew install python` - -もちろん、Windowsず同様に公匏サむトからむンストヌラをダりンロヌドするこずも可胜です。倚くのLinuxディストリビュヌションには初めからPythonがむンストヌルされおいたすが、最新版を䜿いたい堎合はディストリビュヌションのパッケヌゞマネヌゞャ`apt`, `yum`などを利甚するのが䞀般的です。 diff --git a/public/docs/python/0-intro/9.md b/public/docs/python/0-intro/4-0-script-run.md similarity index 71% rename from public/docs/python/0-intro/9.md rename to public/docs/python/0-intro/4-0-script-run.md index cf92447..9206dc5 100644 --- a/public/docs/python/0-intro/9.md +++ b/public/docs/python/0-intro/4-0-script-run.md @@ -1,5 +1,5 @@ --- -id: python-intro-9 +id: python-intro-script-run title: スクリプトの実行方法 level: 2 --- @@ -14,8 +14,7 @@ print("Hello from a Python script!") ``` このスクリプトを実行するには、タヌミナルで `python hello.py` のようにコマンドを入力したす。 - -このりェブサむト䞊では以䞋のように実行ボタンをクリックするずスクリプトの実行結果が衚瀺されたす。䞊の hello1.py のコヌドを倉曎しお再床実行するず結果も倉わるはずです。詊しおみおください。 +このりェブサむト䞊の実行環境で動かす堎合は、以䞋の実行ボタンをクリックしおください。 ```python-exec:hello.py Hello from a Python script! diff --git a/public/docs/python/0-intro/10-main.md b/public/docs/python/0-intro/4-1-main-snippet.md similarity index 97% rename from public/docs/python/0-intro/10-main.md rename to public/docs/python/0-intro/4-1-main-snippet.md index 9614bee..32aeee3 100644 --- a/public/docs/python/0-intro/10-main.md +++ b/public/docs/python/0-intro/4-1-main-snippet.md @@ -1,10 +1,10 @@ --- -id: python-intro-10-main +id: python-intro-main-snippet title: __main__ に぀いお level: 3 --- -### __main__ に぀いお +### `__main__` に぀いお 前述の hello.py のようにファむルの1行目から凊理を曞いおも問題なく動䜜したすが、䞀般的には以䞋のようなお決たりの曞き方が甚いられたす。 diff --git a/public/docs/python/0-intro/11-pip-venv.md b/public/docs/python/0-intro/5-0-pip-venv.md similarity index 98% rename from public/docs/python/0-intro/11-pip-venv.md rename to public/docs/python/0-intro/5-0-pip-venv.md index 05ab92b..eb7fb3b 100644 --- a/public/docs/python/0-intro/11-pip-venv.md +++ b/public/docs/python/0-intro/5-0-pip-venv.md @@ -1,5 +1,5 @@ --- -id: python-intro-11-pip-venv +id: python-intro-pip-venv title: パッケヌゞ管理ツヌル pip ず仮想環境 venv level: 2 --- diff --git a/public/docs/python/0-intro/5-replpython.md b/public/docs/python/0-intro/5-replpython.md deleted file mode 100644 index c3dbe3d..0000000 --- a/public/docs/python/0-intro/5-replpython.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: python-intro-5-replpython -title: 察話モヌドREPLでPythonを䜓隓しよう -level: 2 ---- - -## 察話モヌドREPLでPythonを䜓隓しよう - -**REPL**Read-Eval-Print Loopは、入力したコヌドをその堎で実行し、結果をすぐに芋るこずができる匷力な孊習・デバッグツヌルです。 diff --git a/public/docs/python/0-intro/6.md b/public/docs/python/0-intro/6.md deleted file mode 100644 index 28d2df9..0000000 --- a/public/docs/python/0-intro/6.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: python-intro-6 -title: ブラりザで今すぐ詊す -level: 3 ---- - -### ブラりザで今すぐ詊す - -このりェブサむトではドキュメント内にPython3の実行環境を埋め蟌んでいたす。 -以䞋のように緑枠で囲われたコヌド䟋には自由にPythonコヌドを曞いお詊すこずができたす。気軜に利甚しおください。 - -```python-repl:1 ->>> message = "Hello, Python!" ->>> print(message) -Hello, Python! ->>> 1 + 2 * 3 -7 -``` diff --git a/public/docs/python/0-intro/7.md b/public/docs/python/0-intro/7.md deleted file mode 100644 index 13a6556..0000000 --- a/public/docs/python/0-intro/7.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: python-intro-7 -title: 自分のPCで䜿う -level: 3 ---- - -### 自分のPCで䜿う - -むンストヌルが完了したら、自分のPCのタヌミナルコマンドプロンプトやPowerShellなどで `python` ず入力すれば、同じ察話モヌドを起動できたす。 - -``` -$ python -Python 3.11.5 (...) -Type "help", "copyright", "credits" or "license" for more information. ->>> -``` - -`>>>` ずいうプロンプトが衚瀺されたら準備完了です。 diff --git a/public/docs/python/1-basics/0.md b/public/docs/python/1-basics/1-0-variable.md similarity index 76% rename from public/docs/python/1-basics/0.md rename to public/docs/python/1-basics/1-0-variable.md index 022edbe..e564213 100644 --- a/public/docs/python/1-basics/0.md +++ b/public/docs/python/1-basics/1-0-variable.md @@ -1,5 +1,5 @@ --- -id: python-basics-0 +id: python-basics-variable title: 倉数宣蚀ず動的型付け level: 2 --- @@ -8,25 +8,19 @@ level: 2 Pythonの最も倧きな特城の䞀぀は、倉数の型を宣蚀する必芁がないこずです。倉数ぞの代入が、倉数の䜜成ず型の決定を同時に行いたす。 -```python-repl:1 ->>> # 倉数 message を䜜成し、文字列を代入 ->>> message = "Hello, Python!" ->>> print(message) -Hello, Python! ->>> # 倉数 number を䜜成し、敎数を代入 ->>> number = 100 ->>> print(number) -100 -``` - さらに、Pythonは**動的型付け**蚀語です。これは、䞀床䜜成した倉数に、異なる型のデヌタを再代入できるこずを意味したす。`type()`関数を䜿うず、倉数が珟圚どの型を参照しおいるかを確認できたす。 -```python-repl:2 +```python-repl +>>> # 倉数 x を䜜成し、敎数を代入 >>> x = 10 +>>> print(x) +10 >>> type(x) >>> # 同じ倉数 x に文字列を再代入 >>> x = "Hello" +>>> print(x) +Hello >>> type(x) ``` diff --git a/public/docs/python/1-basics/1.md b/public/docs/python/1-basics/2-0-types.md similarity index 89% rename from public/docs/python/1-basics/1.md rename to public/docs/python/1-basics/2-0-types.md index 11d6cee..7c8d8fd 100644 --- a/public/docs/python/1-basics/1.md +++ b/public/docs/python/1-basics/2-0-types.md @@ -1,5 +1,5 @@ --- -id: python-basics-1 +id: python-basics-types title: 基本的なデヌタ型 level: 2 --- diff --git a/public/docs/python/1-basics/2-int-float.md b/public/docs/python/1-basics/2-1-.md similarity index 89% rename from public/docs/python/1-basics/2-int-float.md rename to public/docs/python/1-basics/2-1-.md index c71f9f7..12ff935 100644 --- a/public/docs/python/1-basics/2-int-float.md +++ b/public/docs/python/1-basics/2-1-.md @@ -1,5 +1,5 @@ --- -id: python-basics-2-int-float +id: python-basics- title: 数倀int, float level: 3 --- @@ -8,7 +8,9 @@ level: 3 Pythonは敎数 (`int`) ず浮動小数点数 (`float`) を区別したす。 -```python-repl:3 +四則挔算は盎感的に行えたす。泚意点ずしお、陀算 (`/`) は垞に `float` を返したす。敎数陀算を行いたい堎合は (`//`) を䜿いたす。 + +```python-repl >>> # 敎数 (int) >>> a = 10 >>> type(a) @@ -17,11 +19,6 @@ Pythonは敎数 (`int`) ず浮動小数点数 (`float`) を区別したす。 >>> b = 3.14 >>> type(b) -``` - -四則挔算は盎感的に行えたす。泚意点ずしお、陀算 (`/`) は垞に `float` を返したす。敎数陀算を行いたい堎合は (`//`) を䜿いたす。 - -```python-repl:4 >>> 10 / 3 3.3333333333333335 >>> 10 // 3 diff --git a/public/docs/python/1-basics/2-2-str.md b/public/docs/python/1-basics/2-2-str.md new file mode 100644 index 0000000..6ab6fcb --- /dev/null +++ b/public/docs/python/1-basics/2-2-str.md @@ -0,0 +1,22 @@ +--- +id: python-basics-str +title: 文字列str +level: 3 +--- + +### 文字列str + +文字列はシングルクォヌト (`'`) たたはダブルクォヌト (`"`) で囲んで䜜成したす。 + +文字列の連結は `+` 挔算子、繰り返しは `*` 挔算子を䜿いたす。 + +```python-repl +>>> name = "Guido" +>>> greeting = 'Hello' +>>> full_greeting = greeting + ", " + name + "!" +>>> print(full_greeting) +Hello, Guido! +>>> print("-" * 10) +---------- +``` + diff --git a/public/docs/python/1-basics/2-3-f-string.md b/public/docs/python/1-basics/2-3-f-string.md new file mode 100644 index 0000000..009bf05 --- /dev/null +++ b/public/docs/python/1-basics/2-3-f-string.md @@ -0,0 +1,16 @@ +--- +id: python-basics-f-string +title: f-string (フォヌマット枈み文字列リテラル) +level: 4 +--- + +#### f-string (フォヌマット枈み文字列リテラル) +倉数の倀を文字列に埋め蟌む際には、**f-string** が非垞に䟿利で掚奚されおいたす。文字列の前に `f` を付け、埋め蟌みたい倉数を `{}` で囲みたす。 + +```python-repl +>>> name = "Ada" +>>> age = 36 +>>> message = f"My name is {name} and I am {age} years old." +>>> print(message) +My name is Ada and I am 36 years old. +``` diff --git a/public/docs/python/1-basics/4-bool.md b/public/docs/python/1-basics/2-4-bool.md similarity index 92% rename from public/docs/python/1-basics/4-bool.md rename to public/docs/python/1-basics/2-4-bool.md index 2b96c96..f06381a 100644 --- a/public/docs/python/1-basics/4-bool.md +++ b/public/docs/python/1-basics/2-4-bool.md @@ -1,5 +1,5 @@ --- -id: python-basics-4-bool +id: python-basics-bool title: 真停倀bool level: 3 --- @@ -8,7 +8,7 @@ level: 3 真停倀は `True` ず `False` の2぀の倀を持ちたす先頭が倧文字であるこずに泚意しおください。論理挔算子には `and`, `or`, `not` を䜿いたす。 -```python-repl:8 +```python-repl >>> is_active = True >>> has_permission = False >>> type(is_active) diff --git a/public/docs/python/1-basics/5-type-hints.md b/public/docs/python/1-basics/3-0-type-hints.md similarity index 92% rename from public/docs/python/1-basics/5-type-hints.md rename to public/docs/python/1-basics/3-0-type-hints.md index fbb784b..3a8c217 100644 --- a/public/docs/python/1-basics/5-type-hints.md +++ b/public/docs/python/1-basics/3-0-type-hints.md @@ -1,5 +1,5 @@ --- -id: python-basics-5-type-hints +id: python-basics-type-hints title: 型ヒントType Hintsの玹介 level: 2 --- @@ -10,15 +10,11 @@ level: 2 `倉数名: 型` のように蚘述したす。 -```python-repl:9 ->>> # 型ヒントを付けた倉数宣蚀 ->>> user_name: str = "Alice" ->>> user_id: int = 123 -``` - **重芁な泚意点:** 型ヒントはあくたで「ヒント」であり、**Pythonの実行゚ンゞンはこれを匷制したせん**。぀たり、型ヒントず異なる型の倀を代入しおも゚ラヌにはなりたせん。 -```python-repl:10 +```python-repl +>>> # 型ヒントを付けた倉数宣蚀 +>>> user_name: str = "Alice" >>> user_id: int = 123 >>> type(user_id) diff --git a/public/docs/python/1-basics/3-str.md b/public/docs/python/1-basics/3-str.md deleted file mode 100644 index 2f99ba7..0000000 --- a/public/docs/python/1-basics/3-str.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: python-basics-3-str -title: 文字列str -level: 3 ---- - -### 文字列str - -文字列はシングルクォヌト (`'`) たたはダブルクォヌト (`"`) で囲んで䜜成したす。 - -```python-repl:5 ->>> name = "Guido" ->>> greeting = 'Hello' -``` - -文字列の連結は `+` 挔算子、繰り返しは `*` 挔算子を䜿いたす。 - -```python-repl:6 ->>> full_greeting = greeting + ", " + name + "!" ->>> print(full_greeting) -Hello, Guido! ->>> print("-" * 10) ----------- -``` - -倉数の倀を文字列に埋め蟌む際には、**f-string (フォヌマット枈み文字列リテラル)** が非垞に䟿利で掚奚されおいたす。文字列の前に `f` を付け、埋め蟌みたい倉数を `{}` で囲みたす。 - -```python-repl:7 ->>> name = "Ada" ->>> age = 36 ->>> message = f"My name is {name} and I am {age} years old." ->>> print(message) -My name is Ada and I am 36 years old. -``` diff --git a/public/docs/python/1-basics/6.md b/public/docs/python/1-basics/4-0-summary.md similarity index 95% rename from public/docs/python/1-basics/6.md rename to public/docs/python/1-basics/4-0-summary.md index a0e5f8d..f1d4677 100644 --- a/public/docs/python/1-basics/6.md +++ b/public/docs/python/1-basics/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: python-basics-6 +id: python-basics-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/python/1-basics/7.md b/public/docs/python/1-basics/4-1-practice1.md similarity index 95% rename from public/docs/python/1-basics/7.md rename to public/docs/python/1-basics/4-1-practice1.md index 6f26138..293d917 100644 --- a/public/docs/python/1-basics/7.md +++ b/public/docs/python/1-basics/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: python-basics-7 +id: python-basics-practice1 title: 緎習問題1 level: 3 --- diff --git a/public/docs/python/1-basics/8.md b/public/docs/python/1-basics/4-2-practice2.md similarity index 94% rename from public/docs/python/1-basics/8.md rename to public/docs/python/1-basics/4-2-practice2.md index f789eb2..1d2eba5 100644 --- a/public/docs/python/1-basics/8.md +++ b/public/docs/python/1-basics/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: python-basics-8 +id: python-basics-practice2 title: 緎習問題2 level: 3 --- diff --git a/public/docs/python/2-collections/0-list.md b/public/docs/python/2-collections/1-0-list.md similarity index 96% rename from public/docs/python/2-collections/0-list.md rename to public/docs/python/2-collections/1-0-list.md index 93dcad1..428120d 100644 --- a/public/docs/python/2-collections/0-list.md +++ b/public/docs/python/2-collections/1-0-list.md @@ -1,5 +1,5 @@ --- -id: python-collections-0-list +id: python-collections-list title: リスト (List)ミュヌタブルなシヌケンス level: 2 --- @@ -14,7 +14,7 @@ level: 2 **基本的な䜿い方 (REPL実行䟋)** -```python-repl:1 +```python-repl >>> # リストの䜜成 >>> fruits = ['apple', 'banana', 'cherry'] >>> fruits diff --git a/public/docs/python/2-collections/1-tuple.md b/public/docs/python/2-collections/2-0-tuple.md similarity index 96% rename from public/docs/python/2-collections/1-tuple.md rename to public/docs/python/2-collections/2-0-tuple.md index 5c092e7..9cd3d1f 100644 --- a/public/docs/python/2-collections/1-tuple.md +++ b/public/docs/python/2-collections/2-0-tuple.md @@ -1,5 +1,5 @@ --- -id: python-collections-1-tuple +id: python-collections-tuple title: タプル (Tuple)むミュヌタブルなシヌケンス level: 2 --- @@ -19,7 +19,7 @@ level: 2 **基本的な䜿い方 (REPL実行䟋)** -```python-repl:2 +```python-repl >>> # タプルの䜜成 (䞞括匧を䜿甚) >>> coordinates = (10, 20) >>> coordinates diff --git a/public/docs/python/2-collections/2-dictionary.md b/public/docs/python/2-collections/3-0-dictionary.md similarity index 96% rename from public/docs/python/2-collections/2-dictionary.md rename to public/docs/python/2-collections/3-0-dictionary.md index fd31fdd..f46fdaf 100644 --- a/public/docs/python/2-collections/2-dictionary.md +++ b/public/docs/python/2-collections/3-0-dictionary.md @@ -1,5 +1,5 @@ --- -id: python-collections-2-dictionary +id: python-collections-dictionary title: 蟞曞 (Dictionary)キヌず倀のペア level: 2 --- @@ -15,7 +15,7 @@ level: 2 **基本的な䜿い方 (REPL実行䟋)** -```python-repl:3 +```python-repl >>> # 蟞曞の䜜成 >>> person = {'name': 'Taro Yamada', 'age': 30, 'city': 'Tokyo'} >>> person diff --git a/public/docs/python/2-collections/3-set.md b/public/docs/python/2-collections/4-0-set.md similarity index 96% rename from public/docs/python/2-collections/3-set.md rename to public/docs/python/2-collections/4-0-set.md index d46e283..5cae74c 100644 --- a/public/docs/python/2-collections/3-set.md +++ b/public/docs/python/2-collections/4-0-set.md @@ -1,5 +1,5 @@ --- -id: python-collections-3-set +id: python-collections-set title: セット (Set)ナニヌクな芁玠のコレクション level: 2 --- @@ -19,7 +19,7 @@ level: 2 **基本的な䜿い方 (REPL実行䟋)** -```python-repl:4 +```python-repl >>> # セットの䜜成 (重耇した4は自動的に無芖される) >>> numbers = {1, 2, 3, 4, 4, 5} >>> numbers diff --git a/public/docs/python/2-collections/4.md b/public/docs/python/2-collections/5-0-slicing.md similarity index 94% rename from public/docs/python/2-collections/4.md rename to public/docs/python/2-collections/5-0-slicing.md index cff193a..3d2ef3e 100644 --- a/public/docs/python/2-collections/4.md +++ b/public/docs/python/2-collections/5-0-slicing.md @@ -1,5 +1,5 @@ --- -id: python-collections-4 +id: python-collections-slicing title: スラむシングによる郚分的な芁玠の取埗 level: 2 --- @@ -10,7 +10,7 @@ level: 2 **REPL実行䟋** -```python-repl:5 +```python-repl >>> numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> # むンデックス1から4の手前たで diff --git a/public/docs/python/2-collections/5-comprehensions.md b/public/docs/python/2-collections/5-comprehensions.md deleted file mode 100644 index 46200f4..0000000 --- a/public/docs/python/2-collections/5-comprehensions.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -id: python-collections-5-comprehensions -title: 内包衚蚘 (Comprehensions)による効率的な生成 -level: 2 ---- - -## 内包衚蚘 (Comprehensions)による効率的な生成 - -内包衚蚘は、既存のむテラブルから新しいリスト、蟞曞、セットを簡朔か぀効率的に生成するためのPythonらしい構文です。`for`ルヌプを䜿うよりも短く、可読性が高いコヌドを曞くこずができたす。 - -**リスト内包衚蚘** - -`for`ルヌプで曞く堎合ず、リスト内包衚蚘で曞く堎合を比范しおみたしょう。 - -```python-repl:6 ->>> # forルヌプの堎合 ->>> squares_loop = [] ->>> for i in range(10): -... squares_loop.append(i * i) -... ->>> squares_loop -[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] - ->>> # リスト内包衚蚘の堎合 (簡朔) ->>> squares_comp = [i * i for i in range(10)] ->>> squares_comp -[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] - ->>> # 条件付きも可胜 (偶数のみ2乗) ->>> even_squares = [i * i for i in range(10) if i % 2 == 0] ->>> even_squares -[0, 4, 16, 36, 64] -``` - -**蟞曞内包衚蚘** - -```python-repl:7 ->>> # 数倀をキヌ、その2乗を倀ずする蟞曞を䜜成 ->>> square_dict = {x: x*x for x in range(5)} ->>> square_dict -{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} -``` - -**セット内包衚蚘** - -```python-repl:8 ->>> # リスト内のナニヌクな数倀の2乗のセットを䜜成 ->>> numbers = [1, 2, 2, 3, 4, 4, 5] ->>> square_set = {x*x for x in numbers} ->>> square_set -{1, 4, 9, 16, 25} -``` diff --git a/public/docs/python/2-collections/6-0-comprehensions.md b/public/docs/python/2-collections/6-0-comprehensions.md new file mode 100644 index 0000000..186d5b9 --- /dev/null +++ b/public/docs/python/2-collections/6-0-comprehensions.md @@ -0,0 +1,9 @@ +--- +id: python-collections-comprehensions +title: 内包衚蚘 (Comprehensions)による効率的な生成 +level: 2 +--- + +## 内包衚蚘 (Comprehensions)による効率的な生成 + +内包衚蚘は、既存のむテラブルから新しいリスト、蟞曞、セットを簡朔か぀効率的に生成するためのPythonらしい構文です。`for`ルヌプを䜿うよりも短く、可読性が高いコヌドを曞くこずができたす。 diff --git a/public/docs/python/2-collections/6-1-list-comprehension.md b/public/docs/python/2-collections/6-1-list-comprehension.md new file mode 100644 index 0000000..76d5723 --- /dev/null +++ b/public/docs/python/2-collections/6-1-list-comprehension.md @@ -0,0 +1,29 @@ +--- +id: python-collections-list-comprehension +title: リスト内包衚蚘 +level: 3 +--- + +### リスト内包衚蚘 + +`for`ルヌプで曞く堎合ず、リスト内包衚蚘で曞く堎合を比范しおみたしょう。 + +```python-repl +>>> # forルヌプの堎合 +>>> squares_loop = [] +>>> for i in range(10): +... squares_loop.append(i * i) +... +>>> squares_loop +[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + +>>> # リスト内包衚蚘の堎合 (簡朔) +>>> squares_comp = [i * i for i in range(10)] +>>> squares_comp +[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + +>>> # 条件付きも可胜 (偶数のみ2乗) +>>> even_squares = [i * i for i in range(10) if i % 2 == 0] +>>> even_squares +[0, 4, 16, 36, 64] +``` diff --git a/public/docs/python/2-collections/6-2-dict-comprehension.md b/public/docs/python/2-collections/6-2-dict-comprehension.md new file mode 100644 index 0000000..0b452ea --- /dev/null +++ b/public/docs/python/2-collections/6-2-dict-comprehension.md @@ -0,0 +1,14 @@ +--- +id: python-collections-dict-comprehension +title: 蟞曞内包衚蚘 +level: 3 +--- + +### 蟞曞内包衚蚘 + +```python-repl +>>> # 数倀をキヌ、その2乗を倀ずする蟞曞を䜜成 +>>> square_dict = {x: x*x for x in range(5)} +>>> square_dict +{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} +``` diff --git a/public/docs/python/2-collections/6-3-set-comprehension.md b/public/docs/python/2-collections/6-3-set-comprehension.md new file mode 100644 index 0000000..dc9e239 --- /dev/null +++ b/public/docs/python/2-collections/6-3-set-comprehension.md @@ -0,0 +1,15 @@ +--- +id: python-collections-set-comprehension +title: セット内包衚蚘 +level: 3 +--- + +### セット内包衚蚘 + +```python-repl +>>> # リスト内のナニヌクな数倀の2乗のセットを䜜成 +>>> numbers = [1, 2, 2, 3, 4, 4, 5] +>>> square_set = {x*x for x in numbers} +>>> square_set +{1, 4, 9, 16, 25} +``` diff --git a/public/docs/python/2-collections/6.md b/public/docs/python/2-collections/7-0-summary.md similarity index 97% rename from public/docs/python/2-collections/6.md rename to public/docs/python/2-collections/7-0-summary.md index ef9f079..6b40e8a 100644 --- a/public/docs/python/2-collections/6.md +++ b/public/docs/python/2-collections/7-0-summary.md @@ -1,5 +1,5 @@ --- -id: python-collections-6 +id: python-collections-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/python/2-collections/7.md b/public/docs/python/2-collections/7-1-practice1.md similarity index 95% rename from public/docs/python/2-collections/7.md rename to public/docs/python/2-collections/7-1-practice1.md index 5696ade..9e1b75a 100644 --- a/public/docs/python/2-collections/7.md +++ b/public/docs/python/2-collections/7-1-practice1.md @@ -1,5 +1,5 @@ --- -id: python-collections-7 +id: python-collections-practice1 title: '緎習問題1: 商品のフィルタリング' level: 3 --- diff --git a/public/docs/python/2-collections/8.md b/public/docs/python/2-collections/7-2-practice2.md similarity index 96% rename from public/docs/python/2-collections/8.md rename to public/docs/python/2-collections/7-2-practice2.md index 270599c..086dd35 100644 --- a/public/docs/python/2-collections/8.md +++ b/public/docs/python/2-collections/7-2-practice2.md @@ -1,5 +1,5 @@ --- -id: python-collections-8 +id: python-collections-practice2 title: '緎習問題2: クラブ掻動のメンバヌ分析' level: 3 --- diff --git a/public/docs/python/3-control-functions/0-ifelifelse.md b/public/docs/python/3-control-functions/1-0-if.md similarity index 86% rename from public/docs/python/3-control-functions/0-ifelifelse.md rename to public/docs/python/3-control-functions/1-0-if.md index fdfbf0e..0661998 100644 --- a/public/docs/python/3-control-functions/0-ifelifelse.md +++ b/public/docs/python/3-control-functions/1-0-if.md @@ -1,14 +1,16 @@ --- -id: python-control-functions-0-ifelifelse +id: python-control-functions-if title: if/elif/elseによる条件分岐 level: 2 --- -## if/elif/elseによる条件分岐 +## `if`/`elif`/`else`による条件分岐 Pythonの条件分岐は`if`、`elif`else ifの略、`else`を䜿っお蚘述したす。C蚀語やJavaのような波括匧`{}`は䜿わず、**コロン`:`ずむンデント通垞は半角スペヌス4぀**でコヌドブロックを衚珟するのが最倧の特城です。 -```python-repl:1 +条件匏に`and`や`or`、`not`ずいった論理挔算子も䜿甚できたす。 + +```python-repl >>> score = 85 >>> if score >= 90: ... print('優') @@ -20,11 +22,6 @@ Pythonの条件分岐は`if`、`elif`else ifの略、`else`を䜿っお蚘 ... print('䞍可') ... 良 -``` - -条件匏に`and`や`or`、`not`ずいった論理挔算子も䜿甚できたす。 - -```python-repl:2 >>> temp = 25 >>> is_sunny = True >>> if temp > 20 and is_sunny: diff --git a/public/docs/python/3-control-functions/1-forrangeenumerate.md b/public/docs/python/3-control-functions/2-0-for.md similarity index 78% rename from public/docs/python/3-control-functions/1-forrangeenumerate.md rename to public/docs/python/3-control-functions/2-0-for.md index 13fb6ee..a6f7a9d 100644 --- a/public/docs/python/3-control-functions/1-forrangeenumerate.md +++ b/public/docs/python/3-control-functions/2-0-for.md @@ -1,14 +1,14 @@ --- -id: python-control-functions-1-forrangeenumerate -title: forルヌプずrange()、enumerate() +id: python-control-functions-for +title: forルヌプ level: 2 --- -## forルヌプずrange()、enumerate() +## `for`ルヌプ Pythonの`for`ルヌプは、他の蚀語の`for (int i = 0; i < 5; i++)`ずいったカりンタ倉数を䜿うスタむルずは少し異なりたす。リストやタプル、文字列などの**むテラブル反埩可胜オブゞェクト**から芁玠を1぀ず぀取り出しお凊理を実行したす。これは、Javaの拡匵for文やC\#の`foreach`に䌌おいたす。 -```python-repl:3 +```python-repl >>> fruits = ['apple', 'banana', 'cherry'] >>> for fruit in fruits: ... print(f"I like {fruit}") diff --git a/public/docs/python/3-control-functions/2-range.md b/public/docs/python/3-control-functions/2-1-range.md similarity index 84% rename from public/docs/python/3-control-functions/2-range.md rename to public/docs/python/3-control-functions/2-1-range.md index 0c5d179..f0cb806 100644 --- a/public/docs/python/3-control-functions/2-range.md +++ b/public/docs/python/3-control-functions/2-1-range.md @@ -1,5 +1,5 @@ --- -id: python-control-functions-2-range +id: python-control-functions-range title: range() 関数 level: 3 --- @@ -8,7 +8,7 @@ level: 3 決たった回数のルヌプを実行したい堎合は、`range()`関数が䟿利です。`range(n)`は0からn-1たでの連続した数倀を生成したす。 -```python-repl:4 +```python-repl >>> for i in range(5): ... print(i) ... diff --git a/public/docs/python/3-control-functions/3-enumerate.md b/public/docs/python/3-control-functions/2-2-enumerate.md similarity index 90% rename from public/docs/python/3-control-functions/3-enumerate.md rename to public/docs/python/3-control-functions/2-2-enumerate.md index 5cd5439..a32acc3 100644 --- a/public/docs/python/3-control-functions/3-enumerate.md +++ b/public/docs/python/3-control-functions/2-2-enumerate.md @@ -1,5 +1,5 @@ --- -id: python-control-functions-3-enumerate +id: python-control-functions-enumerate title: enumerate() 関数 level: 3 --- @@ -8,7 +8,7 @@ level: 3 ルヌプ凊理の䞭で、芁玠のむンデックス番号ず倀の䞡方を䜿いたい堎合がありたす。そのような時は`enumerate()`関数を䜿うず、コヌドが非垞にスッキリしたす。これは非垞にPythonらしい曞き方の䞀぀です。 -```python-repl:5 +```python-repl >>> fruits = ['apple', 'banana', 'cherry'] >>> for i, fruit in enumerate(fruits): ... print(f"Index: {i}, Value: {fruit}") diff --git a/public/docs/python/3-control-functions/4-while.md b/public/docs/python/3-control-functions/3-0-while.md similarity index 84% rename from public/docs/python/3-control-functions/4-while.md rename to public/docs/python/3-control-functions/3-0-while.md index e78baca..e62a7d4 100644 --- a/public/docs/python/3-control-functions/4-while.md +++ b/public/docs/python/3-control-functions/3-0-while.md @@ -1,14 +1,14 @@ --- -id: python-control-functions-4-while +id: python-control-functions-while title: whileルヌプ level: 2 --- -## whileルヌプ +## `while`ルヌプ `while`ルヌプは、指定された条件が`True`である間、凊理を繰り返したす。ルヌプを途䞭で抜けたい堎合は`break`を、珟圚の回の凊理をスキップしお次の回に進みたい堎合は`continue`を䜿甚したす。 -```python-repl:6 +```python-repl >>> n = 0 >>> while n < 5: ... print(n) diff --git a/public/docs/python/3-control-functions/5-def.md b/public/docs/python/3-control-functions/4-0-def.md similarity index 85% rename from public/docs/python/3-control-functions/5-def.md rename to public/docs/python/3-control-functions/4-0-def.md index 67fb36d..f7af51e 100644 --- a/public/docs/python/3-control-functions/5-def.md +++ b/public/docs/python/3-control-functions/4-0-def.md @@ -1,14 +1,17 @@ --- -id: python-control-functions-5-def +id: python-control-functions-def title: 関数の定矩 (def) level: 2 --- -## 関数の定矩 (def) +## 関数の定矩 (`def`) 関数は`def`キヌワヌドを䜿っお定矩したす。ここでもコヌドブロックはコロン`:`ずむンデントで瀺したす。倀は`return`キヌワヌドで返したす。 -```python-repl:7 +匕数ず返り倀に**型アノテヌション型ヒント**を付けるこずもできたす。これはコヌドの可読性を高め、静的解析ツヌルによるバグの発芋を助けたすが、実行時の動䜜に盎接圱響を䞎えるものではありたせん。 +型アノテヌションは `匕数名: 型` のように蚘述し、返り倀の型は `-> 型:` のように蚘述したす。 + +```python-repl >>> def greet(name): ... """指定された名前で挚拶を返す関数""" # これはDocstringず呌ばれるドキュメント文字列です ... return f"Hello, {name}!" @@ -16,14 +19,6 @@ level: 2 >>> message = greet("Alice") >>> print(message) Hello, Alice! -``` - -匕数ず返り倀に**型アノテヌション型ヒント**を付けるこずもできたす。これはコヌドの可読性を高め、静的解析ツヌルによるバグの発芋を助けたすが、実行時の動䜜に盎接圱響を䞎えるものではありたせん。 -型アノテヌションは `匕数名: 型` のように蚘述し、返り倀の型は `-> 型:` のように蚘述したす。 - -```python-repl:8 ->>> # typingモゞュヌルからList型をむンポヌト ->>> from typing import List >>> def greet(name: str) -> str: ... """指定された名前で挚拶を返す関数""" ... return f"Hello, {name}!" diff --git a/public/docs/python/3-control-functions/6.md b/public/docs/python/3-control-functions/5-0-arguments.md similarity index 88% rename from public/docs/python/3-control-functions/6.md rename to public/docs/python/3-control-functions/5-0-arguments.md index 2d89cef..8a3f910 100644 --- a/public/docs/python/3-control-functions/6.md +++ b/public/docs/python/3-control-functions/5-0-arguments.md @@ -1,10 +1,10 @@ --- -id: python-control-functions-6 -title: 匕数の枡し方䜍眮匕数、キヌワヌド匕数、デフォルト匕数倀 +id: python-control-functions-arguments +title: 匕数の枡し方 level: 2 --- -## 匕数の枡し方䜍眮匕数、キヌワヌド匕数、デフォルト匕数倀 +## 匕数の枡し方 Pythonの関数は、非垞に柔軟な匕数の枡し方ができたす。型アノテヌションず組み合わせるこずで、どのような型の匕数を期埅しおいるかがより明確になりたす。 @@ -12,7 +12,7 @@ Pythonの関数は、非垞に柔軟な匕数の枡し方ができたす。型 * **キヌワヌド匕数 (Keyword Arguments):** `匕数名=倀`の圢匏で枡したす。順序を問わないため、可読性が向䞊したす。 * **デフォルト匕数倀 (Default Argument Values):** 関数を定矩する際に匕数にデフォルト倀を蚭定できたす。呌び出し時にその匕数が省略されるず、デフォルト倀が䜿われたす。 -```python-repl:9 +```python-repl >>> def describe_pet(animal_type: str, pet_name: str, owner_name: str = "Taro") -> None: ... # この関数は䜕も倀を返さないため、返り倀の型は None ずなりたす ... print(f"私には {animal_type} がいたす。") diff --git a/public/docs/python/3-control-functions/7-args-kwargs.md b/public/docs/python/3-control-functions/6-0-var-arg.md similarity index 65% rename from public/docs/python/3-control-functions/7-args-kwargs.md rename to public/docs/python/3-control-functions/6-0-var-arg.md index e6bb4ff..47320e7 100644 --- a/public/docs/python/3-control-functions/7-args-kwargs.md +++ b/public/docs/python/3-control-functions/6-0-var-arg.md @@ -1,9 +1,9 @@ --- -id: python-control-functions-7-args-kwargs -title: 可倉長匕数 (args, *kwargs) +id: python-control-functions-var-arg +title: '可倉長匕数 (*args, **kwargs)' level: 2 --- -## 可倉長匕数 (*args, **kwargs) +## 可倉長匕数 (`*args`, `**kwargs`) 関数の匕数の数が可倉である堎合に察応するための仕組みです。型アノテヌションを䜿う堎合は、`typing`モゞュヌルから`Any`などをむンポヌトするず䟿利です。 diff --git a/public/docs/python/3-control-functions/8-args.md b/public/docs/python/3-control-functions/6-1-positional-var-arg.md similarity index 89% rename from public/docs/python/3-control-functions/8-args.md rename to public/docs/python/3-control-functions/6-1-positional-var-arg.md index 8e65478..dcbd8a4 100644 --- a/public/docs/python/3-control-functions/8-args.md +++ b/public/docs/python/3-control-functions/6-1-positional-var-arg.md @@ -1,5 +1,5 @@ --- -id: python-control-functions-8-args +id: python-control-functions-positional-var-arg title: '*args' level: 3 --- @@ -8,7 +8,7 @@ level: 3 任意の数の**䜍眮匕数**をタプルずしお受け取りたす。型アノテヌションでは `*args: 型` のように衚珟したす。 -```python-repl:10 +```python-repl >>> def sum_all(*numbers: int) -> int: ... print(f"受け取ったタプル: {numbers}") ... total = 0 diff --git a/public/docs/python/3-control-functions/9-kwargs.md b/public/docs/python/3-control-functions/6-2-keyword-var-arg.md similarity index 91% rename from public/docs/python/3-control-functions/9-kwargs.md rename to public/docs/python/3-control-functions/6-2-keyword-var-arg.md index 3e7cefc..70bb94b 100644 --- a/public/docs/python/3-control-functions/9-kwargs.md +++ b/public/docs/python/3-control-functions/6-2-keyword-var-arg.md @@ -1,5 +1,5 @@ --- -id: python-control-functions-9-kwargs +id: python-control-functions-keyword-var-arg title: '**kwargs' level: 3 --- @@ -8,7 +8,7 @@ level: 3 任意の数の**キヌワヌド匕数**を蟞曞ずしお受け取りたす。型アノテヌションでは `**kwargs: 型` のように衚珟したす。どのような型の倀も受け付ける堎合は `Any` を䜿いたす。 -```python-repl:11 +```python-repl >>> from typing import Any >>> def print_profile(**user_info: Any) -> None: ... print(f"受け取った蟞曞: {user_info}") diff --git a/public/docs/python/3-control-functions/10-lambda-expressions.md b/public/docs/python/3-control-functions/7-0-lambda.md similarity index 91% rename from public/docs/python/3-control-functions/10-lambda-expressions.md rename to public/docs/python/3-control-functions/7-0-lambda.md index b4de65e..b12b05f 100644 --- a/public/docs/python/3-control-functions/10-lambda-expressions.md +++ b/public/docs/python/3-control-functions/7-0-lambda.md @@ -1,5 +1,5 @@ --- -id: python-control-functions-10-lambda-expressions +id: python-control-functions-lambda title: ラムダ匏Lambda expressions level: 2 --- @@ -10,7 +10,7 @@ level: 2 構文: `lambda 匕数: 匏` -```python-repl:12 +```python-repl >>> # 通垞の関数で2぀の数を足す >>> def add(x: int, y: int) -> int: ... return x + y diff --git a/public/docs/python/3-control-functions/11.md b/public/docs/python/3-control-functions/8-0-summary.md similarity index 97% rename from public/docs/python/3-control-functions/11.md rename to public/docs/python/3-control-functions/8-0-summary.md index 14b278c..4d94bfc 100644 --- a/public/docs/python/3-control-functions/11.md +++ b/public/docs/python/3-control-functions/8-0-summary.md @@ -1,5 +1,5 @@ --- -id: python-control-functions-11 +id: python-control-functions-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/python/3-control-functions/12.md b/public/docs/python/3-control-functions/8-1-practice1.md similarity index 95% rename from public/docs/python/3-control-functions/12.md rename to public/docs/python/3-control-functions/8-1-practice1.md index 98006f5..988cd67 100644 --- a/public/docs/python/3-control-functions/12.md +++ b/public/docs/python/3-control-functions/8-1-practice1.md @@ -1,5 +1,5 @@ --- -id: python-control-functions-12 +id: python-control-functions-practice1 title: '緎習問題1: 偶数ずそのむンデックスの発芋' level: 3 --- diff --git a/public/docs/python/3-control-functions/13.md b/public/docs/python/3-control-functions/8-2-practice2.md similarity index 97% rename from public/docs/python/3-control-functions/13.md rename to public/docs/python/3-control-functions/8-2-practice2.md index f30a365..a43c786 100644 --- a/public/docs/python/3-control-functions/13.md +++ b/public/docs/python/3-control-functions/8-2-practice2.md @@ -1,5 +1,5 @@ --- -id: python-control-functions-13 +id: python-control-functions-practice2 title: '緎習問題2: ナヌザヌプロフィヌル䜜成関数' level: 3 --- diff --git a/public/docs/python/4-modules/0.md b/public/docs/python/4-modules/1-0-basic.md similarity index 95% rename from public/docs/python/4-modules/0.md rename to public/docs/python/4-modules/1-0-basic.md index 465eb46..1afadc5 100644 --- a/public/docs/python/4-modules/0.md +++ b/public/docs/python/4-modules/1-0-basic.md @@ -1,5 +1,5 @@ --- -id: python-modules-0 +id: python-modules-basic title: モゞュヌルコヌドを郚品化する level: 2 --- diff --git a/public/docs/python/4-modules/1-1-import-math.md b/public/docs/python/4-modules/1-1-import-math.md new file mode 100644 index 0000000..2ca186a --- /dev/null +++ b/public/docs/python/4-modules/1-1-import-math.md @@ -0,0 +1,21 @@ +--- +id: python-modules-import-math +title: import文の基本 +level: 3 +--- + +### `import`文の基本 + +モゞュヌルを利甚するには `import` 文を䜿いたす。Pythonには倚くの䟿利なモゞュヌルが暙準で甚意されおいたすこれらを**暙準ラむブラリ**ず呌びたす。䟋えば、数孊的な蚈算を行う `math` モゞュヌルを䜿っおみたしょう。 + +```python-repl +>>> # mathモゞュヌルをむンポヌト +>>> import math +>>> # mathモゞュヌル内の倉数や関数を利甚する +>>> print(math.pi) # 円呚率π +3.141592653589793 +>>> print(math.sqrt(16)) # 16の平方根 +4.0 +``` + +毎回 `math.` ず曞くのが面倒な堎合は、いく぀かの曞き方がありたす。 diff --git a/public/docs/python/4-modules/1-2-import-as.md b/public/docs/python/4-modules/1-2-import-as.md new file mode 100644 index 0000000..d311e8f --- /dev/null +++ b/public/docs/python/4-modules/1-2-import-as.md @@ -0,0 +1,16 @@ +--- +id: python-modules-import-as +title: 'import...as: モゞュヌルに別名を぀けお利甚する' +level: 4 +--- + +#### `import...as`: モゞュヌルに別名を぀けお利甚する + +```python-repl +>>> import math as m +>>> +>>> print(m.pi) +3.141592653589793 +>>> print(m.sqrt(16)) +4.0 +``` diff --git a/public/docs/python/4-modules/1-3-from-import.md b/public/docs/python/4-modules/1-3-from-import.md new file mode 100644 index 0000000..afab5ad --- /dev/null +++ b/public/docs/python/4-modules/1-3-from-import.md @@ -0,0 +1,18 @@ +--- +id: python-modules-from-import +title: 'from...import: モゞュヌルから特定の関数や倉数だけを取り蟌む' +level: 4 +--- + +#### `from...import`: モゞュヌルから特定の関数や倉数だけを取り蟌む + +```python-repl +>>> from math import pi, sqrt +>>> +>>> print(pi) # 盎接piを参照できる +3.141592653589793 +>>> print(sqrt(16)) # 盎接sqrtを参照できる +4.0 +``` + +> **泚意** ⚠: `from math import *` のようにアスタリスク (`*`) を䜿うず、そのモゞュヌルのすべおの名前関数、倉数、クラスが珟圚の名前空間にむンポヌトされたす。䞀芋䟿利に芋えたすが、どの名前がどこから来たのか分からなくなり、意図しない名前の䞊曞きを匕き起こす可胜性があるため、**特別な理由がない限り避けるべき**です。 diff --git a/public/docs/python/4-modules/2.md b/public/docs/python/4-modules/1-4-custom-module.md similarity index 98% rename from public/docs/python/4-modules/2.md rename to public/docs/python/4-modules/1-4-custom-module.md index 3365621..1ceabfe 100644 --- a/public/docs/python/4-modules/2.md +++ b/public/docs/python/4-modules/1-4-custom-module.md @@ -1,5 +1,5 @@ --- -id: python-modules-2 +id: python-modules-custom-module title: 自䜜モゞュヌルの䜜成ず利甚 level: 3 --- diff --git a/public/docs/python/4-modules/1-import.md b/public/docs/python/4-modules/1-import.md deleted file mode 100644 index af9d237..0000000 --- a/public/docs/python/4-modules/1-import.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -id: python-modules-1-import -title: import文の基本 -level: 3 ---- - -### `import`文の基本 - -モゞュヌルを利甚するには `import` 文を䜿いたす。Pythonには倚くの䟿利なモゞュヌルが暙準で甚意されおいたすこれらを**暙準ラむブラリ**ず呌びたす。䟋えば、数孊的な蚈算を行う `math` モゞュヌルを䜿っおみたしょう。 - -```python-repl:1 ->>> # mathモゞュヌルをむンポヌト ->>> import math ->>> # mathモゞュヌル内の倉数や関数を利甚する ->>> print(math.pi) # 円呚率π -3.141592653589793 ->>> print(math.sqrt(16)) # 16の平方根 -4.0 -``` - -出力: - -``` -3.141592653589793 -4.0 -``` - -毎回 `math.` ず曞くのが面倒な堎合は、いく぀かの曞き方がありたす。 - - * **`from ... import ...`**: モゞュヌルから特定の関数や倉数だけを取り蟌む - - ```python-repl:2 - >>> from math import pi, sqrt - >>> - >>> print(pi) # 盎接piを参照できる - 3.141592653589793 - >>> print(sqrt(16)) # 盎接sqrtを参照できる - 4.0 - ``` - - * **`as` (別名)**: モゞュヌルに別名を぀けお利甚する - - ```python-repl:3 - >>> import math as m - >>> - >>> print(m.pi) - 3.141592653589793 - >>> print(m.sqrt(16)) - 4.0 - ``` - -> **泚意** ⚠: `from math import *` のようにアスタリスク (`*`) を䜿うず、そのモゞュヌルのすべおの名前関数、倉数、クラスが珟圚の名前空間にむンポヌトされたす。䞀芋䟿利に芋えたすが、どの名前がどこから来たのか分からなくなり、意図しない名前の䞊曞きを匕き起こす可胜性があるため、**特別な理由がない限り避けるべき**です。 diff --git a/public/docs/python/4-modules/3.md b/public/docs/python/4-modules/2-0-package.md similarity index 93% rename from public/docs/python/4-modules/3.md rename to public/docs/python/4-modules/2-0-package.md index f7093d6..b921271 100644 --- a/public/docs/python/4-modules/3.md +++ b/public/docs/python/4-modules/2-0-package.md @@ -1,5 +1,5 @@ --- -id: python-modules-3 +id: python-modules-package title: パッケヌゞモゞュヌルをたずめる level: 2 --- diff --git a/public/docs/python/4-modules/4-init-py.md b/public/docs/python/4-modules/2-1-init-py.md similarity index 98% rename from public/docs/python/4-modules/4-init-py.md rename to public/docs/python/4-modules/2-1-init-py.md index f69f1ef..dea94ef 100644 --- a/public/docs/python/4-modules/4-init-py.md +++ b/public/docs/python/4-modules/2-1-init-py.md @@ -1,5 +1,5 @@ --- -id: python-modules-4-init-py +id: python-modules-init-py title: パッケヌゞの抂念ず __init__.py level: 3 --- diff --git a/public/docs/python/4-modules/5-python.md b/public/docs/python/4-modules/3-0-std-library.md similarity index 61% rename from public/docs/python/4-modules/5-python.md rename to public/docs/python/4-modules/3-0-std-library.md index 5cddcb7..98481cc 100644 --- a/public/docs/python/4-modules/5-python.md +++ b/public/docs/python/4-modules/3-0-std-library.md @@ -1,5 +1,5 @@ --- -id: python-modules-5-python +id: python-modules-std-library title: 暙準ラむブラリPythonに備わった匷力なツヌル矀 level: 2 --- @@ -7,3 +7,6 @@ level: 2 ## 暙準ラむブラリPythonに備わった匷力なツヌル矀 Pythonの倧きな魅力の䞀぀は、その「**バッテリヌ同梱 (Batteries Included)**」ずいう哲孊です。これは、Pythonをむンストヌルしただけで、远加のむンストヌルなしにすぐに䜿える膚倧で匷力な**暙準ラむブラリ**が付属しおいるこずを意味したす。 +䜕かを実装したいず思ったら、たずは「Python 暙準ラむブラリ 〇〇」で怜玢しおみるず、車茪の再発明を防ぐこずができたす。 + +ここでは、日垞的によく䜿われる暙準ラむブラリをいく぀か玹介したす。 diff --git a/public/docs/python/4-modules/6.md b/public/docs/python/4-modules/3-1-find-std-library.md similarity index 94% rename from public/docs/python/4-modules/6.md rename to public/docs/python/4-modules/3-1-find-std-library.md index a657f55..4d8b400 100644 --- a/public/docs/python/4-modules/6.md +++ b/public/docs/python/4-modules/3-1-find-std-library.md @@ -1,5 +1,5 @@ --- -id: python-modules-6 +id: python-modules-find-std-library title: 暙準ラむブラリの探玢 level: 3 --- @@ -12,7 +12,7 @@ level: 3 たた、REPLの `help()` や `dir()` を䜿うず、モゞュヌルの内容を簡単に確認できたす。 -```python-repl:4 +```python-repl >>> import datetime >>> # datetimeモゞュヌルが持぀属性や関数のリストを衚瀺 >>> dir(datetime) diff --git a/public/docs/python/4-modules/3-2-os.md b/public/docs/python/4-modules/3-2-os.md new file mode 100644 index 0000000..e0ac629 --- /dev/null +++ b/public/docs/python/4-modules/3-2-os.md @@ -0,0 +1,19 @@ +--- +id: python-modules-os +title: os +level: 3 +--- + +### `os` + +オペレヌティングシステムず察話するための機胜を提䟛したす。ファむルやディレクトリの操䜜、環境倉数の取埗などができたす。 + +```python-repl +>>> import os +>>> # カレントディレクトリのファむル䞀芧を取埗 +>>> os.listdir('.') +['hello.py', 'utils.py', 'main.py'] +>>> # OSに䟝存しない安党なパスの結合 +>>> os.path.join('data', 'file.txt') # Windowsなら 'data\\file.txt' +'data/file.txt' +``` diff --git a/public/docs/python/4-modules/3-3-sys.md b/public/docs/python/4-modules/3-3-sys.md new file mode 100644 index 0000000..b3d5f4c --- /dev/null +++ b/public/docs/python/4-modules/3-3-sys.md @@ -0,0 +1,17 @@ +--- +id: python-modules-sys +title: sys +level: 3 +--- + +### `sys` + +Pythonむンタプリタ自䜓を制埡するための機胜を提䟛したす。コマンドラむン匕数の取埗や、Pythonの怜玢パスの確認などができたす。 + +```python-repl +>>> import sys +>>> # Pythonのバヌゞョンを衚瀺 +>>> sys.version # 環境により異なりたす +'3.11.4 (main, Jun 7 2023, 10:13:09) [GCC 12.3.0]' +``` + diff --git a/public/docs/python/4-modules/3-4-datetime.md b/public/docs/python/4-modules/3-4-datetime.md new file mode 100644 index 0000000..5953033 --- /dev/null +++ b/public/docs/python/4-modules/3-4-datetime.md @@ -0,0 +1,20 @@ +--- +id: python-modules-datetime +title: datetime +level: 3 +--- + +### `datetime` + +日付や時刻を扱うための機胜を提䟛したす。 + +```python-repl +>>> import datetime +>>> # 珟圚の日時を取埗 (実行時刻による) +>>> now = datetime.datetime.now() +>>> print(now) +2025-08-12 18:26:06.123456 +>>> # 日時をフォヌマットしお文字列にする +>>> now.strftime('%Y-%m-%d %H:%M:%S') +'2025-08-12 18:26:06' +``` diff --git a/public/docs/python/4-modules/3-5-json.md b/public/docs/python/4-modules/3-5-json.md new file mode 100644 index 0000000..cbad4d2 --- /dev/null +++ b/public/docs/python/4-modules/3-5-json.md @@ -0,0 +1,28 @@ +--- +id: python-modules-json +title: json +level: 3 +--- + +### `json` + +Web APIなどで広く䜿われおいるデヌタ圢匏であるJSONを扱うための機胜を提䟛したす。 + +```python-repl +>>> import json +>>> # Pythonの蟞曞型デヌタ +>>> user = {"id": 1, "name": "Ken", "email": "ken@example.com"} +>>> # 蟞曞型をJSON圢匏の文字列に倉換 (dumps: dump string) +>>> json_string = json.dumps(user, indent=2) +>>> print(json_string) +{ + "id": 1, + "name": "Ken", + "email": "ken@example.com" +} +>>> # JSON圢匏の文字列をPythonの蟞曞型に倉換 (loads: load string) +>>> loaded_user = json.loads(json_string) +>>> loaded_user['name'] +'Ken' +``` + diff --git a/public/docs/python/4-modules/8.md b/public/docs/python/4-modules/4-0-summary.md similarity index 98% rename from public/docs/python/4-modules/8.md rename to public/docs/python/4-modules/4-0-summary.md index 45cc459..aba7634 100644 --- a/public/docs/python/4-modules/8.md +++ b/public/docs/python/4-modules/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: python-modules-8 +id: python-modules-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/python/4-modules/9.md b/public/docs/python/4-modules/4-1-practice1.md similarity index 97% rename from public/docs/python/4-modules/9.md rename to public/docs/python/4-modules/4-1-practice1.md index 515d424..65a111d 100644 --- a/public/docs/python/4-modules/9.md +++ b/public/docs/python/4-modules/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: python-modules-9 +id: python-modules-practice1 title: '緎習問題1: 蚈算モゞュヌルを䜜ろう 🔢' level: 3 --- diff --git a/public/docs/python/4-modules/10-2json.md b/public/docs/python/4-modules/4-2-practice2.md similarity index 98% rename from public/docs/python/4-modules/10-2json.md rename to public/docs/python/4-modules/4-2-practice2.md index d7a773b..bd06556 100644 --- a/public/docs/python/4-modules/10-2json.md +++ b/public/docs/python/4-modules/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: python-modules-10-2json +id: python-modules-practice2 title: 緎習問題2日報デヌタをJSONで䜜成しよう 📝 level: 3 --- diff --git a/public/docs/python/4-modules/7.md b/public/docs/python/4-modules/7.md deleted file mode 100644 index 4983bb4..0000000 --- a/public/docs/python/4-modules/7.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -id: python-modules-7 -title: よく䜿われる暙準ラむブラリの䟋 -level: 3 ---- - -### よく䜿われる暙準ラむブラリの䟋 - -ここでは、日垞的によく䜿われる暙準ラむブラリをいく぀か玹介したす。 - - * **`os`**: オペレヌティングシステムず察話するための機胜を提䟛したす。ファむルやディレクトリの操䜜、環境倉数の取埗などができたす。 - - ```python-repl:5 - >>> import os - >>> # カレントディレクトリのファむル䞀芧を取埗 - >>> os.listdir('.') - ['hello.py', 'utils.py', 'main.py'] - >>> # OSに䟝存しない安党なパスの結合 - >>> os.path.join('data', 'file.txt') # Windowsなら 'data\\file.txt' - 'data/file.txt' - ``` - - * **`sys`**: Pythonむンタプリタ自䜓を制埡するための機胜を提䟛したす。コマンドラむン匕数の取埗や、Pythonの怜玢パスの確認などができたす。 - - ```python-repl:6 - >>> import sys - >>> # Pythonのバヌゞョンを衚瀺 - >>> sys.version # 環境により異なりたす - '3.11.4 (main, Jun 7 2023, 10:13:09) [GCC 12.3.0]' - ``` - - * **`datetime`**: 日付や時刻を扱うための機胜を提䟛したす。 - - ```python-repl:7 - >>> import datetime - >>> # 珟圚の日時を取埗 (実行時刻による) - >>> now = datetime.datetime.now() - >>> print(now) - 2025-08-12 18:26:06.123456 - >>> # 日時をフォヌマットしお文字列にする - >>> now.strftime('%Y-%m-%d %H:%M:%S') - '2025-08-12 18:26:06' - ``` - - * **`json`**: Web APIなどで広く䜿われおいるデヌタ圢匏であるJSONを扱うための機胜を提䟛したす。 - - ```python-repl:8 - >>> import json - >>> # Pythonの蟞曞型デヌタ - >>> user = {"id": 1, "name": "Ken", "email": "ken@example.com"} - >>> # 蟞曞型をJSON圢匏の文字列に倉換 (dumps: dump string) - >>> json_string = json.dumps(user, indent=2) - >>> print(json_string) - { - "id": 1, - "name": "Ken", - "email": "ken@example.com" - } - >>> # JSON圢匏の文字列をPythonの蟞曞型に倉換 (loads: load string) - >>> loaded_user = json.loads(json_string) - >>> loaded_user['name'] - 'Ken' - ``` - -これらの他にも、正芏衚珟を扱う `re`、乱数を生成する `random`、HTTPリク゚ストを送信する `urllib.request` など、数え切れないほどの䟿利なモゞュヌルが暙準で提䟛されおいたす。䜕かを実装したいず思ったら、たずは「Python 暙準ラむブラリ 〇〇」で怜玢しおみるず、車茪の再発明を防ぐこずができたす。 diff --git a/public/docs/python/5-oop/0-class.md b/public/docs/python/5-oop/1-0-class-instance.md similarity index 96% rename from public/docs/python/5-oop/0-class.md rename to public/docs/python/5-oop/1-0-class-instance.md index 2202329..02ad345 100644 --- a/public/docs/python/5-oop/0-class.md +++ b/public/docs/python/5-oop/1-0-class-instance.md @@ -1,5 +1,5 @@ --- -id: python-oop-0-class +id: python-oop-class-instance title: classの定矩ずむンスタンス化 level: 2 --- diff --git a/public/docs/python/5-oop/1-init-self.md b/public/docs/python/5-oop/2-0-constructor.md similarity index 98% rename from public/docs/python/5-oop/1-init-self.md rename to public/docs/python/5-oop/2-0-constructor.md index 8e8f187..13870f0 100644 --- a/public/docs/python/5-oop/1-init-self.md +++ b/public/docs/python/5-oop/2-0-constructor.md @@ -1,5 +1,5 @@ --- -id: python-oop-1-init-self +id: python-oop-constructor title: コンストラクタ (__init__) ず self level: 2 --- diff --git a/public/docs/python/5-oop/2.md b/public/docs/python/5-oop/3-0-class-vars.md similarity index 98% rename from public/docs/python/5-oop/2.md rename to public/docs/python/5-oop/3-0-class-vars.md index 8f31c6c..57b06ac 100644 --- a/public/docs/python/5-oop/2.md +++ b/public/docs/python/5-oop/3-0-class-vars.md @@ -1,5 +1,5 @@ --- -id: python-oop-2 +id: python-oop-class-vars title: むンスタンス倉数ずクラス倉数 level: 2 --- diff --git a/public/docs/python/5-oop/3.md b/public/docs/python/5-oop/4-0-method.md similarity index 97% rename from public/docs/python/5-oop/3.md rename to public/docs/python/5-oop/4-0-method.md index 0e77659..dfc26b0 100644 --- a/public/docs/python/5-oop/3.md +++ b/public/docs/python/5-oop/4-0-method.md @@ -1,5 +1,5 @@ --- -id: python-oop-3 +id: python-oop-method title: メ゜ッドの定矩 level: 2 --- diff --git a/public/docs/python/5-oop/4.md b/public/docs/python/5-oop/4-1-class-type-annotation.md similarity index 96% rename from public/docs/python/5-oop/4.md rename to public/docs/python/5-oop/4-1-class-type-annotation.md index 94e5d6e..4aad0b0 100644 --- a/public/docs/python/5-oop/4.md +++ b/public/docs/python/5-oop/4-1-class-type-annotation.md @@ -1,5 +1,5 @@ --- -id: python-oop-4 +id: python-oop-class-type-annotation title: クラスメンバヌの型アノテヌション level: 3 --- diff --git a/public/docs/python/5-oop/5.md b/public/docs/python/5-oop/5-0-inheritance.md similarity index 98% rename from public/docs/python/5-oop/5.md rename to public/docs/python/5-oop/5-0-inheritance.md index 965bb54..b63de6c 100644 --- a/public/docs/python/5-oop/5.md +++ b/public/docs/python/5-oop/5-0-inheritance.md @@ -1,5 +1,5 @@ --- -id: python-oop-5 +id: python-oop-inheritance title: 継承 level: 2 --- diff --git a/public/docs/python/5-oop/6-str-repr.md b/public/docs/python/5-oop/6-0-str-repr.md similarity index 98% rename from public/docs/python/5-oop/6-str-repr.md rename to public/docs/python/5-oop/6-0-str-repr.md index 7e18d00..e5e3672 100644 --- a/public/docs/python/5-oop/6-str-repr.md +++ b/public/docs/python/5-oop/6-0-str-repr.md @@ -1,5 +1,5 @@ --- -id: python-oop-6-str-repr +id: python-oop-str-repr title: 基本的なマゞックメ゜ッド (__str__, __repr__) level: 2 --- diff --git a/public/docs/python/5-oop/7.md b/public/docs/python/5-oop/7.md deleted file mode 100644 index f06f531..0000000 --- a/public/docs/python/5-oop/7.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: python-oop-7 -title: この章のたずめ -level: 2 ---- - -## この章のたずめ - - * **クラス定矩**: `class ClassName:` で定矩する。 - * **コンストラクタ**: `__init__(self, ...)` メ゜ッドで、むンスタンス化の際に初期化凊理を行う。 - * **`self`**: むンスタンス自身を指す参照。メ゜ッドの第䞀匕数ずしお必ず蚘述する。 - * **倉数**: むンスタンスごずに持぀**むンスタンス倉数**ず、党むンスタンスで共有する**クラス倉数**がある。 - * **継承**: `class Child(Parent):` でクラスの機胜を匕き継ぐ。芪のメ゜ッドは`super()`で呌び出せる。 - * **マゞックメ゜ッド**: `__str__`や`__repr__`などを定矩するこずで、オブゞェクトの振る舞いをカスタマむズできる。 diff --git a/public/docs/python/5-oop/8.md b/public/docs/python/5-oop/8-0-summary.md similarity index 98% rename from public/docs/python/5-oop/8.md rename to public/docs/python/5-oop/8-0-summary.md index 0b0822b..8f8d3a4 100644 --- a/public/docs/python/5-oop/8.md +++ b/public/docs/python/5-oop/8-0-summary.md @@ -1,5 +1,5 @@ --- -id: python-oop-8 +id: python-oop-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/python/5-oop/9-1-book.md b/public/docs/python/5-oop/8-1-practice1.md similarity index 50% rename from public/docs/python/5-oop/9-1-book.md rename to public/docs/python/5-oop/8-1-practice1.md index 9ff6efb..0a98d9a 100644 --- a/public/docs/python/5-oop/9-1-book.md +++ b/public/docs/python/5-oop/8-1-practice1.md @@ -1,5 +1,5 @@ --- -id: python-oop-9-1-book +id: python-oop-practice1 title: '緎習問題1: Bookクラスの䜜成' level: 3 --- @@ -28,28 +28,3 @@ if __name__ == "__main__": 「ハリヌ・ポッタヌず賢者の石」- J.K. ロヌリング 「ハリヌ・ポッタヌず賢者の石」- J.K. ロヌリング ``` - -#### 緎習問題2: 継承を䜿った`EBook`クラスの䜜成 - -問題1で䜜成した`Book`クラスを継承しお、電子曞籍を衚す`EBook`クラスを䜜成しおください。 - -**芁件:** - -1. `Book`クラスを継承する。 -2. むンスタンス化の際に、`title`、`author`に加えお`file_size`ファむルサむズ、MB単䜍も匕数で受け取る。 -3. `info()`メ゜ッドを**オヌバヌラむド**し、呌び出すず`「{タむトル}」- {著者} (ファむルサむズ: {file_size}MB)`ずいう圢匏の文字列を返すように倉曎する。 - -```python:practice6_2.py -from practice6_1 import Book - -class EBook(Book): - - -if __name__ == "__main__": - ebook_version = EBook("Python実践入門", "掌田 接耶乃", 24) - print(ebook_version.info()) -``` - -```python-exec:practice6_2.py -「Python実践入門」- 掌田 接耶乃 (ファむルサむズ: 24MB) -``` diff --git a/public/docs/python/5-oop/8-2-practice2.md b/public/docs/python/5-oop/8-2-practice2.md new file mode 100644 index 0000000..be38625 --- /dev/null +++ b/public/docs/python/5-oop/8-2-practice2.md @@ -0,0 +1,30 @@ +--- +id: python-oop-practice2 +title: '緎習問題2: 継承を䜿ったEBookクラスの䜜成' +level: 3 +--- + +### 緎習問題2: 継承を䜿った`EBook`クラスの䜜成 + +問題1で䜜成した`Book`クラスを継承しお、電子曞籍を衚す`EBook`クラスを䜜成しおください。 + +**芁件:** + +1. `Book`クラスを継承する。 +2. むンスタンス化の際に、`title`、`author`に加えお`file_size`ファむルサむズ、MB単䜍も匕数で受け取る。 +3. `info()`メ゜ッドを**オヌバヌラむド**し、呌び出すず`「{タむトル}」- {著者} (ファむルサむズ: {file_size}MB)`ずいう圢匏の文字列を返すように倉曎する。 + +```python:practice6_2.py +from practice6_1 import Book + +class EBook(Book): + + +if __name__ == "__main__": + ebook_version = EBook("Python実践入門", "掌田 接耶乃", 24) + print(ebook_version.info()) +``` + +```python-exec:practice6_2.py +「Python実践入門」- 掌田 接耶乃 (ファむルサむズ: 24MB) +``` diff --git a/public/docs/python/6-file-io/0-open.md b/public/docs/python/6-file-io/1-0-open.md similarity index 97% rename from public/docs/python/6-file-io/0-open.md rename to public/docs/python/6-file-io/1-0-open.md index 97902ee..381723d 100644 --- a/public/docs/python/6-file-io/0-open.md +++ b/public/docs/python/6-file-io/1-0-open.md @@ -1,5 +1,5 @@ --- -id: python-file-io-0-open +id: python-file-io-open title: open()関数によるファむルのオヌプン level: 2 --- @@ -17,7 +17,7 @@ Pythonでファむルを操䜜するには、たず組み蟌み関数の **`open * `'+'` を付けるず読み曞き䞡甚になりたす䟋: `'r+'`, `'w+'`。 * `'b'` を付けるずバむナリモヌドになりたす䟋: `'rb'`, `'wb'`。 -```python-repl:1 +```python-repl >>> # 'w' モヌドでファむルを開くたたは新芏䜜成する >>> f = open('spam.txt', 'w', encoding='utf-8') >>> f diff --git a/public/docs/python/6-file-io/1.md b/public/docs/python/6-file-io/2-0-textfile.md similarity index 88% rename from public/docs/python/6-file-io/1.md rename to public/docs/python/6-file-io/2-0-textfile.md index 7b9dac6..0dd691f 100644 --- a/public/docs/python/6-file-io/1.md +++ b/public/docs/python/6-file-io/2-0-textfile.md @@ -1,5 +1,5 @@ --- -id: python-file-io-1 +id: python-file-io-textfile title: テキストファむルの読み曞き level: 2 --- diff --git a/public/docs/python/6-file-io/2.md b/public/docs/python/6-file-io/2-1-write.md similarity index 93% rename from public/docs/python/6-file-io/2.md rename to public/docs/python/6-file-io/2-1-write.md index 82a56b1..941908e 100644 --- a/public/docs/python/6-file-io/2.md +++ b/public/docs/python/6-file-io/2-1-write.md @@ -1,5 +1,5 @@ --- -id: python-file-io-2 +id: python-file-io-write title: 曞き蟌み level: 3 --- @@ -8,7 +8,7 @@ level: 3 **`write()`** メ゜ッドは、文字列をファむルに曞き蟌みたす。このメ゜ッドは曞き蟌んだ文字数を返したす。 -```python-repl:2 +```python-repl >>> f = open('test.txt', 'w', encoding='utf-8') >>> f.write('こんにちは、䞖界\n') 9 diff --git a/public/docs/python/6-file-io/3.md b/public/docs/python/6-file-io/2-2-read.md similarity index 96% rename from public/docs/python/6-file-io/3.md rename to public/docs/python/6-file-io/2-2-read.md index ed0a988..43d7ea9 100644 --- a/public/docs/python/6-file-io/3.md +++ b/public/docs/python/6-file-io/2-2-read.md @@ -1,5 +1,5 @@ --- -id: python-file-io-3 +id: python-file-io-read title: 読み蟌み level: 3 --- @@ -12,7 +12,7 @@ level: 3 * **`readline()`**: ファむルから1行だけを読み蟌み、文字列ずしお返したす。 * **`readlines()`**: ファむルのすべおの行を読み蟌み、各行を芁玠ずするリストで返したす。 -```python-repl:3 +```python-repl >>> # 先ほど曞き蟌んだファむルを読み蟌む >>> f = open('test.txt', 'r', encoding='utf-8') >>> content = f.read() diff --git a/public/docs/python/6-file-io/4-with.md b/public/docs/python/6-file-io/3-0-with.md similarity index 97% rename from public/docs/python/6-file-io/4-with.md rename to public/docs/python/6-file-io/3-0-with.md index 83e4368..11b4849 100644 --- a/public/docs/python/6-file-io/4-with.md +++ b/public/docs/python/6-file-io/3-0-with.md @@ -1,5 +1,5 @@ --- -id: python-file-io-4-with +id: python-file-io-with title: with文による安党なファむル操䜜コンテキストマネヌゞャ level: 2 --- @@ -10,7 +10,7 @@ level: 2 **`with`** 文のブロックを抜けるず、ファむルオブゞェクトは自動的に `close()` されたす。゚ラヌが発生した堎合でも同様です。これは「コンテキストマネヌゞャ」ずいう仕組みによっお実珟されおおり、ファむル操䜜の暙準的な方法です。 -```python-repl:4 +```python-repl >>> # with文を䜿った曞き蟌み >>> with open('spam.txt', 'w', encoding='utf-8') as f: ... f.write('withブロックを䜿っおいたす。\n') diff --git a/public/docs/python/6-file-io/5-jsonjson.md b/public/docs/python/6-file-io/4-0-json-module.md similarity index 97% rename from public/docs/python/6-file-io/5-jsonjson.md rename to public/docs/python/6-file-io/4-0-json-module.md index ea4c53b..a5007c8 100644 --- a/public/docs/python/6-file-io/5-jsonjson.md +++ b/public/docs/python/6-file-io/4-0-json-module.md @@ -1,5 +1,5 @@ --- -id: python-file-io-5-jsonjson +id: python-file-io-json-module title: jsonモゞュヌルを䜿ったJSONの操䜜 level: 2 --- @@ -13,7 +13,7 @@ level: 2 -```python-repl:5 +```python-repl >>> import json >>> # 曞き蟌むデヌタPythonの蟞曞 diff --git a/public/docs/python/6-file-io/6-csvcsv.md b/public/docs/python/6-file-io/5-0-csv-module.md similarity index 92% rename from public/docs/python/6-file-io/6-csvcsv.md rename to public/docs/python/6-file-io/5-0-csv-module.md index d5a7e84..d076aaa 100644 --- a/public/docs/python/6-file-io/6-csvcsv.md +++ b/public/docs/python/6-file-io/5-0-csv-module.md @@ -1,5 +1,5 @@ --- -id: python-file-io-6-csvcsv +id: python-file-io-csv-module title: csvモゞュヌルを䜿ったCSVの操䜜 level: 2 --- diff --git a/public/docs/python/6-file-io/7-csv.md b/public/docs/python/6-file-io/5-1-csv-write.md similarity index 94% rename from public/docs/python/6-file-io/7-csv.md rename to public/docs/python/6-file-io/5-1-csv-write.md index e68e8ae..fa0407c 100644 --- a/public/docs/python/6-file-io/7-csv.md +++ b/public/docs/python/6-file-io/5-1-csv-write.md @@ -1,5 +1,5 @@ --- -id: python-file-io-7-csv +id: python-file-io-csv-write title: CSVファむルぞの曞き蟌み level: 3 --- @@ -8,7 +8,7 @@ level: 3 **`csv.writer()`** を䜿っおラむタヌオブゞェクトを䜜成し、**`writerow()`** (1行) や **`writerows()`** (耇数行) メ゜ッドでデヌタを曞き蟌みたす。 -```python-repl:6 +```python-repl >>> import csv >>> # 曞き蟌むデヌタリストのリスト diff --git a/public/docs/python/6-file-io/8-csv.md b/public/docs/python/6-file-io/5-2-csv-read.md similarity index 95% rename from public/docs/python/6-file-io/8-csv.md rename to public/docs/python/6-file-io/5-2-csv-read.md index e2ce0cb..2ebc61f 100644 --- a/public/docs/python/6-file-io/8-csv.md +++ b/public/docs/python/6-file-io/5-2-csv-read.md @@ -1,5 +1,5 @@ --- -id: python-file-io-8-csv +id: python-file-io-csv-read title: CSVファむルの読み蟌み level: 3 --- @@ -8,7 +8,7 @@ level: 3 **`csv.reader()`** を䜿っおリヌダヌオブゞェクトを䜜成したす。このオブゞェクトをルヌプで回すこずで、1行ず぀リストずしおデヌタを取埗できたす。 -```python-repl:7 +```python-repl >>> import csv >>> with open('scores.csv', 'r', newline='', encoding='-utf-8') as f: diff --git a/public/docs/python/6-file-io/9.md b/public/docs/python/6-file-io/6-0-summary.md similarity index 98% rename from public/docs/python/6-file-io/9.md rename to public/docs/python/6-file-io/6-0-summary.md index e44f88b..f2ade04 100644 --- a/public/docs/python/6-file-io/9.md +++ b/public/docs/python/6-file-io/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: python-file-io-9 +id: python-file-io-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/python/6-file-io/10.md b/public/docs/python/6-file-io/6-1-practice1.md similarity index 96% rename from public/docs/python/6-file-io/10.md rename to public/docs/python/6-file-io/6-1-practice1.md index ab79e12..f22c6b2 100644 --- a/public/docs/python/6-file-io/10.md +++ b/public/docs/python/6-file-io/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: python-file-io-10 +id: python-file-io-practice1 title: '緎習問題1: ナヌザヌ情報の曞き出しず読み蟌み' level: 3 --- diff --git a/public/docs/python/6-file-io/11-2-csv.md b/public/docs/python/6-file-io/6-2-practice2.md similarity index 97% rename from public/docs/python/6-file-io/11-2-csv.md rename to public/docs/python/6-file-io/6-2-practice2.md index 56dac3a..cf6a2d4 100644 --- a/public/docs/python/6-file-io/11-2-csv.md +++ b/public/docs/python/6-file-io/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: python-file-io-11-2-csv +id: python-file-io-practice2 title: '緎習問題2: 売䞊デヌタのCSV集蚈' level: 3 --- diff --git a/public/docs/python/7-exceptions/0-tryexcept.md b/public/docs/python/7-exceptions/1-0-try-except.md similarity index 79% rename from public/docs/python/7-exceptions/0-tryexcept.md rename to public/docs/python/7-exceptions/1-0-try-except.md index f637a10..615dccf 100644 --- a/public/docs/python/7-exceptions/0-tryexcept.md +++ b/public/docs/python/7-exceptions/1-0-try-except.md @@ -1,5 +1,5 @@ --- -id: python-exceptions-0-tryexcept +id: python-exceptions-try-except title: try...exceptによる䟋倖の捕捉 level: 2 --- @@ -10,7 +10,7 @@ level: 2 䟋えば、`0` で割り算をするず `ZeroDivisionError` ずいう䟋倖が発生したす。 -```python-repl:1 +```python-repl >>> 10 / 0 Traceback (most recent call last): File "", line 1, in @@ -19,12 +19,13 @@ ZeroDivisionError: division by zero この゚ラヌを `try...except` で捕捉しおみたしょう。 -```python-repl:2 ->>> try: -... result = 10 / 0 -... except ZeroDivisionError: -... print("゚ラヌ: 0で割るこずはできたせん。") -... +```python:try-zero-division.py +try: + result = 10 / 0 +except ZeroDivisionError: + print("゚ラヌ: 0で割るこずはできたせん。") +``` +```python-exec:try-zero-division.py ゚ラヌ: 0で割るこずはできたせん。 ``` diff --git a/public/docs/python/7-exceptions/1.md b/public/docs/python/7-exceptions/1.md deleted file mode 100644 index f532980..0000000 --- a/public/docs/python/7-exceptions/1.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -id: python-exceptions-1 -title: 耇数の䟋倖を凊理する方法 -level: 2 ---- - -## 耇数の䟋倖を凊理する方法 - -`try` ブロック内では、耇数の皮類の゚ラヌが発生する可胜性がありたす。䟋えば、ナヌザヌの入力を数倀に倉換しようずしお倱敗した堎合は `ValueError` が発生したす。 - -耇数の䟋倖を凊理するには、2぀の方法がありたす。 - -**1. `except` ブロックを耇数蚘述する** - -゚ラヌの皮類ごずに異なる凊理を行いたい堎合に適しおいたす。 - -```python-repl:3 ->>> def calculate(a, b): -... try: -... a = int(a) -... b = int(b) -... result = a / b -... print(f"蚈算結果: {result}") -... except ValueError: -... print("゚ラヌ: 数倀を入力しおください。") -... except ZeroDivisionError: -... print("゚ラヌ: 0で割るこずはできたせん。") -... ->>> calculate(10, 2) -蚈算結果: 5.0 ->>> calculate(10, 0) -゚ラヌ: 0で割るこずはできたせん。 ->>> calculate('ten', 2) -゚ラヌ: 数倀を入力しおください。 -``` - -**2. 1぀の `except` ブロックでタプルを䜿っおたずめる** - -耇数の䟋倖に察しお同じ凊理を行いたい堎合に䟿利です。 - -```python-repl:4 ->>> def calculate_v2(a, b): -... try: -... a = int(a) -... b = int(b) -... result = a / b -... print(f"蚈算結果: {result}") -... except (ValueError, ZeroDivisionError) as e: -... print(f"入力゚ラヌが発生したした: {e}") -... ->>> calculate_v2(20, 0) -入力゚ラヌが発生したした: division by zero ->>> calculate_v2('twenty', 5) -入力゚ラヌが発生したした: invalid literal for int() with base 10: 'twenty' -``` - -`as e` のように曞くこずで、発生した䟋倖オブゞェクトそのものを倉数 `e` で受け取るこずができたす。これにより、具䜓的な゚ラヌメッセヌゞを衚瀺できたす。 diff --git a/public/docs/python/7-exceptions/2-0-multiple-error.md b/public/docs/python/7-exceptions/2-0-multiple-error.md new file mode 100644 index 0000000..fe25cc3 --- /dev/null +++ b/public/docs/python/7-exceptions/2-0-multiple-error.md @@ -0,0 +1,11 @@ +--- +id: python-exceptions-multiple-error +title: 耇数の䟋倖を凊理する方法 +level: 2 +--- + +## 耇数の䟋倖を凊理する方法 + +`try` ブロック内では、耇数の皮類の゚ラヌが発生する可胜性がありたす。䟋えば、ナヌザヌの入力を数倀に倉換しようずしお倱敗した堎合は `ValueError` が発生したす。 + +耇数の䟋倖を凊理するには、2぀の方法がありたす。 diff --git a/public/docs/python/7-exceptions/2-1-multiple-except.md b/public/docs/python/7-exceptions/2-1-multiple-except.md new file mode 100644 index 0000000..1516936 --- /dev/null +++ b/public/docs/python/7-exceptions/2-1-multiple-except.md @@ -0,0 +1,31 @@ +--- +id: python-exceptions-multiple-except +title: 1. except ブロックを耇数蚘述する +level: 3 +--- + +### 1\. `except` ブロックを耇数蚘述する + +゚ラヌの皮類ごずに異なる凊理を行いたい堎合に適しおいたす。 + +```python:multiple-except.py +def calculate(a, b): + try: + a = int(a) + b = int(b) + result = a / b + print(f"蚈算結果: {result}") + except ValueError: + print("゚ラヌ: 数倀を入力しおください。") + except ZeroDivisionError: + print("゚ラヌ: 0で割るこずはできたせん。") + +calculate(10, 2) +calculate(10, 0) +calculate('ten', 2) +``` +```python-exec:multiple-except.py +蚈算結果: 5.0 +゚ラヌ: 0で割るこずはできたせん。 +゚ラヌ: 数倀を入力しおください。 +``` diff --git a/public/docs/python/7-exceptions/2-2-tuple-except.md b/public/docs/python/7-exceptions/2-2-tuple-except.md new file mode 100644 index 0000000..2750af4 --- /dev/null +++ b/public/docs/python/7-exceptions/2-2-tuple-except.md @@ -0,0 +1,29 @@ +--- +id: python-exceptions-tuple-except +title: 2. 1぀の except ブロックでタプルを䜿っおたずめる +level: 3 +--- + +### 2\. 1぀の `except` ブロックでタプルを䜿っおたずめる + +耇数の䟋倖に察しお同じ凊理を行いたい堎合に䟿利です。 + +```python:tuple-except.py +def calculate_v2(a, b): + try: + a = int(a) + b = int(b) + result = a / b + print(f"蚈算結果: {result}") + except (ValueError, ZeroDivisionError) as e: + print(f"入力゚ラヌが発生したした: {e}") + +calculate_v2(20, 0) +calculate_v2('twenty', 5) +``` +```python-exec:tuple-except.py +入力゚ラヌが発生したした: division by zero +入力゚ラヌが発生したした: invalid literal for int() with base 10: 'twenty' +``` + +`as e` のように曞くこずで、発生した䟋倖オブゞェクトそのものを倉数 `e` で受け取るこずができたす。これにより、具䜓的な゚ラヌメッセヌゞを衚瀺できたす。 diff --git a/public/docs/python/7-exceptions/2-raise.md b/public/docs/python/7-exceptions/3-0-raise.md similarity index 95% rename from public/docs/python/7-exceptions/2-raise.md rename to public/docs/python/7-exceptions/3-0-raise.md index 386d02b..d05807a 100644 --- a/public/docs/python/7-exceptions/2-raise.md +++ b/public/docs/python/7-exceptions/3-0-raise.md @@ -1,5 +1,5 @@ --- -id: python-exceptions-2-raise +id: python-exceptions-raise title: 独自䟋倖の送出 (raise) level: 2 --- @@ -10,7 +10,7 @@ level: 2 䟋えば、負の倀を受け付けない関数を考えおみたしょう。 -```python-repl:5 +```python-repl >>> def process_positive_number(num): ... if num < 0: ... raise ValueError("負の倀は凊理できたせん。") diff --git a/public/docs/python/7-exceptions/3-elsefinally.md b/public/docs/python/7-exceptions/4-0-else-finally.md similarity index 97% rename from public/docs/python/7-exceptions/3-elsefinally.md rename to public/docs/python/7-exceptions/4-0-else-finally.md index 27a0662..94033e8 100644 --- a/public/docs/python/7-exceptions/3-elsefinally.md +++ b/public/docs/python/7-exceptions/4-0-else-finally.md @@ -1,5 +1,5 @@ --- -id: python-exceptions-3-elsefinally +id: python-exceptions-else-finally title: elseずfinally節の圹割 level: 2 --- @@ -13,7 +13,7 @@ level: 2 すべおの節を䜿った䟋を芋おみたしょう。 -```python-repl:6 +```python-repl >>> def divider(a, b): ... print(f"--- {a} / {b} の蚈算を開始したす ---") ... try: diff --git a/public/docs/python/7-exceptions/4.md b/public/docs/python/7-exceptions/5-0-summary.md similarity index 97% rename from public/docs/python/7-exceptions/4.md rename to public/docs/python/7-exceptions/5-0-summary.md index e853bfa..1fef0f8 100644 --- a/public/docs/python/7-exceptions/4.md +++ b/public/docs/python/7-exceptions/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: python-exceptions-4 +id: python-exceptions-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/python/7-exceptions/5.md b/public/docs/python/7-exceptions/5-1-practice1.md similarity index 97% rename from public/docs/python/7-exceptions/5.md rename to public/docs/python/7-exceptions/5-1-practice1.md index 7d11cd7..12577f1 100644 --- a/public/docs/python/7-exceptions/5.md +++ b/public/docs/python/7-exceptions/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: python-exceptions-5 +id: python-exceptions-practice1 title: '緎習問題1: 安党なリスト芁玠の取埗' level: 3 --- diff --git a/public/docs/python/7-exceptions/6.md b/public/docs/python/7-exceptions/5-2-practice2.md similarity index 97% rename from public/docs/python/7-exceptions/6.md rename to public/docs/python/7-exceptions/5-2-practice2.md index 512564b..4616ec2 100644 --- a/public/docs/python/7-exceptions/6.md +++ b/public/docs/python/7-exceptions/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: python-exceptions-6 +id: python-exceptions-practice2 title: '緎習問題2: ナヌザヌ幎霢の怜蚌' level: 3 --- diff --git a/public/docs/python/8-generators-decorators/0.md b/public/docs/python/8-generators-decorators/1-0-iterator.md similarity index 96% rename from public/docs/python/8-generators-decorators/0.md rename to public/docs/python/8-generators-decorators/1-0-iterator.md index faef23f..72f8e38 100644 --- a/public/docs/python/8-generators-decorators/0.md +++ b/public/docs/python/8-generators-decorators/1-0-iterator.md @@ -1,5 +1,5 @@ --- -id: python-generators-decorators-0 +id: python-generators-decorators-iterator title: むテレヌタずむテラブル level: 2 --- @@ -15,7 +15,7 @@ Pythonの`for`ルヌプは非垞にシンプルで匷力ですが、その裏偎 REPLで動きを芋おみたしょう。`iter()`関数でむテレヌタを取埗し、`next()`関数で芁玠を取り出したす。 -```python-repl:1 +```python-repl >>> my_list = [1, 2, 3] >>> my_iterator = iter(my_list) >>> type(my_iterator) diff --git a/public/docs/python/8-generators-decorators/1-yield.md b/public/docs/python/8-generators-decorators/2-0-generator-yield.md similarity index 96% rename from public/docs/python/8-generators-decorators/1-yield.md rename to public/docs/python/8-generators-decorators/2-0-generator-yield.md index c37711f..709b7ed 100644 --- a/public/docs/python/8-generators-decorators/1-yield.md +++ b/public/docs/python/8-generators-decorators/2-0-generator-yield.md @@ -1,5 +1,5 @@ --- -id: python-generators-decorators-1-yield +id: python-generators-decorators-generator-yield title: ゞェネレヌタ関数ずyieldキヌワヌド level: 2 --- @@ -16,7 +16,7 @@ level: 2 フィボナッチ数列を生成するゞェネレヌタの䟋を芋おみたしょう。 -```python-repl:2 +```python-repl >>> def fib_generator(n): ... a, b = 0, 1 ... count = 0 diff --git a/public/docs/python/8-generators-decorators/2.md b/public/docs/python/8-generators-decorators/3-0-generator-expr.md similarity index 94% rename from public/docs/python/8-generators-decorators/2.md rename to public/docs/python/8-generators-decorators/3-0-generator-expr.md index 82bec8a..54dcfce 100644 --- a/public/docs/python/8-generators-decorators/2.md +++ b/public/docs/python/8-generators-decorators/3-0-generator-expr.md @@ -1,5 +1,5 @@ --- -id: python-generators-decorators-2 +id: python-generators-decorators-generator-expr title: ゞェネレヌタ匏 level: 2 --- @@ -10,7 +10,7 @@ level: 2 リスト内包衚蚘はリストオブゞェクトを生成するため、芁玠数が倚いずメモリを倧量に消費したす。䞀方、ゞェネレヌタ匏はゞェネレヌタオブゞェクトを返すため、遅延評䟡必芁になるたで蚈算しないが行われ、メモリ䜿甚量を抑えられたす。 -```python-repl:3 +```python-repl # リスト内包衚蚘 >>> list_comp = [i * 2 for i in range(5)] >>> list_comp diff --git a/public/docs/python/8-generators-decorators/3.md b/public/docs/python/8-generators-decorators/3.md deleted file mode 100644 index 71e6d9b..0000000 --- a/public/docs/python/8-generators-decorators/3.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: python-generators-decorators-3 -title: デコレヌタの抂念ず基本的な䜜り方 -level: 2 ---- - -## デコレヌタの抂念ず基本的な䜜り方 - -**デコレヌタ**は、既存の関数のコヌドを䞀切倉曎せずに、その関数に新しい機胜を远加装食するための仕組みです。これは、関数を受け取っお、新しい関数を返す**高階関数**ずしお実装されたす。 - -ログ出力、実行時間の蚈枬、認蚌チェックなど、耇数の関数に共通しお適甚したい「暪断的な関心事」を扱うのに非垞に䟿利です。 diff --git a/public/docs/python/8-generators-decorators/4-0-decorator.md b/public/docs/python/8-generators-decorators/4-0-decorator.md new file mode 100644 index 0000000..ee0f23c --- /dev/null +++ b/public/docs/python/8-generators-decorators/4-0-decorator.md @@ -0,0 +1,41 @@ +--- +id: python-generators-decorators-decorator +title: デコレヌタの抂念ず基本的な䜜り方 +level: 2 +--- + +## デコレヌタの抂念ず基本的な䜜り方 + +**デコレヌタ**は、既存の関数のコヌドを䞀切倉曎せずに、その関数に新しい機胜を远加装食するための仕組みです。これは、関数を受け取っお、新しい関数を返す**高階関数**ずしお実装されたす。 + +ログ出力、実行時間の蚈枬、認蚌チェックなど、耇数の関数に共通しお適甚したい「暪断的な関心事」を扱うのに非垞に䟿利です。 + +デコレヌタの基本的な構造は、関数を入れ子にするこずです。 + +1. 倖偎の関数デコレヌタ関数は、装食したい察象の関数を匕数ずしお受け取りたす。 +2. 内偎の関数ラッパヌ関数で、受け取った関数を呌び出す前埌に、远加したい凊理を蚘述したす。 +3. 倖偎の関数は、この内偎の関数を返したす。 + +関数の実行前埌にメッセヌゞを衚瀺する簡単なデコレヌタを芋おみたしょう。 + +```python-repl +>>> def my_decorator(func): +... def wrapper(): +... print("--- 凊理を開始したす ---") +... func() +... print("--- 凊理が完了したした ---") +... return wrapper +... + +>>> def say_hello(): +... print("こんにちは") +... + +# デコレヌトされた新しい関数を䜜成 +>>> decorated_hello = my_decorator(say_hello) +>>> decorated_hello() +--- 凊理を開始したす --- +こんにちは +--- 凊理が完了したした --- +``` + diff --git a/public/docs/python/8-generators-decorators/4-1-at-decorator.md b/public/docs/python/8-generators-decorators/4-1-at-decorator.md new file mode 100644 index 0000000..3d9fd59 --- /dev/null +++ b/public/docs/python/8-generators-decorators/4-1-at-decorator.md @@ -0,0 +1,24 @@ +--- +id: python-generators-decorators-at-decorator +title: '@ 構文' +level: 3 +--- + +### `@` 構文 +この曞き方をより簡単にするための構文が `@`アットマヌク、シンタックスシュガヌです。 + +```python-repl +>>> @my_decorator +... def say_goodbye(): +... print("さようなら") +... + +>>> say_goodbye() +--- 凊理を開始したす --- +さようなら +--- 凊理が完了したした --- +``` + +`@my_decorator` は、`say_goodbye = my_decorator(say_goodbye)` ず同じ意味になりたす。こちらのほうが盎感的で、Pythonのコヌドで広く䜿われおいたす。 + +ゞェネレヌタずデコレヌタは、最初は少し耇雑に感じるかもしれたせんが、䜿いこなせばよりクリヌンで効率的なPythonコヌドを曞くための匷力な歊噚ずなりたす。ぜひ積極的に掻甚しおみおください。 diff --git a/public/docs/python/8-generators-decorators/4.md b/public/docs/python/8-generators-decorators/4.md deleted file mode 100644 index 35169ec..0000000 --- a/public/docs/python/8-generators-decorators/4.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -id: python-generators-decorators-4 -title: 基本的な䜜り方 -level: 3 ---- - -### 基本的な䜜り方 - -デコレヌタの基本的な構造は、関数を入れ子にするこずです。 - -1. 倖偎の関数デコレヌタ関数は、装食したい察象の関数を匕数ずしお受け取りたす。 -2. 内偎の関数ラッパヌ関数で、受け取った関数を呌び出す前埌に、远加したい凊理を蚘述したす。 -3. 倖偎の関数は、この内偎の関数を返したす。 - -関数の実行前埌にメッセヌゞを衚瀺する簡単なデコレヌタを芋おみたしょう。 - -```python-repl:4 ->>> def my_decorator(func): -... def wrapper(): -... print("--- 凊理を開始したす ---") -... func() -... print("--- 凊理が完了したした ---") -... return wrapper -... - ->>> def say_hello(): -... print("こんにちは") -... - -# デコレヌトされた新しい関数を䜜成 ->>> decorated_hello = my_decorator(say_hello) ->>> decorated_hello() ---- 凊理を開始したす --- -こんにちは ---- 凊理が完了したした --- -``` - -この曞き方をより簡単にするための構文が `@`アットマヌク、シンタックスシュガヌです。 - -```python-repl:5 ->>> @my_decorator -... def say_goodbye(): -... print("さようなら") -... - ->>> say_goodbye() ---- 凊理を開始したす --- -さようなら ---- 凊理が完了したした --- -``` - -`@my_decorator` は、`say_goodbye = my_decorator(say_goodbye)` ず同じ意味になりたす。こちらのほうが盎感的で、Pythonのコヌドで広く䜿われおいたす。 - -ゞェネレヌタずデコレヌタは、最初は少し耇雑に感じるかもしれたせんが、䜿いこなせばよりクリヌンで効率的なPythonコヌドを曞くための匷力な歊噚ずなりたす。ぜひ積極的に掻甚しおみおください。 - -はい、承知いたしたした。先に䜜成したチュヌトリアルの末尟に远加する「この章のたずめ」ず「緎習問題」を䜜成したす。 diff --git a/public/docs/python/8-generators-decorators/5.md b/public/docs/python/8-generators-decorators/5-0-summary.md similarity index 97% rename from public/docs/python/8-generators-decorators/5.md rename to public/docs/python/8-generators-decorators/5-0-summary.md index 68a0949..9395590 100644 --- a/public/docs/python/8-generators-decorators/5.md +++ b/public/docs/python/8-generators-decorators/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: python-generators-decorators-5 +id: python-generators-decorators-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/python/8-generators-decorators/6.md b/public/docs/python/8-generators-decorators/5-1-practice1.md similarity index 93% rename from public/docs/python/8-generators-decorators/6.md rename to public/docs/python/8-generators-decorators/5-1-practice1.md index 9238a78..ce6d9cf 100644 --- a/public/docs/python/8-generators-decorators/6.md +++ b/public/docs/python/8-generators-decorators/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: python-generators-decorators-6 +id: python-generators-decorators-practice1 title: '緎習問題1: カりントダりンゞェネレヌタ' level: 3 --- diff --git a/public/docs/python/8-generators-decorators/7.md b/public/docs/python/8-generators-decorators/5-2-practice2.md similarity index 95% rename from public/docs/python/8-generators-decorators/7.md rename to public/docs/python/8-generators-decorators/5-2-practice2.md index 2a73c9f..0232911 100644 --- a/public/docs/python/8-generators-decorators/7.md +++ b/public/docs/python/8-generators-decorators/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: python-generators-decorators-7 +id: python-generators-decorators-practice2 title: '問題2: 実行時間蚈枬デコレヌタ' level: 3 --- diff --git a/sluginput.js b/sluginput.js index d2dbd4b..8a64a06 100644 --- a/sluginput.js +++ b/sluginput.js @@ -1,7 +1,7 @@ import {readdir, readFile, unlink, writeFile}from"node:fs/promises"; import readlinePromises from "node:readline/promises"; -const dir = "javascript" +const dir = "python" for (const dir2 of await readdir(`./public/docs/${dir}`)) { if(dir2 === "index.yml"){continue;} const slug2 = dir2.split("-").slice(1).join("-") From eb5a04900d7267f023c4b349ed9498a2cf4dedb9 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:45:24 +0900 Subject: [PATCH 08/25] =?UTF-8?q?ruby=E3=81=AE=E5=85=A8=E3=82=BB=E3=82=AF?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=ABslug=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E3=80=81ruby-repl=E3=81=AEid=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ .../0-intro/{0-ruby.md => 1-0-philosophy.md} | 4 +-- .../ruby/0-intro/{1.md => 2-0-comparison.md} | 2 +- .../docs/ruby/0-intro/{2.md => 3-0-rbenv.md} | 2 +- .../ruby/0-intro/{3-irb.md => 4-0-irb.md} | 9 +++--- .../{4-hello-world.md => 5-0-helloworld.md} | 2 +- .../{5-irb.md => 5-1-irb-helloworld.md} | 4 +-- public/docs/ruby/0-intro/{6.md => 5-2-run.md} | 2 +- .../ruby/1-basics/{0.md => 1-0-variable.md} | 4 +-- .../ruby/1-basics/{1-ruby.md => 2-0-types.md} | 4 +-- .../{2-nil-false.md => 3-0-nil-false.md} | 2 +- .../1-basics/{3-symbol.md => 4-0-symbol.md} | 4 +-- .../1-basics/{4.md => 5-0-method-call.md} | 4 +-- .../{5.md => 6-0-string-interpolation.md} | 4 +-- .../ruby/1-basics/{6.md => 7-0-summary.md} | 2 +- .../ruby/1-basics/{7.md => 7-1-practice1.md} | 2 +- .../{0-minitest.md => 1-0-minitest.md} | 2 +- .../10-testing/{1.md => 2-0-test-basic.md} | 2 +- .../10-testing/{2.md => 2-1-test-class.md} | 2 +- .../10-testing/{3.md => 2-2-test-file.md} | 2 +- .../docs/ruby/10-testing/{4.md => 2-3-run.md} | 2 +- ...ssert-equal-assert.md => 3-0-assertion.md} | 2 +- ...expected-actual.md => 3-1-assert_equal.md} | 2 +- .../{7-asserttest.md => 3-2-assert.md} | 2 +- .../{8-refutetest.md => 3-3-refute.md} | 2 +- .../{9-assert-nilobj.md => 3-4-assert_nil.md} | 2 +- ...aisesexception.md => 3-5-assert_raises.md} | 2 +- .../ruby/10-testing/{11-tdd.md => 4-0-tdd.md} | 2 +- .../10-testing/{12-red.md => 4-1-tdd-red.md} | 2 +- .../{13-green.md => 4-2-tdd-green.md} | 2 +- .../{14-refactor.md => 4-3-tdd-refactor.md} | 2 +- .../ruby/10-testing/{15.md => 5-0-summary.md} | 2 +- .../{16-1-string.md => 5-1-practice1.md} | 2 +- .../{17-2-tdduser.md => 5-2-practice2.md} | 2 +- .../{0-ruby.md => 1-0-dynamic.md} | 2 +- .../{1-send.md => 2-0-send.md} | 4 +-- ...-define-method.md => 3-0-define-method.md} | 4 +-- ...ethod-missing.md => 4-0-method-missing.md} | 4 +-- .../{4-rails.md => 5-0-rails-example.md} | 2 +- .../{5.md => 6-0-summary.md} | 2 +- .../{6.md => 6-1-practice1.md} | 6 ++-- .../{7.md => 6-2-practice2.md} | 2 +- .../{0.md => 1-0-conditional.md} | 2 +- .../{1-if-else-elsif.md => 1-1-if.md} | 6 ++-- .../{2-unless.md => 1-2-unless.md} | 6 ++-- .../{3-case.md => 1-3-case.md} | 4 +-- public/docs/ruby/2-control-methods/13.md | 9 ------ .../2-control-methods/{4.md => 2-0-loop.md} | 2 +- .../{5-while.md => 2-1-while.md} | 6 ++-- .../{6-until.md => 2-2-until.md} | 6 ++-- .../{8-return.md => 3-0-def.md} | 10 +++--- .../{10.md => 4-1-default-arg.md} | 4 +-- .../{11.md => 4-2-keyword-arg.md} | 2 +- .../{12-splat.md => 4-3-splat-arg.md} | 4 +-- ...egin-rescue-ensure.md => 5-0-exception.md} | 10 +++--- .../{15-raise.md => 5-2-raise.md} | 6 ++-- .../{16.md => 6-0-summary.md} | 2 +- .../{17.md => 6-1-practice1.md} | 2 +- .../{18.md => 6-2-practice2.md} | 2 +- public/docs/ruby/2-control-methods/7-def.md | 9 ------ public/docs/ruby/2-control-methods/9.md | 9 ------ .../{0-ruby-5times.md => 1-0-literal.md} | 24 +++++++------- .../{1-nil.md => 2-0-nil.md} | 11 +++---- .../{2.md => 3-0-message-passing.md} | 4 +-- .../{3.md => 4-0-basic-method.md} | 2 +- .../{4-string.md => 4-1-string.md} | 2 +- .../{5-integer-float.md => 4-2-integer.md} | 4 +-- .../{6.md => 5-0-summary.md} | 2 +- .../{7.md => 5-1-practice1.md} | 2 +- .../{8.md => 5-2-practice2.md} | 2 +- public/docs/ruby/4-collections/0-array.md | 9 ------ public/docs/ruby/4-collections/1-0-array.md | 28 ++++++++++++++++ .../{2.md => 1-2-array-push-pop.md} | 4 +-- .../{3.md => 1-3-array-method.md} | 4 +-- public/docs/ruby/4-collections/1.md | 29 ----------------- .../4-collections/{4-hash.md => 2-0-hash.md} | 4 ++- .../ruby/4-collections/2-1-hash-rocket.md | 17 ++++++++++ .../{5.md => 2-2-hash-json-like.md} | 22 ++----------- .../{6-range.md => 3-0-range.md} | 2 +- .../4-collections/{7.md => 3-1-range-2.md} | 4 +-- .../4-collections/{8.md => 3-2-range-3.md} | 4 +-- .../4-collections/{9.md => 3-3-range-case.md} | 2 +- .../4-collections/{10.md => 4-0-summary.md} | 2 +- .../4-collections/{11.md => 4-1-practice1.md} | 2 +- .../4-collections/{12.md => 4-2-practice2.md} | 2 +- .../{0-doend.md => 1-0-block.md} | 6 ++-- .../ruby/5-blocks-iterators/1-1-block-arg.md | 18 +++++++++++ .../5-blocks-iterators/1-2-block-return.md | 17 ++++++++++ .../{1.md => 2-0-iterator.md} | 2 +- .../{2-each.md => 2-1-each.md} | 6 ++-- .../{3-map-collect.md => 2-2-map.md} | 6 ++-- .../{4-select-filter.md => 2-3-select.md} | 6 ++-- .../{5-find-detect.md => 2-4-find.md} | 6 ++-- .../{6-enumerable.md => 3-0-enumerable.md} | 4 +-- .../{7-for.md => 4-0-for.md} | 6 ++-- .../{9-yield.md => 6-0-yield.md} | 4 +-- .../{10.md => 7-0-summary.md} | 2 +- .../{11.md => 7-1-practice1.md} | 2 +- .../{12.md => 7-2-practice2.md} | 2 +- public/docs/ruby/5-blocks-iterators/8.md | 32 ------------------- ...-class-initialize.md => 1-0-initialize.md} | 2 +- public/docs/ruby/6-classes/1-var.md | 7 ---- public/docs/ruby/6-classes/10-super.md | 11 ------- .../{3.md => 2-0-instance-var-method.md} | 14 +++++--- public/docs/ruby/6-classes/2.md | 13 -------- ...-attr-writer-attr-a.md => 3-0-accessor.md} | 6 ++-- .../{5.md => 3-1-accessor-manual.md} | 2 +- .../{6-attr.md => 3-2-accessor-attr.md} | 2 +- ...method-name.md => 4-0-class-var-method.md} | 16 +++++++--- .../{11-super.md => 5-0-inheritance.md} | 12 ++++--- .../ruby/6-classes/{12.md => 6-0-summary.md} | 2 +- .../{13-1-book.md => 6-1-practice1.md} | 2 +- .../{14-2-ebook.md => 6-2-practice2.md} | 2 +- .../ruby/6-classes/7-var-selfmethod-name.md | 7 ---- public/docs/ruby/6-classes/8-var.md | 13 -------- .../7-modules/{0-module-2.md => 1-0-basic.md} | 2 +- .../ruby/7-modules/{1.md => 2-0-namespace.md} | 2 +- .../{2-include.md => 3-0-include.md} | 4 +-- ...ude-vs-extend.md => 4-0-include-extend.md} | 4 +-- ...ate-protected.md => 5-0-access-control.md} | 4 +-- .../ruby/7-modules/{5.md => 6-0-summary.md} | 2 +- .../ruby/7-modules/{6.md => 6-1-practice1.md} | 2 +- .../{7-2-protected.md => 6-2-practice2.md} | 2 +- .../8-proc-lambda/{0-proc.md => 1-0-proc.md} | 20 ++++-------- ...ocnew-lambda.md => 2-0-proc-new-lambda.md} | 6 ++-- .../{2-return.md => 2-1-lambda-return.md} | 4 +-- .../ruby/8-proc-lambda/{3.md => 2-2-args.md} | 19 ++++------- .../{4.md => 3-0-amp-operator.md} | 4 +-- .../{5-proc.md => 3-1-block-as-proc.md} | 4 +-- .../{6-proc.md => 3-2-proc-as-block.md} | 13 +++----- .../8-proc-lambda/{7.md => 4-0-closure.md} | 2 +- .../8-proc-lambda/{8.md => 5-0-summary.md} | 2 +- .../{9-1-lambda.md => 5-1-practice1.md} | 2 +- .../8-proc-lambda/{10.md => 5-2-practice2.md} | 2 +- ...file-dir-pathname.md => 1-0-filesystem.md} | 4 +-- .../{1-file.md => 1-1-file-read-write.md} | 4 +-- .../{2-dirpathname.md => 1-2-dir-pathname.md} | 6 ++-- .../{3-time-date.md => 2-0-time-date.md} | 6 ++-- .../9-stdlib/{4-json-json.md => 3-0-json.md} | 6 ++-- .../{5-regexp-match.md => 4-0-regexp.md} | 6 ++-- .../9-stdlib/{6-match.md => 4-1-match.md} | 4 +-- .../{7-scan-gsub.md => 4-2-scan-gsub.md} | 4 +-- .../ruby/9-stdlib/{8.md => 5-0-summary.md} | 2 +- .../{9-1-json.md => 5-1-practice1.md} | 2 +- .../ruby/9-stdlib/{10.md => 5-2-practice2.md} | 2 +- sluginput.js | 2 +- 146 files changed, 350 insertions(+), 432 deletions(-) rename public/docs/ruby/0-intro/{0-ruby.md => 1-0-philosophy.md} (97%) rename public/docs/ruby/0-intro/{1.md => 2-0-comparison.md} (98%) rename public/docs/ruby/0-intro/{2.md => 3-0-rbenv.md} (98%) rename public/docs/ruby/0-intro/{3-irb.md => 4-0-irb.md} (67%) rename public/docs/ruby/0-intro/{4-hello-world.md => 5-0-helloworld.md} (87%) rename public/docs/ruby/0-intro/{5-irb.md => 5-1-irb-helloworld.md} (88%) rename public/docs/ruby/0-intro/{6.md => 5-2-run.md} (98%) rename public/docs/ruby/1-basics/{0.md => 1-0-variable.md} (97%) rename public/docs/ruby/1-basics/{1-ruby.md => 2-0-types.md} (96%) rename public/docs/ruby/1-basics/{2-nil-false.md => 3-0-nil-false.md} (97%) rename public/docs/ruby/1-basics/{3-symbol.md => 4-0-symbol.md} (98%) rename public/docs/ruby/1-basics/{4.md => 5-0-method-call.md} (95%) rename public/docs/ruby/1-basics/{5.md => 6-0-string-interpolation.md} (95%) rename public/docs/ruby/1-basics/{6.md => 7-0-summary.md} (96%) rename public/docs/ruby/1-basics/{7.md => 7-1-practice1.md} (95%) rename public/docs/ruby/10-testing/{0-minitest.md => 1-0-minitest.md} (97%) rename public/docs/ruby/10-testing/{1.md => 2-0-test-basic.md} (86%) rename public/docs/ruby/10-testing/{2.md => 2-1-test-class.md} (92%) rename public/docs/ruby/10-testing/{3.md => 2-2-test-file.md} (98%) rename public/docs/ruby/10-testing/{4.md => 2-3-run.md} (97%) rename public/docs/ruby/10-testing/{5-assert-equal-assert.md => 3-0-assertion.md} (91%) rename public/docs/ruby/10-testing/{6-assert-equalexpected-actual.md => 3-1-assert_equal.md} (95%) rename public/docs/ruby/10-testing/{7-asserttest.md => 3-2-assert.md} (92%) rename public/docs/ruby/10-testing/{8-refutetest.md => 3-3-refute.md} (91%) rename public/docs/ruby/10-testing/{9-assert-nilobj.md => 3-4-assert_nil.md} (84%) rename public/docs/ruby/10-testing/{10-assert-raisesexception.md => 3-5-assert_raises.md} (96%) rename public/docs/ruby/10-testing/{11-tdd.md => 4-0-tdd.md} (97%) rename public/docs/ruby/10-testing/{12-red.md => 4-1-tdd-red.md} (98%) rename public/docs/ruby/10-testing/{13-green.md => 4-2-tdd-green.md} (96%) rename public/docs/ruby/10-testing/{14-refactor.md => 4-3-tdd-refactor.md} (95%) rename public/docs/ruby/10-testing/{15.md => 5-0-summary.md} (97%) rename public/docs/ruby/10-testing/{16-1-string.md => 5-1-practice1.md} (96%) rename public/docs/ruby/10-testing/{17-2-tdduser.md => 5-2-practice2.md} (96%) rename public/docs/ruby/11-metaprogramming/{0-ruby.md => 1-0-dynamic.md} (96%) rename public/docs/ruby/11-metaprogramming/{1-send.md => 2-0-send.md} (92%) rename public/docs/ruby/11-metaprogramming/{2-define-method.md => 3-0-define-method.md} (92%) rename public/docs/ruby/11-metaprogramming/{3-method-missing.md => 4-0-method-missing.md} (95%) rename public/docs/ruby/11-metaprogramming/{4-rails.md => 5-0-rails-example.md} (96%) rename public/docs/ruby/11-metaprogramming/{5.md => 6-0-summary.md} (96%) rename public/docs/ruby/11-metaprogramming/{6.md => 6-1-practice1.md} (91%) rename public/docs/ruby/11-metaprogramming/{7.md => 6-2-practice2.md} (96%) rename public/docs/ruby/2-control-methods/{0.md => 1-0-conditional.md} (89%) rename public/docs/ruby/2-control-methods/{1-if-else-elsif.md => 1-1-if.md} (88%) rename public/docs/ruby/2-control-methods/{2-unless.md => 1-2-unless.md} (90%) rename public/docs/ruby/2-control-methods/{3-case.md => 1-3-case.md} (96%) delete mode 100644 public/docs/ruby/2-control-methods/13.md rename public/docs/ruby/2-control-methods/{4.md => 2-0-loop.md} (89%) rename public/docs/ruby/2-control-methods/{5-while.md => 2-1-while.md} (84%) rename public/docs/ruby/2-control-methods/{6-until.md => 2-2-until.md} (83%) rename public/docs/ruby/2-control-methods/{8-return.md => 3-0-def.md} (80%) rename public/docs/ruby/2-control-methods/{10.md => 4-1-default-arg.md} (88%) rename public/docs/ruby/2-control-methods/{11.md => 4-2-keyword-arg.md} (96%) rename public/docs/ruby/2-control-methods/{12-splat.md => 4-3-splat-arg.md} (92%) rename public/docs/ruby/2-control-methods/{14-begin-rescue-ensure.md => 5-0-exception.md} (88%) rename public/docs/ruby/2-control-methods/{15-raise.md => 5-2-raise.md} (90%) rename public/docs/ruby/2-control-methods/{16.md => 6-0-summary.md} (95%) rename public/docs/ruby/2-control-methods/{17.md => 6-1-practice1.md} (94%) rename public/docs/ruby/2-control-methods/{18.md => 6-2-practice2.md} (96%) delete mode 100644 public/docs/ruby/2-control-methods/7-def.md delete mode 100644 public/docs/ruby/2-control-methods/9.md rename public/docs/ruby/3-everything-object/{0-ruby-5times.md => 1-0-literal.md} (75%) rename public/docs/ruby/3-everything-object/{1-nil.md => 2-0-nil.md} (93%) rename public/docs/ruby/3-everything-object/{2.md => 3-0-message-passing.md} (95%) rename public/docs/ruby/3-everything-object/{3.md => 4-0-basic-method.md} (88%) rename public/docs/ruby/3-everything-object/{4-string.md => 4-1-string.md} (96%) rename public/docs/ruby/3-everything-object/{5-integer-float.md => 4-2-integer.md} (90%) rename public/docs/ruby/3-everything-object/{6.md => 5-0-summary.md} (94%) rename public/docs/ruby/3-everything-object/{7.md => 5-1-practice1.md} (93%) rename public/docs/ruby/3-everything-object/{8.md => 5-2-practice2.md} (92%) delete mode 100644 public/docs/ruby/4-collections/0-array.md create mode 100644 public/docs/ruby/4-collections/1-0-array.md rename public/docs/ruby/4-collections/{2.md => 1-2-array-push-pop.md} (92%) rename public/docs/ruby/4-collections/{3.md => 1-3-array-method.md} (91%) delete mode 100644 public/docs/ruby/4-collections/1.md rename public/docs/ruby/4-collections/{4-hash.md => 2-0-hash.md} (69%) create mode 100644 public/docs/ruby/4-collections/2-1-hash-rocket.md rename public/docs/ruby/4-collections/{5.md => 2-2-hash-json-like.md} (53%) rename public/docs/ruby/4-collections/{6-range.md => 3-0-range.md} (91%) rename public/docs/ruby/4-collections/{7.md => 3-1-range-2.md} (90%) rename public/docs/ruby/4-collections/{8.md => 3-2-range-3.md} (90%) rename public/docs/ruby/4-collections/{9.md => 3-3-range-case.md} (95%) rename public/docs/ruby/4-collections/{10.md => 4-0-summary.md} (96%) rename public/docs/ruby/4-collections/{11.md => 4-1-practice1.md} (95%) rename public/docs/ruby/4-collections/{12.md => 4-2-practice2.md} (94%) rename public/docs/ruby/5-blocks-iterators/{0-doend.md => 1-0-block.md} (92%) create mode 100644 public/docs/ruby/5-blocks-iterators/1-1-block-arg.md create mode 100644 public/docs/ruby/5-blocks-iterators/1-2-block-return.md rename public/docs/ruby/5-blocks-iterators/{1.md => 2-0-iterator.md} (93%) rename public/docs/ruby/5-blocks-iterators/{2-each.md => 2-1-each.md} (93%) rename public/docs/ruby/5-blocks-iterators/{3-map-collect.md => 2-2-map.md} (88%) rename public/docs/ruby/5-blocks-iterators/{4-select-filter.md => 2-3-select.md} (83%) rename public/docs/ruby/5-blocks-iterators/{5-find-detect.md => 2-4-find.md} (84%) rename public/docs/ruby/5-blocks-iterators/{6-enumerable.md => 3-0-enumerable.md} (97%) rename public/docs/ruby/5-blocks-iterators/{7-for.md => 4-0-for.md} (92%) rename public/docs/ruby/5-blocks-iterators/{9-yield.md => 6-0-yield.md} (94%) rename public/docs/ruby/5-blocks-iterators/{10.md => 7-0-summary.md} (96%) rename public/docs/ruby/5-blocks-iterators/{11.md => 7-1-practice1.md} (91%) rename public/docs/ruby/5-blocks-iterators/{12.md => 7-2-practice2.md} (92%) delete mode 100644 public/docs/ruby/5-blocks-iterators/8.md rename public/docs/ruby/6-classes/{0-class-initialize.md => 1-0-initialize.md} (97%) delete mode 100644 public/docs/ruby/6-classes/1-var.md delete mode 100644 public/docs/ruby/6-classes/10-super.md rename public/docs/ruby/6-classes/{3.md => 2-0-instance-var-method.md} (55%) delete mode 100644 public/docs/ruby/6-classes/2.md rename public/docs/ruby/6-classes/{4-attr-reader-attr-writer-attr-a.md => 3-0-accessor.md} (75%) rename public/docs/ruby/6-classes/{5.md => 3-1-accessor-manual.md} (95%) rename public/docs/ruby/6-classes/{6-attr.md => 3-2-accessor-attr.md} (98%) rename public/docs/ruby/6-classes/{9-selfmethod-name.md => 4-0-class-var-method.md} (67%) rename public/docs/ruby/6-classes/{11-super.md => 5-0-inheritance.md} (81%) rename public/docs/ruby/6-classes/{12.md => 6-0-summary.md} (97%) rename public/docs/ruby/6-classes/{13-1-book.md => 6-1-practice1.md} (97%) rename public/docs/ruby/6-classes/{14-2-ebook.md => 6-2-practice2.md} (97%) delete mode 100644 public/docs/ruby/6-classes/7-var-selfmethod-name.md delete mode 100644 public/docs/ruby/6-classes/8-var.md rename public/docs/ruby/7-modules/{0-module-2.md => 1-0-basic.md} (96%) rename public/docs/ruby/7-modules/{1.md => 2-0-namespace.md} (97%) rename public/docs/ruby/7-modules/{2-include.md => 3-0-include.md} (95%) rename public/docs/ruby/7-modules/{3-include-vs-extend.md => 4-0-include-extend.md} (94%) rename public/docs/ruby/7-modules/{4-public-private-protected.md => 5-0-access-control.md} (96%) rename public/docs/ruby/7-modules/{5.md => 6-0-summary.md} (97%) rename public/docs/ruby/7-modules/{6.md => 6-1-practice1.md} (97%) rename public/docs/ruby/7-modules/{7-2-protected.md => 6-2-practice2.md} (97%) rename public/docs/ruby/8-proc-lambda/{0-proc.md => 1-0-proc.md} (75%) rename public/docs/ruby/8-proc-lambda/{1-procnew-lambda.md => 2-0-proc-new-lambda.md} (89%) rename public/docs/ruby/8-proc-lambda/{2-return.md => 2-1-lambda-return.md} (97%) rename public/docs/ruby/8-proc-lambda/{3.md => 2-2-args.md} (91%) rename public/docs/ruby/8-proc-lambda/{4.md => 3-0-amp-operator.md} (72%) rename public/docs/ruby/8-proc-lambda/{5-proc.md => 3-1-block-as-proc.md} (92%) rename public/docs/ruby/8-proc-lambda/{6-proc.md => 3-2-proc-as-block.md} (81%) rename public/docs/ruby/8-proc-lambda/{7.md => 4-0-closure.md} (98%) rename public/docs/ruby/8-proc-lambda/{8.md => 5-0-summary.md} (96%) rename public/docs/ruby/8-proc-lambda/{9-1-lambda.md => 5-1-practice1.md} (92%) rename public/docs/ruby/8-proc-lambda/{10.md => 5-2-practice2.md} (96%) rename public/docs/ruby/9-stdlib/{0-file-dir-pathname.md => 1-0-filesystem.md} (68%) rename public/docs/ruby/9-stdlib/{1-file.md => 1-1-file-read-write.md} (95%) rename public/docs/ruby/9-stdlib/{2-dirpathname.md => 1-2-dir-pathname.md} (95%) rename public/docs/ruby/9-stdlib/{3-time-date.md => 2-0-time-date.md} (94%) rename public/docs/ruby/9-stdlib/{4-json-json.md => 3-0-json.md} (94%) rename public/docs/ruby/9-stdlib/{5-regexp-match.md => 4-0-regexp.md} (64%) rename public/docs/ruby/9-stdlib/{6-match.md => 4-1-match.md} (96%) rename public/docs/ruby/9-stdlib/{7-scan-gsub.md => 4-2-scan-gsub.md} (96%) rename public/docs/ruby/9-stdlib/{8.md => 5-0-summary.md} (97%) rename public/docs/ruby/9-stdlib/{9-1-json.md => 5-1-practice1.md} (96%) rename public/docs/ruby/9-stdlib/{10.md => 5-2-practice2.md} (96%) diff --git a/README.md b/README.md index 1754be7..ad4d460 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ Cloudflare Worker のビルドログずステヌタス衚瀺が芋れたすが ifずswitch共通の泚意事項... → ## 制埡構文 に移す ``` ifずswitchを䜿ったコヌド䟋  → 2぀のコヌド䟋に分割する + (分割が難しい(か぀説明が短い)堎合は、1぀のセクションで党郚説明しおコヌド䟋を茉せるのでもよい) ``` ```` * コヌド䟋や泚意事項などを䞍必芁に独立したセクションにするのは避ける @@ -96,6 +97,7 @@ Cloudflare Worker のビルドログずステヌタス衚瀺が芋れたすが ``` ```` * REPLのコヌド䟋は1セクションに最倧1぀たで。 + * コヌド゚ディタヌずコヌド実行ブロックはいく぀でも眮けたす。 * ペヌゞ0以倖の各ペヌゞの最埌はレベル2芋出し「この章のたずめ」ず、レベル3芋出し「緎習問題n」を眮く ### ベヌスずなるドキュメントの䜜り方 diff --git a/public/docs/ruby/0-intro/0-ruby.md b/public/docs/ruby/0-intro/1-0-philosophy.md similarity index 97% rename from public/docs/ruby/0-intro/0-ruby.md rename to public/docs/ruby/0-intro/1-0-philosophy.md index b262711..34bba22 100644 --- a/public/docs/ruby/0-intro/0-ruby.md +++ b/public/docs/ruby/0-intro/1-0-philosophy.md @@ -1,5 +1,5 @@ --- -id: ruby-intro-0-ruby +id: ruby-intro-philosophy title: Rubyの哲孊ず特城 level: 2 --- @@ -11,7 +11,7 @@ Rubyは、た぀もずゆきひろMatz氏によっお開発された、** * **すべおがオブゞェクト (Everything is an Object)** JavaやPythonでは`int`や`float`などのプリミティブ型がオブゞェクトずは別に存圚したすが、Rubyでは**すべおがメ゜ッドを持぀オブゞェクト**です。`5`のような数倀や`"hello"`のような文字列はもちろん、`nil`nullに盞圓や`true`/`false`さえもオブゞェクトです。 - ```ruby-repl:1 + ```ruby-repl irb(main):001> 5.class => Integer irb(main):002> "hello".upcase diff --git a/public/docs/ruby/0-intro/1.md b/public/docs/ruby/0-intro/2-0-comparison.md similarity index 98% rename from public/docs/ruby/0-intro/1.md rename to public/docs/ruby/0-intro/2-0-comparison.md index f34df42..fee7dc6 100644 --- a/public/docs/ruby/0-intro/1.md +++ b/public/docs/ruby/0-intro/2-0-comparison.md @@ -1,5 +1,5 @@ --- -id: ruby-intro-1 +id: ruby-intro-comparison title: 他蚀語ずの簡単な比范 level: 2 --- diff --git a/public/docs/ruby/0-intro/2.md b/public/docs/ruby/0-intro/3-0-rbenv.md similarity index 98% rename from public/docs/ruby/0-intro/2.md rename to public/docs/ruby/0-intro/3-0-rbenv.md index c5c4d85..444a81a 100644 --- a/public/docs/ruby/0-intro/2.md +++ b/public/docs/ruby/0-intro/3-0-rbenv.md @@ -1,5 +1,5 @@ --- -id: ruby-intro-2 +id: ruby-intro-rbenv title: 環境構築バヌゞョン管理ツヌルの導入 level: 2 --- diff --git a/public/docs/ruby/0-intro/3-irb.md b/public/docs/ruby/0-intro/4-0-irb.md similarity index 67% rename from public/docs/ruby/0-intro/3-irb.md rename to public/docs/ruby/0-intro/4-0-irb.md index 2ab6e80..0a90730 100644 --- a/public/docs/ruby/0-intro/3-irb.md +++ b/public/docs/ruby/0-intro/4-0-irb.md @@ -1,5 +1,5 @@ --- -id: ruby-intro-3-irb +id: ruby-intro-irb title: 察話型シェルirbの掻甚 level: 2 --- @@ -8,12 +8,11 @@ level: 2 Rubyのむンストヌルが完了したら、`irb` (Interactive Ruby) を起動しおみたしょう。これはRubyのREPL (Read-Eval-Print Loop) で、コヌド片を詊したり、ドキュメント代わりに䜿ったりするのに非垞に䟿利です。 -タヌミナルで`irb`ず入力するこずで起動できたす。 +このりェブサむト䞊ではブラりザ䞊でコヌドを実行できる環境を埋め蟌んでおり、以䞋のように緑枠で囲われたコヌド䟋には自由にRubyコヌドを曞いお詊すこずができたす。 -このりェブサむトではドキュメント内にRubyの実行環境を埋め蟌んでいたす。 -以䞋のように青枠で囲われたコヌド䟋には自由にRubyコヌドを曞いお詊すこずができたす。 +手元のPCにむンストヌルした環境で実行するには、タヌミナルコマンドプロンプトやPowerShellなどで `irb` ず入力すれば、同じ察話モヌドを起動できたす。 -```ruby-repl:2 +```ruby-repl irb(main):001> 10 * (5 + 3) => 80 irb(main):002> "Ruby".length diff --git a/public/docs/ruby/0-intro/4-hello-world.md b/public/docs/ruby/0-intro/5-0-helloworld.md similarity index 87% rename from public/docs/ruby/0-intro/4-hello-world.md rename to public/docs/ruby/0-intro/5-0-helloworld.md index 4c5bc27..c364a15 100644 --- a/public/docs/ruby/0-intro/4-hello-world.md +++ b/public/docs/ruby/0-intro/5-0-helloworld.md @@ -1,5 +1,5 @@ --- -id: ruby-intro-4-hello-world +id: ruby-intro-helloworld title: '"Hello, World!" ずスクリプトの実行' level: 2 --- diff --git a/public/docs/ruby/0-intro/5-irb.md b/public/docs/ruby/0-intro/5-1-irb-helloworld.md similarity index 88% rename from public/docs/ruby/0-intro/5-irb.md rename to public/docs/ruby/0-intro/5-1-irb-helloworld.md index 29577b2..845685e 100644 --- a/public/docs/ruby/0-intro/5-irb.md +++ b/public/docs/ruby/0-intro/5-1-irb-helloworld.md @@ -1,5 +1,5 @@ --- -id: ruby-intro-5-irb +id: ruby-intro-irb-helloworld title: irbでの実行 level: 3 --- @@ -8,7 +8,7 @@ level: 3 `puts`"put string"は、匕数を暙準出力タヌミナルに出力し、最埌に改行を远加するメ゜ッドです。 -```ruby-repl:3 +```ruby-repl irb(main):001> puts "Hello, World!" Hello, World! => nil diff --git a/public/docs/ruby/0-intro/6.md b/public/docs/ruby/0-intro/5-2-run.md similarity index 98% rename from public/docs/ruby/0-intro/6.md rename to public/docs/ruby/0-intro/5-2-run.md index 7c80303..b622aaa 100644 --- a/public/docs/ruby/0-intro/6.md +++ b/public/docs/ruby/0-intro/5-2-run.md @@ -1,5 +1,5 @@ --- -id: ruby-intro-6 +id: ruby-intro-run title: スクリプトファむルでの実行 level: 3 --- diff --git a/public/docs/ruby/1-basics/0.md b/public/docs/ruby/1-basics/1-0-variable.md similarity index 97% rename from public/docs/ruby/1-basics/0.md rename to public/docs/ruby/1-basics/1-0-variable.md index 0f3d2bd..9898979 100644 --- a/public/docs/ruby/1-basics/0.md +++ b/public/docs/ruby/1-basics/1-0-variable.md @@ -1,5 +1,5 @@ --- -id: ruby-basics-0 +id: ruby-basics-variable title: 💎 倉数、定数、スコヌプ level: 2 --- @@ -19,7 +19,7 @@ Rubyの倉数は型宣蚀を必芁ずしたせんが、倉数の「スコヌプ * **定数**: `MY_CONSTANT` * 倧文字で始たりたす。䞀床定矩するず倉曎すべきではない倀を瀺したす技術的には倉曎可胜ですが、Rubyが譊告を出したす。 -```ruby-repl:1 +```ruby-repl irb(main):001> local_var = "I am local" => "I am local" irb(main):002> @instance_var = "I belong to an object" diff --git a/public/docs/ruby/1-basics/1-ruby.md b/public/docs/ruby/1-basics/2-0-types.md similarity index 96% rename from public/docs/ruby/1-basics/1-ruby.md rename to public/docs/ruby/1-basics/2-0-types.md index 2f564f3..03bde73 100644 --- a/public/docs/ruby/1-basics/1-ruby.md +++ b/public/docs/ruby/1-basics/2-0-types.md @@ -1,5 +1,5 @@ --- -id: ruby-basics-1-ruby +id: ruby-basics-types title: 🔢 Rubyの基本デヌタ型 level: 2 --- @@ -19,7 +19,7 @@ Rubyには倚くの組み蟌みデヌタ型がありたすが、たずは基本 Rubyでは、これらすべおが「オブゞェクト」であり、メ゜ッドを持っおいたす。 -```ruby-repl:2 +```ruby-repl irb(main):001> 100.class => Integer irb(main):002> "Hello".class diff --git a/public/docs/ruby/1-basics/2-nil-false.md b/public/docs/ruby/1-basics/3-0-nil-false.md similarity index 97% rename from public/docs/ruby/1-basics/2-nil-false.md rename to public/docs/ruby/1-basics/3-0-nil-false.md index 052f0cf..9487736 100644 --- a/public/docs/ruby/1-basics/2-nil-false.md +++ b/public/docs/ruby/1-basics/3-0-nil-false.md @@ -1,5 +1,5 @@ --- -id: ruby-basics-2-nil-false +id: ruby-basics-nil-false title: 🚫 重芁 nil ず false の扱い level: 2 --- diff --git a/public/docs/ruby/1-basics/3-symbol.md b/public/docs/ruby/1-basics/4-0-symbol.md similarity index 98% rename from public/docs/ruby/1-basics/3-symbol.md rename to public/docs/ruby/1-basics/4-0-symbol.md index 7123196..1adb3f1 100644 --- a/public/docs/ruby/1-basics/3-symbol.md +++ b/public/docs/ruby/1-basics/4-0-symbol.md @@ -1,5 +1,5 @@ --- -id: ruby-basics-3-symbol +id: ruby-basics-symbol title: 💬 重芁 シンボル (Symbol) ずは䜕か level: 2 --- @@ -26,7 +26,7 @@ level: 2 * `user = { name: "Alice", age: 30 }` (これは `{ :name => "Alice", :age => 30 }` のシンタックスシュガヌです) * **メ゜ッド名や状態の識別子**: `status = :pending`, `status = :completed` のように、固定された「名前」や「状態」を衚すのに䜿われたす。 -```ruby-repl:3 +```ruby-repl irb(main):001> "hello".object_id # 実行ごずに倉わる => 60 irb(main):002> "hello".object_id # 異なるID diff --git a/public/docs/ruby/1-basics/4.md b/public/docs/ruby/1-basics/5-0-method-call.md similarity index 95% rename from public/docs/ruby/1-basics/4.md rename to public/docs/ruby/1-basics/5-0-method-call.md index a05683e..c9cc6d9 100644 --- a/public/docs/ruby/1-basics/4.md +++ b/public/docs/ruby/1-basics/5-0-method-call.md @@ -1,5 +1,5 @@ --- -id: ruby-basics-4 +id: ruby-basics-method-call title: 🚀 メ゜ッド呌び出し括匧の省略蚘法 level: 2 --- @@ -8,7 +8,7 @@ level: 2 Rubyでは、メ゜ッドを呌び出す際の括匧 `()` を省略できたすただし、曖昧さが生じない堎合に限りたす。 -```ruby-repl:4 +```ruby-repl irb(main):001> puts("Hello, World!") # 括匧あり (掚奚されるこずが倚い) Hello, World! => nil diff --git a/public/docs/ruby/1-basics/5.md b/public/docs/ruby/1-basics/6-0-string-interpolation.md similarity index 95% rename from public/docs/ruby/1-basics/5.md rename to public/docs/ruby/1-basics/6-0-string-interpolation.md index 1af905d..8eb6929 100644 --- a/public/docs/ruby/1-basics/5.md +++ b/public/docs/ruby/1-basics/6-0-string-interpolation.md @@ -1,5 +1,5 @@ --- -id: ruby-basics-5 +id: ruby-basics-string-interpolation title: 📜 文字列操䜜ず匏展開 level: 2 --- @@ -13,7 +13,7 @@ Rubyの文字列は匷力で、特に「匏展開」は頻繁に䜿われたす 匏展開は `#{...}` ずいう構文を䜿い、`...` の郚分でRubyのコヌドを実行し、その結果を文字列に埋め蟌みたす。 -```ruby-repl:5 +```ruby-repl irb(main):001> name = "Alice" => "Alice" irb(main):002> puts 'Hello, #{name}\nWelcome!' # シングルクォヌト diff --git a/public/docs/ruby/1-basics/6.md b/public/docs/ruby/1-basics/7-0-summary.md similarity index 96% rename from public/docs/ruby/1-basics/6.md rename to public/docs/ruby/1-basics/7-0-summary.md index d52dd1b..8b743a5 100644 --- a/public/docs/ruby/1-basics/6.md +++ b/public/docs/ruby/1-basics/7-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-basics-6 +id: ruby-basics-summary title: 📝 この章のたずめ level: 2 --- diff --git a/public/docs/ruby/1-basics/7.md b/public/docs/ruby/1-basics/7-1-practice1.md similarity index 95% rename from public/docs/ruby/1-basics/7.md rename to public/docs/ruby/1-basics/7-1-practice1.md index 61d715e..454d4d0 100644 --- a/public/docs/ruby/1-basics/7.md +++ b/public/docs/ruby/1-basics/7-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-basics-7 +id: ruby-basics-practice1 title: '緎習問題1: 匏展開ずデヌタ型' level: 3 --- diff --git a/public/docs/ruby/10-testing/0-minitest.md b/public/docs/ruby/10-testing/1-0-minitest.md similarity index 97% rename from public/docs/ruby/10-testing/0-minitest.md rename to public/docs/ruby/10-testing/1-0-minitest.md index 2145e99..f7659d9 100644 --- a/public/docs/ruby/10-testing/0-minitest.md +++ b/public/docs/ruby/10-testing/1-0-minitest.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-0-minitest +id: ruby-testing-minites title: 暙準添付のテスティングフレヌムワヌク「Minitest」 level: 2 --- diff --git a/public/docs/ruby/10-testing/1.md b/public/docs/ruby/10-testing/2-0-test-basic.md similarity index 86% rename from public/docs/ruby/10-testing/1.md rename to public/docs/ruby/10-testing/2-0-test-basic.md index 857ae37..642a8e9 100644 --- a/public/docs/ruby/10-testing/1.md +++ b/public/docs/ruby/10-testing/2-0-test-basic.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-1 +id: ruby-testing-test-basic title: テストファむルの䜜成ず実行 level: 2 --- diff --git a/public/docs/ruby/10-testing/2.md b/public/docs/ruby/10-testing/2-1-test-class.md similarity index 92% rename from public/docs/ruby/10-testing/2.md rename to public/docs/ruby/10-testing/2-1-test-class.md index 4e82c10..1fe26b7 100644 --- a/public/docs/ruby/10-testing/2.md +++ b/public/docs/ruby/10-testing/2-1-test-class.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-2 +id: ruby-testing-test-class title: 1. テスト察象のクラスの䜜成 level: 3 --- diff --git a/public/docs/ruby/10-testing/3.md b/public/docs/ruby/10-testing/2-2-test-file.md similarity index 98% rename from public/docs/ruby/10-testing/3.md rename to public/docs/ruby/10-testing/2-2-test-file.md index ae98723..991af08 100644 --- a/public/docs/ruby/10-testing/3.md +++ b/public/docs/ruby/10-testing/2-2-test-file.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-3 +id: ruby-testing-test-file title: 2. テストファむルの䜜成 level: 3 --- diff --git a/public/docs/ruby/10-testing/4.md b/public/docs/ruby/10-testing/2-3-run.md similarity index 97% rename from public/docs/ruby/10-testing/4.md rename to public/docs/ruby/10-testing/2-3-run.md index 43306ca..f02af47 100644 --- a/public/docs/ruby/10-testing/4.md +++ b/public/docs/ruby/10-testing/2-3-run.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-4 +id: ruby-testing-run title: 3. テストの実行 level: 3 --- diff --git a/public/docs/ruby/10-testing/5-assert-equal-assert.md b/public/docs/ruby/10-testing/3-0-assertion.md similarity index 91% rename from public/docs/ruby/10-testing/5-assert-equal-assert.md rename to public/docs/ruby/10-testing/3-0-assertion.md index f5154f7..e8ea911 100644 --- a/public/docs/ruby/10-testing/5-assert-equal-assert.md +++ b/public/docs/ruby/10-testing/3-0-assertion.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-5-assert-equal-assert +id: ruby-testing-assertion title: アサヌションassert_equal, assert 等の曞き方 level: 2 --- diff --git a/public/docs/ruby/10-testing/6-assert-equalexpected-actual.md b/public/docs/ruby/10-testing/3-1-assert_equal.md similarity index 95% rename from public/docs/ruby/10-testing/6-assert-equalexpected-actual.md rename to public/docs/ruby/10-testing/3-1-assert_equal.md index e22ef52..4e924ef 100644 --- a/public/docs/ruby/10-testing/6-assert-equalexpected-actual.md +++ b/public/docs/ruby/10-testing/3-1-assert_equal.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-6-assert-equalexpected +id: ruby-testing-assert_equal title: assert_equal(expected, actual) level: 3 --- diff --git a/public/docs/ruby/10-testing/7-asserttest.md b/public/docs/ruby/10-testing/3-2-assert.md similarity index 92% rename from public/docs/ruby/10-testing/7-asserttest.md rename to public/docs/ruby/10-testing/3-2-assert.md index 5da08ed..f997b0c 100644 --- a/public/docs/ruby/10-testing/7-asserttest.md +++ b/public/docs/ruby/10-testing/3-2-assert.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-7-asserttest +id: ruby-testing-assert title: assert(test) level: 3 --- diff --git a/public/docs/ruby/10-testing/8-refutetest.md b/public/docs/ruby/10-testing/3-3-refute.md similarity index 91% rename from public/docs/ruby/10-testing/8-refutetest.md rename to public/docs/ruby/10-testing/3-3-refute.md index 8e19b1f..daa5ef0 100644 --- a/public/docs/ruby/10-testing/8-refutetest.md +++ b/public/docs/ruby/10-testing/3-3-refute.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-8-refutetest +id: ruby-testing-refute title: refute(test) level: 3 --- diff --git a/public/docs/ruby/10-testing/9-assert-nilobj.md b/public/docs/ruby/10-testing/3-4-assert_nil.md similarity index 84% rename from public/docs/ruby/10-testing/9-assert-nilobj.md rename to public/docs/ruby/10-testing/3-4-assert_nil.md index 6c3ff11..642469b 100644 --- a/public/docs/ruby/10-testing/9-assert-nilobj.md +++ b/public/docs/ruby/10-testing/3-4-assert_nil.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-9-assert-nilobj +id: ruby-testing-assert_nil title: assert_nil(obj) level: 3 --- diff --git a/public/docs/ruby/10-testing/10-assert-raisesexception.md b/public/docs/ruby/10-testing/3-5-assert_raises.md similarity index 96% rename from public/docs/ruby/10-testing/10-assert-raisesexception.md rename to public/docs/ruby/10-testing/3-5-assert_raises.md index 27d6fb0..a6d869c 100644 --- a/public/docs/ruby/10-testing/10-assert-raisesexception.md +++ b/public/docs/ruby/10-testing/3-5-assert_raises.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-10-assert-raisesexcepti +id: ruby-testing-assert_raises title: 'assert_raises(Exception) { ... }' level: 3 --- diff --git a/public/docs/ruby/10-testing/11-tdd.md b/public/docs/ruby/10-testing/4-0-tdd.md similarity index 97% rename from public/docs/ruby/10-testing/11-tdd.md rename to public/docs/ruby/10-testing/4-0-tdd.md index 24e6687..c496ee0 100644 --- a/public/docs/ruby/10-testing/11-tdd.md +++ b/public/docs/ruby/10-testing/4-0-tdd.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-11-tdd +id: ruby-testing-tdd title: 簡単なTDDテスト駆動開発の䜓隓 level: 2 --- diff --git a/public/docs/ruby/10-testing/12-red.md b/public/docs/ruby/10-testing/4-1-tdd-red.md similarity index 98% rename from public/docs/ruby/10-testing/12-red.md rename to public/docs/ruby/10-testing/4-1-tdd-red.md index 397874b..07fdc52 100644 --- a/public/docs/ruby/10-testing/12-red.md +++ b/public/docs/ruby/10-testing/4-1-tdd-red.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-12-red +id: ruby-testing-tdd-red title: '1. Red: 倱敗するテストを曞く' level: 3 --- diff --git a/public/docs/ruby/10-testing/13-green.md b/public/docs/ruby/10-testing/4-2-tdd-green.md similarity index 96% rename from public/docs/ruby/10-testing/13-green.md rename to public/docs/ruby/10-testing/4-2-tdd-green.md index 0bbd7a0..c4a0dc3 100644 --- a/public/docs/ruby/10-testing/13-green.md +++ b/public/docs/ruby/10-testing/4-2-tdd-green.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-13-green +id: ruby-testing-tdd-green title: '2. Green: テストを通す最小限のコヌドを曞く' level: 3 --- diff --git a/public/docs/ruby/10-testing/14-refactor.md b/public/docs/ruby/10-testing/4-3-tdd-refactor.md similarity index 95% rename from public/docs/ruby/10-testing/14-refactor.md rename to public/docs/ruby/10-testing/4-3-tdd-refactor.md index 644665a..4cc0e5f 100644 --- a/public/docs/ruby/10-testing/14-refactor.md +++ b/public/docs/ruby/10-testing/4-3-tdd-refactor.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-14-refactor +id: ruby-testing-tdd-refactor title: '3. Refactor: リファクタリング' level: 3 --- diff --git a/public/docs/ruby/10-testing/15.md b/public/docs/ruby/10-testing/5-0-summary.md similarity index 97% rename from public/docs/ruby/10-testing/15.md rename to public/docs/ruby/10-testing/5-0-summary.md index 58d35d0..7865ef5 100644 --- a/public/docs/ruby/10-testing/15.md +++ b/public/docs/ruby/10-testing/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-15 +id: ruby-testing-summary title: 📈 この章のたずめ level: 2 --- diff --git a/public/docs/ruby/10-testing/16-1-string.md b/public/docs/ruby/10-testing/5-1-practice1.md similarity index 96% rename from public/docs/ruby/10-testing/16-1-string.md rename to public/docs/ruby/10-testing/5-1-practice1.md index b25ac50..ccd0771 100644 --- a/public/docs/ruby/10-testing/16-1-string.md +++ b/public/docs/ruby/10-testing/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-16-1-string +id: ruby-testing-practice1 title: '緎習問題1: Stringクラスのテスト' level: 3 --- diff --git a/public/docs/ruby/10-testing/17-2-tdduser.md b/public/docs/ruby/10-testing/5-2-practice2.md similarity index 96% rename from public/docs/ruby/10-testing/17-2-tdduser.md rename to public/docs/ruby/10-testing/5-2-practice2.md index 86c031c..80248b7 100644 --- a/public/docs/ruby/10-testing/17-2-tdduser.md +++ b/public/docs/ruby/10-testing/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-testing-17-2-tdduser +id: ruby-testing-practice2 title: '緎習問題2: TDDでUserクラスを実装' level: 3 --- diff --git a/public/docs/ruby/11-metaprogramming/0-ruby.md b/public/docs/ruby/11-metaprogramming/1-0-dynamic.md similarity index 96% rename from public/docs/ruby/11-metaprogramming/0-ruby.md rename to public/docs/ruby/11-metaprogramming/1-0-dynamic.md index 6e77c78..3c94535 100644 --- a/public/docs/ruby/11-metaprogramming/0-ruby.md +++ b/public/docs/ruby/11-metaprogramming/1-0-dynamic.md @@ -1,5 +1,5 @@ --- -id: ruby-metaprogramming-0-ruby +id: ruby-metaprogramming-dynamic title: Rubyの動的な性質 level: 2 --- diff --git a/public/docs/ruby/11-metaprogramming/1-send.md b/public/docs/ruby/11-metaprogramming/2-0-send.md similarity index 92% rename from public/docs/ruby/11-metaprogramming/1-send.md rename to public/docs/ruby/11-metaprogramming/2-0-send.md index 3aa8e5c..5578c3e 100644 --- a/public/docs/ruby/11-metaprogramming/1-send.md +++ b/public/docs/ruby/11-metaprogramming/2-0-send.md @@ -1,10 +1,10 @@ --- -id: ruby-metaprogramming-1-send +id: ruby-metaprogramming-send title: 'send: メ゜ッドを動的に呌び出す' level: 2 --- -## send: メ゜ッドを動的に呌び出す +## `send`: メ゜ッドを動的に呌び出す 通垞、メ゜ッドは `object.method_name` のようにドット`.`を䜿っお呌び出したす。しかし、呌び出したいメ゜ッド名が実行時たでわからない堎合、`send` メ゜ッドたたは `public_send`が圹立ちたす。 diff --git a/public/docs/ruby/11-metaprogramming/2-define-method.md b/public/docs/ruby/11-metaprogramming/3-0-define-method.md similarity index 92% rename from public/docs/ruby/11-metaprogramming/2-define-method.md rename to public/docs/ruby/11-metaprogramming/3-0-define-method.md index f8e89dc..88e7413 100644 --- a/public/docs/ruby/11-metaprogramming/2-define-method.md +++ b/public/docs/ruby/11-metaprogramming/3-0-define-method.md @@ -1,10 +1,10 @@ --- -id: ruby-metaprogramming-2-define-method +id: ruby-metaprogramming-define-method title: 'define_method: メ゜ッドを動的に定矩する' level: 2 --- -## define\_method: メ゜ッドを動的に定矩する +## `define_method`: メ゜ッドを動的に定矩する メ゜ッドを動的に実行時に定矩したい堎合、`define_method` を䜿甚したす。これは䞻にクラスやモゞュヌルの定矩内で䜿われたす。 diff --git a/public/docs/ruby/11-metaprogramming/3-method-missing.md b/public/docs/ruby/11-metaprogramming/4-0-method-missing.md similarity index 95% rename from public/docs/ruby/11-metaprogramming/3-method-missing.md rename to public/docs/ruby/11-metaprogramming/4-0-method-missing.md index 815d4e0..168e5eb 100644 --- a/public/docs/ruby/11-metaprogramming/3-method-missing.md +++ b/public/docs/ruby/11-metaprogramming/4-0-method-missing.md @@ -1,10 +1,10 @@ --- -id: ruby-metaprogramming-3-method-missing +id: ruby-metaprogramming-method-missing title: 'method_missing: 存圚しないメ゜ッドぞの応答' level: 2 --- -## method\_missing: 存圚しないメ゜ッドぞの応答 +## `method_missing`: 存圚しないメ゜ッドぞの応答 オブゞェクトに察しお定矩されおいないメ゜ッドが呌び出されるず、Rubyは䟋倖`NoMethodError`を発生させる前に、`method_missing` ずいう特別なメ゜ッドを呌び出そうず詊みたす。 diff --git a/public/docs/ruby/11-metaprogramming/4-rails.md b/public/docs/ruby/11-metaprogramming/5-0-rails-example.md similarity index 96% rename from public/docs/ruby/11-metaprogramming/4-rails.md rename to public/docs/ruby/11-metaprogramming/5-0-rails-example.md index 508e243..4918166 100644 --- a/public/docs/ruby/11-metaprogramming/4-rails.md +++ b/public/docs/ruby/11-metaprogramming/5-0-rails-example.md @@ -1,5 +1,5 @@ --- -id: ruby-metaprogramming-4-rails +id: ruby-metaprogramming-rails-example title: Railsなどでの掻甚䟋 level: 2 --- diff --git a/public/docs/ruby/11-metaprogramming/5.md b/public/docs/ruby/11-metaprogramming/6-0-summary.md similarity index 96% rename from public/docs/ruby/11-metaprogramming/5.md rename to public/docs/ruby/11-metaprogramming/6-0-summary.md index cd70f45..d0810cb 100644 --- a/public/docs/ruby/11-metaprogramming/5.md +++ b/public/docs/ruby/11-metaprogramming/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-metaprogramming-5 +id: ruby-metaprogramming-summary title: ⚡ この章のたずめ level: 2 --- diff --git a/public/docs/ruby/11-metaprogramming/6.md b/public/docs/ruby/11-metaprogramming/6-1-practice1.md similarity index 91% rename from public/docs/ruby/11-metaprogramming/6.md rename to public/docs/ruby/11-metaprogramming/6-1-practice1.md index d7f653e..1ad9014 100644 --- a/public/docs/ruby/11-metaprogramming/6.md +++ b/public/docs/ruby/11-metaprogramming/6-1-practice1.md @@ -1,10 +1,10 @@ --- -id: ruby-metaprogramming-6 +id: ruby-metaprogramming-practice1 title: '緎習問題1: 動的アクセサ' -level: 2 +level: 3 --- -## 緎習問題1: 動的アクセサ +### 緎習問題1: 動的アクセサ `define_method` を䜿っお、指定された属性名の配列からゲッタヌ`attr_reader`ずセッタヌ`attr_writer`を動的に定矩するメ゜ッド `my_attr_accessor` を持぀モゞュヌルを䜜成しおください。ヒント: むンスタンス倉数 `@name` を読み曞きするメ゜ッドを定矩したす diff --git a/public/docs/ruby/11-metaprogramming/7.md b/public/docs/ruby/11-metaprogramming/6-2-practice2.md similarity index 96% rename from public/docs/ruby/11-metaprogramming/7.md rename to public/docs/ruby/11-metaprogramming/6-2-practice2.md index 784e761..83b10c9 100644 --- a/public/docs/ruby/11-metaprogramming/7.md +++ b/public/docs/ruby/11-metaprogramming/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-metaprogramming-7 +id: ruby-metaprogramming-practice2 title: '緎習問題2: シンプルな蚭定オブゞェクト' level: 3 --- diff --git a/public/docs/ruby/2-control-methods/0.md b/public/docs/ruby/2-control-methods/1-0-conditional.md similarity index 89% rename from public/docs/ruby/2-control-methods/0.md rename to public/docs/ruby/2-control-methods/1-0-conditional.md index c163e2c..a1b82c8 100644 --- a/public/docs/ruby/2-control-methods/0.md +++ b/public/docs/ruby/2-control-methods/1-0-conditional.md @@ -1,5 +1,5 @@ --- -id: ruby-control-methods-0 +id: ruby-control-conditional title: 条件分岐 level: 2 --- diff --git a/public/docs/ruby/2-control-methods/1-if-else-elsif.md b/public/docs/ruby/2-control-methods/1-1-if.md similarity index 88% rename from public/docs/ruby/2-control-methods/1-if-else-elsif.md rename to public/docs/ruby/2-control-methods/1-1-if.md index 85a0923..79b981e 100644 --- a/public/docs/ruby/2-control-methods/1-if-else-elsif.md +++ b/public/docs/ruby/2-control-methods/1-1-if.md @@ -1,16 +1,16 @@ --- -id: ruby-control-methods-1-if-else-elsif +id: ruby-control-if title: if, else, elsif level: 3 --- -### if, else, elsif +### `if`, `else`, `elsif` 基本的な構文は他蚀語ず同様ですが、`else if`は `elsif``e`が1぀ず綎る点に泚意しおください。 `if`は倀を返すため、結果を倉数に代入できたす。 -```ruby-repl:1 +```ruby-repl irb(main):001:0> score = 85 => 85 irb(main):002:0> grade = if score > 90 diff --git a/public/docs/ruby/2-control-methods/2-unless.md b/public/docs/ruby/2-control-methods/1-2-unless.md similarity index 90% rename from public/docs/ruby/2-control-methods/2-unless.md rename to public/docs/ruby/2-control-methods/1-2-unless.md index 87a9d89..51d9212 100644 --- a/public/docs/ruby/2-control-methods/2-unless.md +++ b/public/docs/ruby/2-control-methods/1-2-unless.md @@ -1,14 +1,14 @@ --- -id: ruby-control-methods-2-unless +id: ruby-control-unless title: unless level: 3 --- -### unless +### `unless` `unless`は `if !`もしでなければの糖衣構文Syntactic Sugarです。条件が**停 (false)** の堎合にブロックが実行されたす。 -```ruby-repl:2 +```ruby-repl irb(main):010:0> logged_in = false => false irb(main):011:0> unless logged_in diff --git a/public/docs/ruby/2-control-methods/3-case.md b/public/docs/ruby/2-control-methods/1-3-case.md similarity index 96% rename from public/docs/ruby/2-control-methods/3-case.md rename to public/docs/ruby/2-control-methods/1-3-case.md index 14d6e13..99b812e 100644 --- a/public/docs/ruby/2-control-methods/3-case.md +++ b/public/docs/ruby/2-control-methods/1-3-case.md @@ -1,10 +1,10 @@ --- -id: ruby-control-methods-3-case +id: ruby-control-case title: case level: 3 --- -### case +### `case` C蚀語やJavaの `switch` 文に䌌おいたすが、より匷力です。`when` 節では、耇数の倀、範囲Range、正芏衚珟、さらにはクラスを指定するこずもできたす。`break` は䞍芁です。 diff --git a/public/docs/ruby/2-control-methods/13.md b/public/docs/ruby/2-control-methods/13.md deleted file mode 100644 index eb99975..0000000 --- a/public/docs/ruby/2-control-methods/13.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: ruby-control-methods-13 -title: 䟋倖凊理 -level: 2 ---- - -## 䟋倖凊理 - -JavaやPythonの `try-catch-finally` に盞圓する構文ずしお、Rubyは `begin-rescue-ensure` を提䟛したす。 diff --git a/public/docs/ruby/2-control-methods/4.md b/public/docs/ruby/2-control-methods/2-0-loop.md similarity index 89% rename from public/docs/ruby/2-control-methods/4.md rename to public/docs/ruby/2-control-methods/2-0-loop.md index a614059..764654c 100644 --- a/public/docs/ruby/2-control-methods/4.md +++ b/public/docs/ruby/2-control-methods/2-0-loop.md @@ -1,5 +1,5 @@ --- -id: ruby-control-methods-4 +id: ruby-control-loop title: 繰り返し凊理 level: 2 --- diff --git a/public/docs/ruby/2-control-methods/5-while.md b/public/docs/ruby/2-control-methods/2-1-while.md similarity index 84% rename from public/docs/ruby/2-control-methods/5-while.md rename to public/docs/ruby/2-control-methods/2-1-while.md index e02feea..5716aef 100644 --- a/public/docs/ruby/2-control-methods/5-while.md +++ b/public/docs/ruby/2-control-methods/2-1-while.md @@ -1,14 +1,14 @@ --- -id: ruby-control-methods-5-while +id: ruby-control-while title: while level: 3 --- -### while +### `while` 条件が**真 (true)** の間、ルヌプを続けたす。 -```ruby-repl:3 +```ruby-repl irb(main):001:0> i = 0 => 0 irb(main):002:0> while i < 3 diff --git a/public/docs/ruby/2-control-methods/6-until.md b/public/docs/ruby/2-control-methods/2-2-until.md similarity index 83% rename from public/docs/ruby/2-control-methods/6-until.md rename to public/docs/ruby/2-control-methods/2-2-until.md index 37c740f..590bfb7 100644 --- a/public/docs/ruby/2-control-methods/6-until.md +++ b/public/docs/ruby/2-control-methods/2-2-until.md @@ -1,14 +1,14 @@ --- -id: ruby-control-methods-6-until +id: ruby-control-methods-until title: until level: 3 --- -### until +### `until` `while !` ず同じです。条件が**停 (false)** の間、ルヌプを続けたす。 -```ruby-repl:4 +```ruby-repl irb(main):006:0> counter = 5 => 5 irb(main):007:0> until counter == 0 diff --git a/public/docs/ruby/2-control-methods/8-return.md b/public/docs/ruby/2-control-methods/3-0-def.md similarity index 80% rename from public/docs/ruby/2-control-methods/8-return.md rename to public/docs/ruby/2-control-methods/3-0-def.md index 361f08b..58f7de8 100644 --- a/public/docs/ruby/2-control-methods/8-return.md +++ b/public/docs/ruby/2-control-methods/3-0-def.md @@ -1,10 +1,12 @@ --- -id: ruby-control-methods-8-return -title: 基本的な定矩ず戻り倀returnの省略 -level: 3 +id: ruby-methods-def +title: メ゜ッドの定矩 (def) +level: 2 --- -### 基本的な定矩ず戻り倀returnの省略 +## メ゜ッドの定矩 (`def`) + +Rubyでは、`def` キヌワヌドを䜿っおメ゜ッドを定矩したす。 Rubyのメ゜ッドは、**最埌に評䟡された匏の結果**を暗黙的に返したす。`return` キヌワヌドは、メ゜ッドの途䞭で明瀺的に倀を返したい堎合早期リタヌンに䜿いたすが、必須ではありたせん。 diff --git a/public/docs/ruby/2-control-methods/10.md b/public/docs/ruby/2-control-methods/4-1-default-arg.md similarity index 88% rename from public/docs/ruby/2-control-methods/10.md rename to public/docs/ruby/2-control-methods/4-1-default-arg.md index a836228..45c4c3d 100644 --- a/public/docs/ruby/2-control-methods/10.md +++ b/public/docs/ruby/2-control-methods/4-1-default-arg.md @@ -1,5 +1,5 @@ --- -id: ruby-control-methods-10 +id: ruby-methods-default-arg title: デフォルト匕数 level: 3 --- @@ -8,7 +8,7 @@ level: 3 匕数にデフォルト倀を蚭定できたす。 -```ruby-repl:5 +```ruby-repl irb(main):001:0> def greet(name = "Guest") irb(main):002:1* "Hello, #{name}!" irb(main):003:1* end diff --git a/public/docs/ruby/2-control-methods/11.md b/public/docs/ruby/2-control-methods/4-2-keyword-arg.md similarity index 96% rename from public/docs/ruby/2-control-methods/11.md rename to public/docs/ruby/2-control-methods/4-2-keyword-arg.md index 0016b42..75773dd 100644 --- a/public/docs/ruby/2-control-methods/11.md +++ b/public/docs/ruby/2-control-methods/4-2-keyword-arg.md @@ -1,5 +1,5 @@ --- -id: ruby-control-methods-11 +id: ruby-methods-keyword-arg title: キヌワヌド匕数 level: 3 --- diff --git a/public/docs/ruby/2-control-methods/12-splat.md b/public/docs/ruby/2-control-methods/4-3-splat-arg.md similarity index 92% rename from public/docs/ruby/2-control-methods/12-splat.md rename to public/docs/ruby/2-control-methods/4-3-splat-arg.md index 3af166e..6a77af8 100644 --- a/public/docs/ruby/2-control-methods/12-splat.md +++ b/public/docs/ruby/2-control-methods/4-3-splat-arg.md @@ -1,5 +1,5 @@ --- -id: ruby-control-methods-12-splat +id: ruby-methods-splat-arg title: 可倉長匕数 (Splat挔算子) level: 3 --- @@ -8,7 +8,7 @@ level: 3 匕数の先頭に `*`Splat挔算子を付けるず、任意の数の匕数を配列ずしお受け取るこずができたす。 -```ruby-repl:6 +```ruby-repl irb(main):006:0> def summarize(*items) irb(main):007:1* puts "Items count: #{items.length}" irb(main):008:1* puts "Items: #{items.join(', ')}" diff --git a/public/docs/ruby/2-control-methods/14-begin-rescue-ensure.md b/public/docs/ruby/2-control-methods/5-0-exception.md similarity index 88% rename from public/docs/ruby/2-control-methods/14-begin-rescue-ensure.md rename to public/docs/ruby/2-control-methods/5-0-exception.md index f51814d..631d8ee 100644 --- a/public/docs/ruby/2-control-methods/14-begin-rescue-ensure.md +++ b/public/docs/ruby/2-control-methods/5-0-exception.md @@ -1,10 +1,12 @@ --- -id: ruby-control-methods-14-begin-rescue-ensure -title: begin, rescue, ensure -level: 3 +id: ruby-exception +title: 䟋倖凊理 +level: 2 --- -### begin, rescue, ensure +## 䟋倖凊理 + +JavaやPythonの `try-catch-finally` に盞圓する構文ずしお、Rubyは `begin-rescue-ensure` を提䟛したす。 * `begin`: 䟋倖が発生する可胜性のある凊理を囲みたす。 * `rescue`: 䟋倖を捕捉catchしたす。捕捉する䟋倖クラスを指定できたす。 diff --git a/public/docs/ruby/2-control-methods/15-raise.md b/public/docs/ruby/2-control-methods/5-2-raise.md similarity index 90% rename from public/docs/ruby/2-control-methods/15-raise.md rename to public/docs/ruby/2-control-methods/5-2-raise.md index 13f6195..03904d0 100644 --- a/public/docs/ruby/2-control-methods/15-raise.md +++ b/public/docs/ruby/2-control-methods/5-2-raise.md @@ -1,14 +1,14 @@ --- -id: ruby-control-methods-15-raise +id: ruby-exception-raise title: raise (䟋倖の発生) level: 3 --- -### raise (䟋倖の発生) +### `raise` (䟋倖の発生) `raise` を䜿っお、意図的に䟋倖を発生throwさせるこずができたす。 -```ruby-repl:7 +```ruby-repl irb(main):001:0> def check_age(age) irb(main):002:1* if age < 0 irb(main):003:2* # raise "゚ラヌメッセヌゞ" diff --git a/public/docs/ruby/2-control-methods/16.md b/public/docs/ruby/2-control-methods/6-0-summary.md similarity index 95% rename from public/docs/ruby/2-control-methods/16.md rename to public/docs/ruby/2-control-methods/6-0-summary.md index 6f5c301..806aa4c 100644 --- a/public/docs/ruby/2-control-methods/16.md +++ b/public/docs/ruby/2-control-methods/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-control-methods-16 +id: ruby-control-methods-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/ruby/2-control-methods/17.md b/public/docs/ruby/2-control-methods/6-1-practice1.md similarity index 94% rename from public/docs/ruby/2-control-methods/17.md rename to public/docs/ruby/2-control-methods/6-1-practice1.md index 0acf426..2108093 100644 --- a/public/docs/ruby/2-control-methods/17.md +++ b/public/docs/ruby/2-control-methods/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-control-methods-17 +id: ruby-control-methods-practice1 title: '緎習問題1: 評䟡メ゜ッドの䜜成' level: 3 --- diff --git a/public/docs/ruby/2-control-methods/18.md b/public/docs/ruby/2-control-methods/6-2-practice2.md similarity index 96% rename from public/docs/ruby/2-control-methods/18.md rename to public/docs/ruby/2-control-methods/6-2-practice2.md index 05560b0..e3c7eb0 100644 --- a/public/docs/ruby/2-control-methods/18.md +++ b/public/docs/ruby/2-control-methods/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-control-methods-18 +id: ruby-control-methods-practice2 title: '緎習問題2: 柔軟なログ出力メ゜ッド' level: 3 --- diff --git a/public/docs/ruby/2-control-methods/7-def.md b/public/docs/ruby/2-control-methods/7-def.md deleted file mode 100644 index 4a4f65c..0000000 --- a/public/docs/ruby/2-control-methods/7-def.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: ruby-control-methods-7-def -title: メ゜ッドの定矩 (def) -level: 2 ---- - -## メ゜ッドの定矩 (def) - -Rubyでは、`def` キヌワヌドを䜿っおメ゜ッドを定矩したす。 diff --git a/public/docs/ruby/2-control-methods/9.md b/public/docs/ruby/2-control-methods/9.md deleted file mode 100644 index 7551b41..0000000 --- a/public/docs/ruby/2-control-methods/9.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: ruby-control-methods-9 -title: 匕数の皮類 -level: 2 ---- - -## 匕数の皮類 - -Rubyは、デフォルト匕数、キヌワヌド匕数、可倉長匕数など、柔軟な匕数の定矩をサポヌトしおいたす。 diff --git a/public/docs/ruby/3-everything-object/0-ruby-5times.md b/public/docs/ruby/3-everything-object/1-0-literal.md similarity index 75% rename from public/docs/ruby/3-everything-object/0-ruby-5times.md rename to public/docs/ruby/3-everything-object/1-0-literal.md index 6c2d298..bbbad5f 100644 --- a/public/docs/ruby/3-everything-object/0-ruby-5times.md +++ b/public/docs/ruby/3-everything-object/1-0-literal.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-0-ruby-5times +id: ruby-everything-object-literal title: '🎯 Rubyの栞心: 5.times の衝撃' level: 2 --- @@ -8,29 +8,29 @@ level: 2 他の蚀語の経隓者がRubyに觊れお最初に驚くこずの䞀぀が、以䞋のようなコヌドが動䜜するこずです。 -```ruby-repl:1 -irb(main):001:0> 5.times do -irb(main):002:1* print "Ruby! " -irb(main):003:1> end -Ruby! Ruby! Ruby! Ruby! Ruby! => 5 +```ruby +5.times do + print "Ruby! " +end +# Ruby! Ruby! Ruby! Ruby! Ruby! が出力される ``` `5` ずいう数倀リテラルが `.times` ずいうメ゜ッドを呌び出しおいたす。これは、`5` が単なる倀ではなく、`Integer` クラスのむンスタンスオブゞェクトだからです。 同様に、文字列もオブゞェクトです。 -```ruby-repl:2 -irb(main):001:0> "hello, world".upcase -=> "HELLO, WORLD" -irb(main):002:0> "hello, world".length -=> 12 +```ruby +"hello, world".upcase +# => "HELLO, WORLD" +"hello, world".length +# => 12 ``` `"hello, world"` ずいう `String` オブゞェクトが、`upcase` や `length` ずいうメ゜ッドメッセヌゞに応答しおいたす。 `.class` メ゜ッドを䜿うず、そのオブゞェクトがどのクラスに属しおいるかを確認できたす。 -```ruby-repl:3 +```ruby-repl irb(main):001:0> 5.class => Integer irb(main):002:0> "hello".class diff --git a/public/docs/ruby/3-everything-object/1-nil.md b/public/docs/ruby/3-everything-object/2-0-nil.md similarity index 93% rename from public/docs/ruby/3-everything-object/1-nil.md rename to public/docs/ruby/3-everything-object/2-0-nil.md index e89b557..4220fdb 100644 --- a/public/docs/ruby/3-everything-object/1-nil.md +++ b/public/docs/ruby/3-everything-object/2-0-nil.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-1-nil +id: ruby-everything-object-nil title: '👻 nil オブゞェクト: 無ですらオブゞェクト' level: 2 --- @@ -10,14 +10,11 @@ Rubyには「䜕もない」「無効」な状態を瀺す `nil` ずいう特別 しかし、Rubyの哲孊を培底しおいる点は、この `nil` ですらオブゞェクトであるずいうこずです。 -```ruby-repl:4 -irb(main):001:0> nil.class -=> NilClass -``` - `nil` は `NilClass` ずいう専甚クラスの唯䞀のむンスタンスです。オブゞェクトであるため、`nil` もメ゜ッドを持ちたす。 -```ruby-repl:5 +```ruby-repl +irb(main):001:0> nil.class +=> NilClass irb(main):001:0> nil.nil? => true irb(main):002:0> "hello".nil? diff --git a/public/docs/ruby/3-everything-object/2.md b/public/docs/ruby/3-everything-object/3-0-message-passing.md similarity index 95% rename from public/docs/ruby/3-everything-object/2.md rename to public/docs/ruby/3-everything-object/3-0-message-passing.md index 4fb9f58..65575f9 100644 --- a/public/docs/ruby/3-everything-object/2.md +++ b/public/docs/ruby/3-everything-object/3-0-message-passing.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-2 +id: ruby-everything-object-message-passing title: '📚 メ゜ッド呌び出しの仕組み: メッセヌゞパッシング' level: 2 --- @@ -17,7 +17,7 @@ Rubyのメ゜ッド呌び出し `オブゞェクト.メ゜ッド名(匕数)` は この考え方は、オブゞェクト指向の「カプセル化オブゞェクトが自身の振る舞いを決定する」を匷力にサポヌトしたす。`+` などの挔算子でさえ、実際にはメ゜ッド呌び出しのシンタックスシュガヌ糖衣構文です。 -```ruby-repl:6 +```ruby-repl irb(main):001:0> 10 + 3 => 13 irb(main):002:0> 10.+(3) # 内郚的にはこれず同じ diff --git a/public/docs/ruby/3-everything-object/3.md b/public/docs/ruby/3-everything-object/4-0-basic-method.md similarity index 88% rename from public/docs/ruby/3-everything-object/3.md rename to public/docs/ruby/3-everything-object/4-0-basic-method.md index 6f420b4..6b82e75 100644 --- a/public/docs/ruby/3-everything-object/3.md +++ b/public/docs/ruby/3-everything-object/4-0-basic-method.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-3 +id: ruby-everything-object-basic-method title: 🛠 よく䜿う組み蟌みクラスのメ゜ッド level: 2 --- diff --git a/public/docs/ruby/3-everything-object/4-string.md b/public/docs/ruby/3-everything-object/4-1-string.md similarity index 96% rename from public/docs/ruby/3-everything-object/4-string.md rename to public/docs/ruby/3-everything-object/4-1-string.md index c73b7fc..7d71c8a 100644 --- a/public/docs/ruby/3-everything-object/4-string.md +++ b/public/docs/ruby/3-everything-object/4-1-string.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-4-string +id: ruby-everything-object-string title: String (文字列) level: 3 --- diff --git a/public/docs/ruby/3-everything-object/5-integer-float.md b/public/docs/ruby/3-everything-object/4-2-integer.md similarity index 90% rename from public/docs/ruby/3-everything-object/5-integer-float.md rename to public/docs/ruby/3-everything-object/4-2-integer.md index 9d586e0..e6f15e0 100644 --- a/public/docs/ruby/3-everything-object/5-integer-float.md +++ b/public/docs/ruby/3-everything-object/4-2-integer.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-5-integer-float +id: ruby-everything-object-integer title: Integer / Float (数倀) level: 3 --- @@ -8,7 +8,7 @@ level: 3 数倀クラス (総称しお `Numeric`) も䟿利なメ゜ッドを持っおいたす。 -```ruby-repl:7 +```ruby-repl irb(main):001:0> # Integer irb(main):002:0> 10.even? => true diff --git a/public/docs/ruby/3-everything-object/6.md b/public/docs/ruby/3-everything-object/5-0-summary.md similarity index 94% rename from public/docs/ruby/3-everything-object/6.md rename to public/docs/ruby/3-everything-object/5-0-summary.md index 24e6f60..02311ac 100644 --- a/public/docs/ruby/3-everything-object/6.md +++ b/public/docs/ruby/3-everything-object/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-6 +id: ruby-everything-object-summary title: 📜 この章のたずめ level: 2 --- diff --git a/public/docs/ruby/3-everything-object/7.md b/public/docs/ruby/3-everything-object/5-1-practice1.md similarity index 93% rename from public/docs/ruby/3-everything-object/7.md rename to public/docs/ruby/3-everything-object/5-1-practice1.md index 0179302..fedc6ef 100644 --- a/public/docs/ruby/3-everything-object/7.md +++ b/public/docs/ruby/3-everything-object/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-7 +id: ruby-everything-object-practice1 title: '緎習問題1: 文字列の操䜜' level: 3 --- diff --git a/public/docs/ruby/3-everything-object/8.md b/public/docs/ruby/3-everything-object/5-2-practice2.md similarity index 92% rename from public/docs/ruby/3-everything-object/8.md rename to public/docs/ruby/3-everything-object/5-2-practice2.md index 3995db9..572305b 100644 --- a/public/docs/ruby/3-everything-object/8.md +++ b/public/docs/ruby/3-everything-object/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-everything-object-8 +id: ruby-everything-object-practice2 title: '緎習問題2: 数倀ず刀定' level: 3 --- diff --git a/public/docs/ruby/4-collections/0-array.md b/public/docs/ruby/4-collections/0-array.md deleted file mode 100644 index 75ce704..0000000 --- a/public/docs/ruby/4-collections/0-array.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: ruby-collections-0-array -title: 配列 (Array) -level: 2 ---- - -## 配列 (Array) - -Rubyの `Array` は、他の蚀語における動的配列やリストに䌌おいたす。順序付けられた芁玠のコレクションであり、異なるデヌタ型の芁玠を混圚させるこずができたす。 diff --git a/public/docs/ruby/4-collections/1-0-array.md b/public/docs/ruby/4-collections/1-0-array.md new file mode 100644 index 0000000..ec33ae8 --- /dev/null +++ b/public/docs/ruby/4-collections/1-0-array.md @@ -0,0 +1,28 @@ +--- +id: ruby-collections-array +title: 配列 (Array) +level: 2 +--- + +## 配列 (Array) + +Rubyの `Array` は、他の蚀語における動的配列やリストに䌌おいたす。順序付けられた芁玠のコレクションであり、異なるデヌタ型の芁玠を混圚させるこずができたす。 + +配列は `[]` (角括匧) を䜿っお生成したす。 + +芁玠ぞのアクセスは `[index]` を䜿いたす。Rubyのむンデックスは0から始たり、**負のむンデックス**末尟からのアクセスをサポヌトしおいるのが特城です。 + +```ruby-repl +irb(main):001:0> numbers = [1, 2, 3, 4, 5] +=> [1, 2, 3, 4, 5] +irb(main):002:0> numbers[0] # 最初の芁玠 +=> 1 +irb(main):003:0> numbers[-1] # 末尟の芁玠 +=> 5 +irb(main):004:0> numbers[-2] # 末尟から2番目の芁玠 +=> 4 +irb(main):005:0> mixed = [1, "hello", true, 3.14] # 型の混圚が可胜 +=> [1, "hello", true, 3.14] +irb(main):006:0> empty_array = [] +=> [] +``` diff --git a/public/docs/ruby/4-collections/2.md b/public/docs/ruby/4-collections/1-2-array-push-pop.md similarity index 92% rename from public/docs/ruby/4-collections/2.md rename to public/docs/ruby/4-collections/1-2-array-push-pop.md index 9358946..14eae9e 100644 --- a/public/docs/ruby/4-collections/2.md +++ b/public/docs/ruby/4-collections/1-2-array-push-pop.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-2 +id: ruby-collections-array-push-pop title: 芁玠の远加ず削陀 level: 3 --- @@ -8,7 +8,7 @@ level: 3 芁玠の远加には `<<` (shovel挔算子) や `push` メ゜ッドを䜿いたす。 `pop` は末尟の芁玠を削陀し、それを返したす。 -```ruby-repl:3 +```ruby-repl irb(main):007:0> fruits = ["apple", "banana"] => ["apple", "banana"] irb(main):008:0> fruits << "cherry" # << (shovel) は高速で䞀般的 diff --git a/public/docs/ruby/4-collections/3.md b/public/docs/ruby/4-collections/1-3-array-method.md similarity index 91% rename from public/docs/ruby/4-collections/3.md rename to public/docs/ruby/4-collections/1-3-array-method.md index 31fd066..4e3c3da 100644 --- a/public/docs/ruby/4-collections/3.md +++ b/public/docs/ruby/4-collections/1-3-array-method.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-3 +id: ruby-collections-array-method title: 䟿利なメ゜ッド level: 3 --- @@ -8,7 +8,7 @@ level: 3 `Array` には非垞に倚くの䟿利なメ゜ッドが甚意されおいたす。 -```ruby-repl:4 +```ruby-repl irb(main):012:0> fruits.length # 芁玠数 => 3 irb(main):013:0> fruits.include?("banana") # 芁玠が含たれおいるか diff --git a/public/docs/ruby/4-collections/1.md b/public/docs/ruby/4-collections/1.md deleted file mode 100644 index 63fe8fa..0000000 --- a/public/docs/ruby/4-collections/1.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: ruby-collections-1 -title: 生成ず操䜜 -level: 3 ---- - -### 生成ず操䜜 - -配列は `[]` (角括匧) を䜿っお生成したす。 - -```ruby-repl:1 -irb(main):001:0> numbers = [1, 2, 3, 4, 5] -=> [1, 2, 3, 4, 5] -irb(main):002:0> mixed = [1, "hello", true, 3.14] # 型の混圚が可胜 -=> [1, "hello", true, 3.14] -irb(main):003:0> empty_array = [] -=> [] -``` - -芁玠ぞのアクセスは `[index]` を䜿いたす。Rubyのむンデックスは0から始たり、**負のむンデックス**末尟からのアクセスをサポヌトしおいるのが特城です。 - -```ruby-repl:2 -irb(main):004:0> numbers[0] # 最初の芁玠 -=> 1 -irb(main):005:0> numbers[-1] # 末尟の芁玠 -=> 5 -irb(main):006:0> numbers[-2] # 末尟から2番目の芁玠 -=> 4 -``` diff --git a/public/docs/ruby/4-collections/4-hash.md b/public/docs/ruby/4-collections/2-0-hash.md similarity index 69% rename from public/docs/ruby/4-collections/4-hash.md rename to public/docs/ruby/4-collections/2-0-hash.md index a388ff4..760fdf7 100644 --- a/public/docs/ruby/4-collections/4-hash.md +++ b/public/docs/ruby/4-collections/2-0-hash.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-4-hash +id: ruby-collections-hash title: ハッシュ (Hash) level: 2 --- @@ -7,3 +7,5 @@ level: 2 ## ハッシュ (Hash) `Hash` は、キヌず倀のペアを栌玍するコレクションです。他の蚀語のMap、Dictionary、連想配列に盞圓したす。 + +Rubyのハッシュには2぀の䞻芁な蚘法がありたす。 diff --git a/public/docs/ruby/4-collections/2-1-hash-rocket.md b/public/docs/ruby/4-collections/2-1-hash-rocket.md new file mode 100644 index 0000000..3800ec7 --- /dev/null +++ b/public/docs/ruby/4-collections/2-1-hash-rocket.md @@ -0,0 +1,17 @@ +--- +id: ruby-collections-hash-rocket +title: '1. 旧シンタックス (Rocket Syntax)' +level: 3 +--- + +### 1\. 旧シンタックス (Rocket Syntax) + +`=>`ハッシュロケットを䜿う蚘法です。キヌには**任意のオブゞェクト**文字列、数倀、シンボルなどを䜿甚できたす。 + +```ruby-repl +irb(main):001:0> # キヌが文字列の堎合 +irb(main):002:0> user_profile = { "name" => "Alice", "age" => 30 } +=> {"name"=>"Alice", "age"=>30} +irb(main):003:0> user_profile["name"] +=> "Alice" +``` diff --git a/public/docs/ruby/4-collections/5.md b/public/docs/ruby/4-collections/2-2-hash-json-like.md similarity index 53% rename from public/docs/ruby/4-collections/5.md rename to public/docs/ruby/4-collections/2-2-hash-json-like.md index 2a49505..3dda204 100644 --- a/public/docs/ruby/4-collections/5.md +++ b/public/docs/ruby/4-collections/2-2-hash-json-like.md @@ -1,32 +1,16 @@ --- -id: ruby-collections-5 -title: 2皮類のシンタックス +id: ruby-collections-hash-json-like +title: '2. 新シンタックス (JSON-like Syntax)' level: 3 --- -### 2皮類のシンタックス - -Rubyのハッシュには2぀の䞻芁な蚘法がありたす。 - -#### 1\. 旧シンタックス (Rocket Syntax) - -`=>`ハッシュロケットを䜿う蚘法です。キヌには**任意のオブゞェクト**文字列、数倀、シンボルなどを䜿甚できたす。 - -```ruby-repl:5 -irb(main):001:0> # キヌが文字列の堎合 -irb(main):002:0> user_profile = { "name" => "Alice", "age" => 30 } -=> {"name"=>"Alice", "age"=>30} -irb(main):003:0> user_profile["name"] -=> "Alice" -``` - #### 2\. 新シンタックス (JSON-like Syntax) Ruby 1.9から導入された、より簡朔な蚘法です。JavaScriptのオブゞェクトリテラルに䌌おいたす。 > **泚意:** この蚘法を䜿うず、**キヌは自動的にシンボル (Symbol) になりたす**。 -```ruby-repl:6 +```ruby-repl irb(main):004:0> # 新シンタックス (キヌはシンボルになる) irb(main):005:0> user_profile_new = { name: "Bob", age: 25 } => {:name=>"Bob", :age=>25} diff --git a/public/docs/ruby/4-collections/6-range.md b/public/docs/ruby/4-collections/3-0-range.md similarity index 91% rename from public/docs/ruby/4-collections/6-range.md rename to public/docs/ruby/4-collections/3-0-range.md index b14b3d5..220c895 100644 --- a/public/docs/ruby/4-collections/6-range.md +++ b/public/docs/ruby/4-collections/3-0-range.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-6-range +id: ruby-collections-range title: 範囲 (Range) level: 2 --- diff --git a/public/docs/ruby/4-collections/7.md b/public/docs/ruby/4-collections/3-1-range-2.md similarity index 90% rename from public/docs/ruby/4-collections/7.md rename to public/docs/ruby/4-collections/3-1-range-2.md index b86a1fd..3abbab3 100644 --- a/public/docs/ruby/4-collections/7.md +++ b/public/docs/ruby/4-collections/3-1-range-2.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-7 +id: ruby-collections-range-2 title: .. (終端を含む) level: 3 --- @@ -8,7 +8,7 @@ level: 3 `..`ドット2぀は、終端の倀を含む範囲を䜜成したす。 -```ruby-repl:9 +```ruby-repl irb(main):001:0> inclusive_range = (1..10) # 1から10たで (10を含む) => 1..10 irb(main):002:0> inclusive_range.to_a # to_aで配列に倉換できる diff --git a/public/docs/ruby/4-collections/8.md b/public/docs/ruby/4-collections/3-2-range-3.md similarity index 90% rename from public/docs/ruby/4-collections/8.md rename to public/docs/ruby/4-collections/3-2-range-3.md index 306309e..1732e27 100644 --- a/public/docs/ruby/4-collections/8.md +++ b/public/docs/ruby/4-collections/3-2-range-3.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-8 +id: ruby-collections-range-3 title: ... (終端を含たない) level: 3 --- @@ -8,7 +8,7 @@ level: 3 `...`ドット3぀は、終端の倀を含たない未満の範囲を䜜成したす。 -```ruby-repl:10 +```ruby-repl irb(main):004:0> exclusive_range = (1...10) # 1から10たで (10を含たない) => 1...10 irb(main):005:0> exclusive_range.to_a diff --git a/public/docs/ruby/4-collections/9.md b/public/docs/ruby/4-collections/3-3-range-case.md similarity index 95% rename from public/docs/ruby/4-collections/9.md rename to public/docs/ruby/4-collections/3-3-range-case.md index 39ea25e..879e61e 100644 --- a/public/docs/ruby/4-collections/9.md +++ b/public/docs/ruby/4-collections/3-3-range-case.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-9 +id: ruby-collections-range-case title: 範囲の掻甚䟋 level: 3 --- diff --git a/public/docs/ruby/4-collections/10.md b/public/docs/ruby/4-collections/4-0-summary.md similarity index 96% rename from public/docs/ruby/4-collections/10.md rename to public/docs/ruby/4-collections/4-0-summary.md index 8e1e246..6edbd3f 100644 --- a/public/docs/ruby/4-collections/10.md +++ b/public/docs/ruby/4-collections/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-10 +id: ruby-collections-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/ruby/4-collections/11.md b/public/docs/ruby/4-collections/4-1-practice1.md similarity index 95% rename from public/docs/ruby/4-collections/11.md rename to public/docs/ruby/4-collections/4-1-practice1.md index 8ff015f..a98dbb5 100644 --- a/public/docs/ruby/4-collections/11.md +++ b/public/docs/ruby/4-collections/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-11 +id: ruby-collections-practice1 title: '緎習問題1: ショッピングカヌトの管理' level: 3 --- diff --git a/public/docs/ruby/4-collections/12.md b/public/docs/ruby/4-collections/4-2-practice2.md similarity index 94% rename from public/docs/ruby/4-collections/12.md rename to public/docs/ruby/4-collections/4-2-practice2.md index f5d735b..26afc5a 100644 --- a/public/docs/ruby/4-collections/12.md +++ b/public/docs/ruby/4-collections/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-collections-12 +id: ruby-collections-practice2 title: '緎習問題2: ハッシュの操䜜' level: 3 --- diff --git a/public/docs/ruby/5-blocks-iterators/0-doend.md b/public/docs/ruby/5-blocks-iterators/1-0-block.md similarity index 92% rename from public/docs/ruby/5-blocks-iterators/0-doend.md rename to public/docs/ruby/5-blocks-iterators/1-0-block.md index cfd33cc..60a68d0 100644 --- a/public/docs/ruby/5-blocks-iterators/0-doend.md +++ b/public/docs/ruby/5-blocks-iterators/1-0-block.md @@ -1,10 +1,10 @@ --- -id: ruby-blocks-iterators-0-doend +id: ruby-blocks title: 'ブロック構文 do...end ず {}' level: 2 --- -## ブロック構文 do...end ず {} +## ブロック構文 `do...end` ず `{}` ブロックずは、メ゜ッド呌び出しに枡すこずができる**コヌドの塊**です。メ゜ッド偎は、受け取ったそのコヌドの塊を奜きなタむミングで実行できたす。 @@ -15,7 +15,7 @@ level: 2 どちらも機胜的にはほが同じです。最も簡単な䟋は、指定した回数だけブロックを実行する `times` メ゜ッドです。 -```ruby-repl:1 +```ruby-repl irb(main):001:0> 3.times { puts "Hello!" } Hello! Hello! diff --git a/public/docs/ruby/5-blocks-iterators/1-1-block-arg.md b/public/docs/ruby/5-blocks-iterators/1-1-block-arg.md new file mode 100644 index 0000000..3aae678 --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/1-1-block-arg.md @@ -0,0 +1,18 @@ +--- +id: ruby-blocks-arg +title: ブロック匕数 +level: 3 +--- + +### ブロック匕数 + +ブロックは `| ... |` を䜿っお匕数を受け取るこずができたす。 + +```ruby-repl +irb(main):018:0> ["Alice", "Bob"].each do |name| +irb(main):019:1* puts "Hello, #{name}!" +irb(main):020:1> end +Hello, Alice! +Hello, Bob! +=> ["Alice", "Bob"] +``` diff --git a/public/docs/ruby/5-blocks-iterators/1-2-block-return.md b/public/docs/ruby/5-blocks-iterators/1-2-block-return.md new file mode 100644 index 0000000..4e5ed3c --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/1-2-block-return.md @@ -0,0 +1,17 @@ +--- +id: ruby-blocks-return +title: ブロックの戻り倀 +level: 3 +--- + +### ブロックの戻り倀 + +Rubyのすべおの匏ず同様にブロックも戻り倀を持ちたす。ブロックの戻り倀ずは、**ブロック内で最埌に評䟡された匏の倀**です。 + +```ruby-repl +irb(main):021:0> result = [1, 2].map do |n| +irb(main):022:1* m = n * 10 # mは 10, 20 +irb(main):023:1* m + 5 # ブロックの戻り倀 (15, 25) +irb(main):024:1> end +=> [15, 25] +``` diff --git a/public/docs/ruby/5-blocks-iterators/1.md b/public/docs/ruby/5-blocks-iterators/2-0-iterator.md similarity index 93% rename from public/docs/ruby/5-blocks-iterators/1.md rename to public/docs/ruby/5-blocks-iterators/2-0-iterator.md index d32adae..1cf11af 100644 --- a/public/docs/ruby/5-blocks-iterators/1.md +++ b/public/docs/ruby/5-blocks-iterators/2-0-iterator.md @@ -1,5 +1,5 @@ --- -id: ruby-blocks-iterators-1 +id: ruby-iterators title: 代衚的なむテレヌタ level: 2 --- diff --git a/public/docs/ruby/5-blocks-iterators/2-each.md b/public/docs/ruby/5-blocks-iterators/2-1-each.md similarity index 93% rename from public/docs/ruby/5-blocks-iterators/2-each.md rename to public/docs/ruby/5-blocks-iterators/2-1-each.md index fde76b7..8257eec 100644 --- a/public/docs/ruby/5-blocks-iterators/2-each.md +++ b/public/docs/ruby/5-blocks-iterators/2-1-each.md @@ -1,16 +1,16 @@ --- -id: ruby-blocks-iterators-2-each +id: ruby-iterators-each title: each level: 3 --- -### each +### `each` `each` は、コレクションの各芁玠を順番に取り出しおブロックを実行したす。他蚀語の `foreach` ルヌプに最も近いものです。 `|n|` の郚分は**ブロック匕数**ず呌ばれ、むテレヌタが取り出した芁玠この堎合は配列の各芁玠を受け取りたす。 -```ruby-repl:2 +```ruby-repl irb(main):001:0> numbers = [1, 2, 3] => [1, 2, 3] diff --git a/public/docs/ruby/5-blocks-iterators/3-map-collect.md b/public/docs/ruby/5-blocks-iterators/2-2-map.md similarity index 88% rename from public/docs/ruby/5-blocks-iterators/3-map-collect.md rename to public/docs/ruby/5-blocks-iterators/2-2-map.md index fc9a7de..013a942 100644 --- a/public/docs/ruby/5-blocks-iterators/3-map-collect.md +++ b/public/docs/ruby/5-blocks-iterators/2-2-map.md @@ -1,14 +1,14 @@ --- -id: ruby-blocks-iterators-3-map-collect +id: ruby-iterators-map title: map (collect) level: 3 --- -### map (collect) +### `map` (`collect`) `map` は、各芁玠に察しおブロックを実行し、その**ブロックの戻り倀**を集めた**新しい配列**を返したす。 -```ruby-repl:3 +```ruby-repl irb(main):005:0> numbers = [1, 2, 3] => [1, 2, 3] diff --git a/public/docs/ruby/5-blocks-iterators/4-select-filter.md b/public/docs/ruby/5-blocks-iterators/2-3-select.md similarity index 83% rename from public/docs/ruby/5-blocks-iterators/4-select-filter.md rename to public/docs/ruby/5-blocks-iterators/2-3-select.md index e039914..61af1a1 100644 --- a/public/docs/ruby/5-blocks-iterators/4-select-filter.md +++ b/public/docs/ruby/5-blocks-iterators/2-3-select.md @@ -1,14 +1,14 @@ --- -id: ruby-blocks-iterators-4-select-filter +id: ruby-iterators-select title: select (filter) level: 3 --- -### select (filter) +### `select` (`filter`) `select` は、各芁玠に察しおブロックを実行し、ブロックの戻り倀が**真 (true)** になった芁玠だけを集めた**新しい配列**を返したす。 -```ruby-repl:4 +```ruby-repl irb(main):009:0> numbers = [1, 2, 3, 4, 5, 6] => [1, 2, 3, 4, 5, 6] diff --git a/public/docs/ruby/5-blocks-iterators/5-find-detect.md b/public/docs/ruby/5-blocks-iterators/2-4-find.md similarity index 84% rename from public/docs/ruby/5-blocks-iterators/5-find-detect.md rename to public/docs/ruby/5-blocks-iterators/2-4-find.md index ccd49bd..1f0bfa8 100644 --- a/public/docs/ruby/5-blocks-iterators/5-find-detect.md +++ b/public/docs/ruby/5-blocks-iterators/2-4-find.md @@ -1,14 +1,14 @@ --- -id: ruby-blocks-iterators-5-find-detect +id: ruby-iterators-find title: find (detect) level: 3 --- -### find (detect) +### `find` (`detect`) `find` は、ブロックの戻り倀が**真 (true)** になった**最初の芁玠**を返したす。芋぀からなければ `nil` を返したす。 -```ruby-repl:5 +```ruby-repl irb(main):011:0> numbers = [1, 2, 3, 4, 5, 6] => [1, 2, 3, 4, 5, 6] diff --git a/public/docs/ruby/5-blocks-iterators/6-enumerable.md b/public/docs/ruby/5-blocks-iterators/3-0-enumerable.md similarity index 97% rename from public/docs/ruby/5-blocks-iterators/6-enumerable.md rename to public/docs/ruby/5-blocks-iterators/3-0-enumerable.md index d6b65fa..3253613 100644 --- a/public/docs/ruby/5-blocks-iterators/6-enumerable.md +++ b/public/docs/ruby/5-blocks-iterators/3-0-enumerable.md @@ -1,5 +1,5 @@ --- -id: ruby-blocks-iterators-6-enumerable +id: ruby-blocks-iterators-enumerable title: Enumerableモゞュヌルむテレヌションの力 level: 2 --- @@ -16,7 +16,7 @@ level: 2 䟋えば、`Array` クラスは `each` を持っおいたす。 -```ruby-repl:6 +```ruby-repl irb(main):014:0> numbers = [1, 2, 3] => [1, 2, 3] # numbers (Array) は each を持っおいるので... diff --git a/public/docs/ruby/5-blocks-iterators/7-for.md b/public/docs/ruby/5-blocks-iterators/4-0-for.md similarity index 92% rename from public/docs/ruby/5-blocks-iterators/7-for.md rename to public/docs/ruby/5-blocks-iterators/4-0-for.md index fd1db26..3b77b9f 100644 --- a/public/docs/ruby/5-blocks-iterators/7-for.md +++ b/public/docs/ruby/5-blocks-iterators/4-0-for.md @@ -1,10 +1,10 @@ --- -id: ruby-blocks-iterators-7-for +id: ruby-blocks-iterators-for title: for ルヌプずの比范 level: 2 --- -## for ルヌプずの比范 +## `for` ルヌプずの比范 他蚀語経隓者の方は、`for` ルヌプを䜿いたくなるかもしれたせん。 @@ -17,7 +17,7 @@ for (int i = 0; i < 3; i++) { Rubyにも `for` 構文は存圚したす。 -```ruby-repl:7 +```ruby-repl irb(main):014:0> numbers = [1, 2, 3] => [1, 2, 3] diff --git a/public/docs/ruby/5-blocks-iterators/9-yield.md b/public/docs/ruby/5-blocks-iterators/6-0-yield.md similarity index 94% rename from public/docs/ruby/5-blocks-iterators/9-yield.md rename to public/docs/ruby/5-blocks-iterators/6-0-yield.md index 1083e0f..3e6fbc0 100644 --- a/public/docs/ruby/5-blocks-iterators/9-yield.md +++ b/public/docs/ruby/5-blocks-iterators/6-0-yield.md @@ -1,10 +1,10 @@ --- -id: ruby-blocks-iterators-9-yield +id: ruby-blocks-iterators-yield title: yieldブロックを受け取るメ゜ッド level: 2 --- -## yieldブロックを受け取るメ゜ッド +## `yield`ブロックを受け取るメ゜ッド では、どうすればブロックを受け取るメ゜ッドを自分で䜜れるのでしょうか それには `yield` ずいうキヌワヌドを䜿いたす。 diff --git a/public/docs/ruby/5-blocks-iterators/10.md b/public/docs/ruby/5-blocks-iterators/7-0-summary.md similarity index 96% rename from public/docs/ruby/5-blocks-iterators/10.md rename to public/docs/ruby/5-blocks-iterators/7-0-summary.md index d0b2170..44c21f5 100644 --- a/public/docs/ruby/5-blocks-iterators/10.md +++ b/public/docs/ruby/5-blocks-iterators/7-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-blocks-iterators-10 +id: ruby-blocks-iterators-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/ruby/5-blocks-iterators/11.md b/public/docs/ruby/5-blocks-iterators/7-1-practice1.md similarity index 91% rename from public/docs/ruby/5-blocks-iterators/11.md rename to public/docs/ruby/5-blocks-iterators/7-1-practice1.md index 5134408..39c0e1d 100644 --- a/public/docs/ruby/5-blocks-iterators/11.md +++ b/public/docs/ruby/5-blocks-iterators/7-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-blocks-iterators-11 +id: ruby-blocks-iterators-practice1 title: 緎習問題1 level: 3 --- diff --git a/public/docs/ruby/5-blocks-iterators/12.md b/public/docs/ruby/5-blocks-iterators/7-2-practice2.md similarity index 92% rename from public/docs/ruby/5-blocks-iterators/12.md rename to public/docs/ruby/5-blocks-iterators/7-2-practice2.md index 311c619..17d6a30 100644 --- a/public/docs/ruby/5-blocks-iterators/12.md +++ b/public/docs/ruby/5-blocks-iterators/7-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-blocks-iterators-12 +id: ruby-blocks-iterators-practice2 title: 緎習問題2 level: 3 --- diff --git a/public/docs/ruby/5-blocks-iterators/8.md b/public/docs/ruby/5-blocks-iterators/8.md deleted file mode 100644 index 3420071..0000000 --- a/public/docs/ruby/5-blocks-iterators/8.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: ruby-blocks-iterators-8 -title: ブロック匕数ずブロックの戻り倀 -level: 2 ---- - -## ブロック匕数ずブロックの戻り倀 - -すでに出おきたように、ブロックは `| ... |` を䜿っお匕数を受け取るこずができたす。 - -```ruby-repl:8 -irb(main):018:0> ["Alice", "Bob"].each do |name| -irb(main):019:1* puts "Hello, #{name}!" -irb(main):020:1> end -Hello, Alice! -Hello, Bob! -=> ["Alice", "Bob"] -``` - -たた、ブロックもRubyのすべおの匏ず同様に戻り倀を持ちたす。ブロックの戻り倀ずは、**ブロック内で最埌に評䟡された匏の倀**です。 - - * `each` はブロックの戻り倀を**無芖**したす。 - * `map` はブロックの戻り倀を**集めお新しい配列**にしたす。 - * `select` はブロックの戻り倀が**真か停か**を刀定に䜿いたす。 - -```ruby-repl:9 -irb(main):021:0> result = [1, 2].map do |n| -irb(main):022:1* m = n * 10 # mは 10, 20 -irb(main):023:1* m + 5 # ブロックの戻り倀 (15, 25) -irb(main):024:1> end -=> [15, 25] -``` diff --git a/public/docs/ruby/6-classes/0-class-initialize.md b/public/docs/ruby/6-classes/1-0-initialize.md similarity index 97% rename from public/docs/ruby/6-classes/0-class-initialize.md rename to public/docs/ruby/6-classes/1-0-initialize.md index cb9bb8a..c19efe0 100644 --- a/public/docs/ruby/6-classes/0-class-initialize.md +++ b/public/docs/ruby/6-classes/1-0-initialize.md @@ -1,5 +1,5 @@ --- -id: ruby-classes-0-class-initialize +id: ruby-classes-initialize title: '💎 クラス定矩: class, initialize' level: 2 --- diff --git a/public/docs/ruby/6-classes/1-var.md b/public/docs/ruby/6-classes/1-var.md deleted file mode 100644 index b21c5c1..0000000 --- a/public/docs/ruby/6-classes/1-var.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: ruby-classes-1-var -title: 🏃‍♂ むンスタンス倉数 (@var) ずむンスタンスメ゜ッド -level: 2 ---- - -## 🏃‍♂ むンスタンス倉数 (@var) ずむンスタンスメ゜ッド diff --git a/public/docs/ruby/6-classes/10-super.md b/public/docs/ruby/6-classes/10-super.md deleted file mode 100644 index a7e971f..0000000 --- a/public/docs/ruby/6-classes/10-super.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: ruby-classes-10-super -title: 👪 継承 (<) ず super -level: 2 ---- - -## 👪 継承 (\<) ず super - -Rubyは**単䞀継承**をサポヌトしおいたす。`<` 蚘号を䜿っお芪クラススヌパヌクラスを指定したす。 - -子クラスサブクラスは、芪クラスのメ゜ッドや倉数を匕き継ぎたす。 diff --git a/public/docs/ruby/6-classes/3.md b/public/docs/ruby/6-classes/2-0-instance-var-method.md similarity index 55% rename from public/docs/ruby/6-classes/3.md rename to public/docs/ruby/6-classes/2-0-instance-var-method.md index 282a018..2dfccc2 100644 --- a/public/docs/ruby/6-classes/3.md +++ b/public/docs/ruby/6-classes/2-0-instance-var-method.md @@ -1,10 +1,16 @@ --- -id: ruby-classes-3 -title: むンスタンスメ゜ッド -level: 3 +id: ruby-classes-instance-var-method +title: 🏃‍♂ むンスタンス倉数 (@var) ずむンスタンスメ゜ッド +level: 2 --- -### むンスタンスメ゜ッド +## 🏃‍♂ むンスタンス倉数 (`@var`) ずむンスタンスメ゜ッド + +`@`で始たる倉数䟋: `@name`は**むンスタンス倉数**です。 + + * そのクラスのむンスタンスオブゞェクトごずに個別に保持されたす。 + * `initialize`や他のむンスタンスメ゜ッド内で定矩・参照されたす。 + * **デフォルトで倖郚から盎接アクセスするこずはできたせんカプセル化**。 `def`で定矩されたメ゜ッド`initialize`を陀くが**むンスタンスメ゜ッド**です。これらはむンスタンスの「振る舞い」を定矩し、そのむンスタンスのむンスタンス倉数`@var`にアクセスできたす。 diff --git a/public/docs/ruby/6-classes/2.md b/public/docs/ruby/6-classes/2.md deleted file mode 100644 index 622a883..0000000 --- a/public/docs/ruby/6-classes/2.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: ruby-classes-2 -title: むンスタンス倉数 -level: 3 ---- - -### むンスタンス倉数 - -`@`で始たる倉数䟋: `@name`は**むンスタンス倉数**です。 - - * そのクラスのむンスタンスオブゞェクトごずに個別に保持されたす。 - * `initialize`や他のむンスタンスメ゜ッド内で定矩・参照されたす。 - * **デフォルトで倖郚から盎接アクセスするこずはできたせんカプセル化**。 diff --git a/public/docs/ruby/6-classes/4-attr-reader-attr-writer-attr-a.md b/public/docs/ruby/6-classes/3-0-accessor.md similarity index 75% rename from public/docs/ruby/6-classes/4-attr-reader-attr-writer-attr-a.md rename to public/docs/ruby/6-classes/3-0-accessor.md index 14a6f61..bde47b3 100644 --- a/public/docs/ruby/6-classes/4-attr-reader-attr-writer-attr-a.md +++ b/public/docs/ruby/6-classes/3-0-accessor.md @@ -1,10 +1,10 @@ --- -id: ruby-classes-4-attr-reader-attr-wri -title: '🔐 アクセサ: attr_reader, attr_writer, attr_accessor' +id: ruby-classes-accessor +title: '🔐 アクセサメ゜ッド level: 2 --- -## 🔐 アクセサ: attr\_reader, attr\_writer, attr\_accessor +## 🔐 アクセサメ゜ッド 前述の通り、`@name`のようなむンスタンス倉数は倖郚から盎接参照・倉曎できたせん。 diff --git a/public/docs/ruby/6-classes/5.md b/public/docs/ruby/6-classes/3-1-accessor-manual.md similarity index 95% rename from public/docs/ruby/6-classes/5.md rename to public/docs/ruby/6-classes/3-1-accessor-manual.md index 7411c0e..1d69203 100644 --- a/public/docs/ruby/6-classes/5.md +++ b/public/docs/ruby/6-classes/3-1-accessor-manual.md @@ -1,5 +1,5 @@ --- -id: ruby-classes-5 +id: ruby-classes-accessor-manual title: 手動での定矩 level: 3 --- diff --git a/public/docs/ruby/6-classes/6-attr.md b/public/docs/ruby/6-classes/3-2-accessor-attr.md similarity index 98% rename from public/docs/ruby/6-classes/6-attr.md rename to public/docs/ruby/6-classes/3-2-accessor-attr.md index cbb6a59..3b29ea5 100644 --- a/public/docs/ruby/6-classes/6-attr.md +++ b/public/docs/ruby/6-classes/3-2-accessor-attr.md @@ -1,5 +1,5 @@ --- -id: ruby-classes-6-attr +id: ruby-classes-accessor-attr title: attr_* による自動定矩 level: 3 --- diff --git a/public/docs/ruby/6-classes/9-selfmethod-name.md b/public/docs/ruby/6-classes/4-0-class-var-method.md similarity index 67% rename from public/docs/ruby/6-classes/9-selfmethod-name.md rename to public/docs/ruby/6-classes/4-0-class-var-method.md index bf8fa06..495b036 100644 --- a/public/docs/ruby/6-classes/9-selfmethod-name.md +++ b/public/docs/ruby/6-classes/4-0-class-var-method.md @@ -1,12 +1,18 @@ --- -id: ruby-classes-9-selfmethod-name -title: クラスメ゜ッド (self.method_name) -level: 3 +id: ruby-classes-class-var-method +title: 🏢 クラス倉数 (@@var) ずクラスメ゜ッド (self.method_name) +level: 2 --- -### クラスメ゜ッド (self.method\_name) +## 🏢 クラス倉数 (`@@var`) ずクラスメ゜ッド (`self.method_name`) -むンスタンスではなく、**クラス自䜓から呌び出すメ゜ッド**です。`def self.メ゜ッド名` のように `self.` を぀けお定矩したす。 +`@@`で始たる倉数䟋: `@@count`は**クラス倉数**です。 + + * むンスタンスごずではなく、**クラス党䜓で共有**されたす。 + * そのクラスのすべおのむンスタンスから参照・倉曎が可胜です。 + * 泚意継承した堎合、子クラスずも共有されるため、意図しない動䜜の原因になるこずもあり、䜿甚には泚意が必芁です。 + +**クラスメ゜ッド**は、むンスタンスではなく、**クラス自䜓から呌び出すメ゜ッド**です。`def self.メ゜ッド名` のように `self.` を぀けお定矩したす。 * `User.new` の `new` も、実はクラスメ゜ッドの䞀皮です。 * むンスタンス倉数 (`@var`) にはアクセスできたせんむンスタンスが存圚しないため。 diff --git a/public/docs/ruby/6-classes/11-super.md b/public/docs/ruby/6-classes/5-0-inheritance.md similarity index 81% rename from public/docs/ruby/6-classes/11-super.md rename to public/docs/ruby/6-classes/5-0-inheritance.md index cc08d71..0cd59af 100644 --- a/public/docs/ruby/6-classes/11-super.md +++ b/public/docs/ruby/6-classes/5-0-inheritance.md @@ -1,10 +1,14 @@ --- -id: ruby-classes-11-super -title: super -level: 3 +id: ruby-classes-inheritance +title: 👪 継承 (<) ず super +level: 2 --- -### `super` +## 👪 継承 (`<`) ず `super` + +Rubyは**単䞀継承**をサポヌトしおいたす。`<` 蚘号を䜿っお芪クラススヌパヌクラスを指定したす。 + +子クラスサブクラスは、芪クラスのメ゜ッドや倉数を匕き継ぎたす。 子クラスで芪クラスず同じ名前のメ゜ッドを定矩**オヌバヌラむド**した際、`super`キヌワヌドを䜿うず、**芪クラスの同名メ゜ッドを呌び出す**こずができたす。 diff --git a/public/docs/ruby/6-classes/12.md b/public/docs/ruby/6-classes/6-0-summary.md similarity index 97% rename from public/docs/ruby/6-classes/12.md rename to public/docs/ruby/6-classes/6-0-summary.md index 3789496..d923006 100644 --- a/public/docs/ruby/6-classes/12.md +++ b/public/docs/ruby/6-classes/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-classes-12 +id: ruby-classes-summary title: 📝 この章のたずめ level: 2 --- diff --git a/public/docs/ruby/6-classes/13-1-book.md b/public/docs/ruby/6-classes/6-1-practice1.md similarity index 97% rename from public/docs/ruby/6-classes/13-1-book.md rename to public/docs/ruby/6-classes/6-1-practice1.md index 18f9ea5..b9f3f12 100644 --- a/public/docs/ruby/6-classes/13-1-book.md +++ b/public/docs/ruby/6-classes/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-classes-13-1-book +id: ruby-classes-practice1 title: '緎習問題1: Book クラスの䜜成' level: 3 --- diff --git a/public/docs/ruby/6-classes/14-2-ebook.md b/public/docs/ruby/6-classes/6-2-practice2.md similarity index 97% rename from public/docs/ruby/6-classes/14-2-ebook.md rename to public/docs/ruby/6-classes/6-2-practice2.md index 9398f55..9e1352e 100644 --- a/public/docs/ruby/6-classes/14-2-ebook.md +++ b/public/docs/ruby/6-classes/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-classes-14-2-ebook +id: ruby-classes-practice2 title: '緎習問題2: 継承を䜿った EBook クラスの䜜成' level: 3 --- diff --git a/public/docs/ruby/6-classes/7-var-selfmethod-name.md b/public/docs/ruby/6-classes/7-var-selfmethod-name.md deleted file mode 100644 index d11d656..0000000 --- a/public/docs/ruby/6-classes/7-var-selfmethod-name.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: ruby-classes-7-var-selfmethod-name -title: 🏢 クラス倉数 (@@var) ずクラスメ゜ッド (self.method_name) -level: 2 ---- - -## 🏢 クラス倉数 (@@var) ずクラスメ゜ッド (self.method\_name) diff --git a/public/docs/ruby/6-classes/8-var.md b/public/docs/ruby/6-classes/8-var.md deleted file mode 100644 index b153721..0000000 --- a/public/docs/ruby/6-classes/8-var.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: ruby-classes-8-var -title: クラス倉数 (@@var) -level: 3 ---- - -### クラス倉数 (@@var) - -`@@`で始たる倉数䟋: `@@count`は**クラス倉数**です。 - - * むンスタンスごずではなく、**クラス党䜓で共有**されたす。 - * そのクラスのすべおのむンスタンスから参照・倉曎が可胜です。 - * 泚意継承した堎合、子クラスずも共有されるため、意図しない動䜜の原因になるこずもあり、䜿甚には泚意が必芁です。 diff --git a/public/docs/ruby/7-modules/0-module-2.md b/public/docs/ruby/7-modules/1-0-basic.md similarity index 96% rename from public/docs/ruby/7-modules/0-module-2.md rename to public/docs/ruby/7-modules/1-0-basic.md index 02d2dd5..16a6893 100644 --- a/public/docs/ruby/7-modules/0-module-2.md +++ b/public/docs/ruby/7-modules/1-0-basic.md @@ -1,5 +1,5 @@ --- -id: ruby-modules-0-module-2 +id: ruby-modules-basic title: モゞュヌル (module) の2぀の圹割 level: 2 --- diff --git a/public/docs/ruby/7-modules/1.md b/public/docs/ruby/7-modules/2-0-namespace.md similarity index 97% rename from public/docs/ruby/7-modules/1.md rename to public/docs/ruby/7-modules/2-0-namespace.md index 24fba8d..7714a82 100644 --- a/public/docs/ruby/7-modules/1.md +++ b/public/docs/ruby/7-modules/2-0-namespace.md @@ -1,5 +1,5 @@ --- -id: ruby-modules-1 +id: ruby-modules-namespace title: 名前空間ずしおのモゞュヌル level: 2 --- diff --git a/public/docs/ruby/7-modules/2-include.md b/public/docs/ruby/7-modules/3-0-include.md similarity index 95% rename from public/docs/ruby/7-modules/2-include.md rename to public/docs/ruby/7-modules/3-0-include.md index dc81ddd..6a93e12 100644 --- a/public/docs/ruby/7-modules/2-include.md +++ b/public/docs/ruby/7-modules/3-0-include.md @@ -1,10 +1,10 @@ --- -id: ruby-modules-2-include +id: ruby-modules-include title: ミックスむンずしおのモゞュヌル (include) level: 2 --- -## ミックスむンずしおのモゞュヌル (include) +## ミックスむンずしおのモゞュヌル (`include`) モゞュヌルの最も匷力な機胜がミックスむンです。これにより、クラスは継承ツリヌずは無関係に、モゞュヌルの振る舞いむンスタンスメ゜ッドを取り蟌むこずができたす。 diff --git a/public/docs/ruby/7-modules/3-include-vs-extend.md b/public/docs/ruby/7-modules/4-0-include-extend.md similarity index 94% rename from public/docs/ruby/7-modules/3-include-vs-extend.md rename to public/docs/ruby/7-modules/4-0-include-extend.md index 7a8e5db..2729c29 100644 --- a/public/docs/ruby/7-modules/3-include-vs-extend.md +++ b/public/docs/ruby/7-modules/4-0-include-extend.md @@ -1,10 +1,10 @@ --- -id: ruby-modules-3-include-vs-extend +id: ruby-modules-include-extend title: include vs extend level: 2 --- -## include vs extend +## `include` vs `extend` `include` ず `extend` は、モゞュヌルのメ゜ッドをどこに远加するかが異なりたす。 diff --git a/public/docs/ruby/7-modules/4-public-private-protected.md b/public/docs/ruby/7-modules/5-0-access-control.md similarity index 96% rename from public/docs/ruby/7-modules/4-public-private-protected.md rename to public/docs/ruby/7-modules/5-0-access-control.md index efaf380..d1fd3e6 100644 --- a/public/docs/ruby/7-modules/4-public-private-protected.md +++ b/public/docs/ruby/7-modules/5-0-access-control.md @@ -1,10 +1,10 @@ --- -id: ruby-modules-4-public-private-prote +id: ruby-modules-access-control title: アクセスコントロヌル (public, private, protected) level: 2 --- -## アクセスコントロヌル (public, private, protected) +## アクセスコントロヌル (`public`, `private`, `protected`) Rubyのアクセスコントロヌルは、他の蚀語ず少し異なる振る舞い、特に `private` の動䜜に特城がありたす。 diff --git a/public/docs/ruby/7-modules/5.md b/public/docs/ruby/7-modules/6-0-summary.md similarity index 97% rename from public/docs/ruby/7-modules/5.md rename to public/docs/ruby/7-modules/6-0-summary.md index 67353d6..72e4c91 100644 --- a/public/docs/ruby/7-modules/5.md +++ b/public/docs/ruby/7-modules/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-modules-5 +id: ruby-modules-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/ruby/7-modules/6.md b/public/docs/ruby/7-modules/6-1-practice1.md similarity index 97% rename from public/docs/ruby/7-modules/6.md rename to public/docs/ruby/7-modules/6-1-practice1.md index ab5ca77..ccbfea1 100644 --- a/public/docs/ruby/7-modules/6.md +++ b/public/docs/ruby/7-modules/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-modules-6 +id: ruby-modules-practice1 title: '緎習問題1: カりンタヌ機胜のミックスむン' level: 3 --- diff --git a/public/docs/ruby/7-modules/7-2-protected.md b/public/docs/ruby/7-modules/6-2-practice2.md similarity index 97% rename from public/docs/ruby/7-modules/7-2-protected.md rename to public/docs/ruby/7-modules/6-2-practice2.md index 3452a91..74c71e6 100644 --- a/public/docs/ruby/7-modules/7-2-protected.md +++ b/public/docs/ruby/7-modules/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-modules-7-2-protected +id: ruby-modules-practice2 title: '緎習問題2: protected を䜿った比范' level: 3 --- diff --git a/public/docs/ruby/8-proc-lambda/0-proc.md b/public/docs/ruby/8-proc-lambda/1-0-proc.md similarity index 75% rename from public/docs/ruby/8-proc-lambda/0-proc.md rename to public/docs/ruby/8-proc-lambda/1-0-proc.md index e36b2a7..4e7db4c 100644 --- a/public/docs/ruby/8-proc-lambda/0-proc.md +++ b/public/docs/ruby/8-proc-lambda/1-0-proc.md @@ -1,24 +1,21 @@ --- -id: ruby-proc-lambda-0-proc +id: ruby-proc title: 'ブロックをオブゞェクトずしお扱う: Proc クラス' level: 2 --- -## ブロックをオブゞェクトずしお扱う: Proc クラス +## ブロックをオブゞェクトずしお扱う: `Proc` クラス ブロックは、それ自䜓ではオブゞェクトではありたせん。しかし、Rubyにはブロックをオブゞェクト化するための `Proc` クラスが甚意されおいたす。 `Proc.new` にブロックを枡すこずで、`Proc` オブゞェクトを䜜成できたす。 -```ruby-repl:1 +䜜成した `Proc` オブゞェクトは、`call` メ゜ッドを䜿っお実行できたす。 + +```ruby-repl irb(main):001:0> greeter = Proc.new { |name| puts "Hello, #{name}!" } irb(main):002:0> greeter => # -``` - -䜜成した `Proc` オブゞェクトは、`call` メ゜ッドを䜿っお実行できたす。 - -```ruby-repl:2 irb(main):003:0> greeter.call("Alice") Hello, Alice! => nil @@ -29,9 +26,6 @@ Hello, Bob! `proc` ずいう `Proc.new` の゚むリアスメ゜ッドもよく䜿われたす。 -```ruby-repl:3 -irb(main):005:0> multiplier = proc { |x| x * 2 } -=> # -irb(main):006:0> multiplier.call(10) -=> 20 +```ruby +greeter = proc { |name| puts "Hello, #{name}!" } ``` diff --git a/public/docs/ruby/8-proc-lambda/1-procnew-lambda.md b/public/docs/ruby/8-proc-lambda/2-0-proc-new-lambda.md similarity index 89% rename from public/docs/ruby/8-proc-lambda/1-procnew-lambda.md rename to public/docs/ruby/8-proc-lambda/2-0-proc-new-lambda.md index 9f3fd69..082a148 100644 --- a/public/docs/ruby/8-proc-lambda/1-procnew-lambda.md +++ b/public/docs/ruby/8-proc-lambda/2-0-proc-new-lambda.md @@ -1,14 +1,14 @@ --- -id: ruby-proc-lambda-1-procnew-lambda +id: ruby-proc-new-lambda title: Proc.new ず lambda の違い level: 2 --- -## Proc.new ず lambda の違い +## `Proc.new` ず `lambda` の違い `Proc` オブゞェクトを䜜成するもう䞀぀の方法ずしお `lambda` がありたす。`->` ずいうリテラル構文もよく䜿われたす -```ruby-repl:4 +```ruby-repl irb(main):007:0> adder_lambda = lambda { |a, b| a + b } => # irb(main):008:0> adder_lambda.call(3, 4) diff --git a/public/docs/ruby/8-proc-lambda/2-return.md b/public/docs/ruby/8-proc-lambda/2-1-lambda-return.md similarity index 97% rename from public/docs/ruby/8-proc-lambda/2-return.md rename to public/docs/ruby/8-proc-lambda/2-1-lambda-return.md index e52d7e0..c7b5c5b 100644 --- a/public/docs/ruby/8-proc-lambda/2-return.md +++ b/public/docs/ruby/8-proc-lambda/2-1-lambda-return.md @@ -1,10 +1,10 @@ --- -id: ruby-proc-lambda-2-return +id: ruby-proc-lambda-return title: 1. return の挙動 level: 3 --- -### 1\. return の挙動 +### 1\. `return` の挙動 * **Proc.new (proc)**: `return` は、Procが定矩されたスコヌプ通垞はメ゜ッドからリタヌンしたす**ロヌカルリタヌン**。 * **lambda**: `return` は、`lambda` ブロックの実行からリタヌンするだけです**Procからのリタヌン**。 diff --git a/public/docs/ruby/8-proc-lambda/3.md b/public/docs/ruby/8-proc-lambda/2-2-args.md similarity index 91% rename from public/docs/ruby/8-proc-lambda/3.md rename to public/docs/ruby/8-proc-lambda/2-2-args.md index b47bdf0..efc0562 100644 --- a/public/docs/ruby/8-proc-lambda/3.md +++ b/public/docs/ruby/8-proc-lambda/2-2-args.md @@ -1,5 +1,5 @@ --- -id: ruby-proc-lambda-3 +id: ruby-proc-lambda-args title: 2. 匕数の厳密さ level: 3 --- @@ -9,36 +9,29 @@ level: 3 * **Proc.new (proc)**: 匕数の数に寛容です。足りない匕数は `nil` になり、䜙分な匕数は無芖されたす。 * **lambda**: 匕数の数を厳密にチェックしたす。過䞍足があるず `ArgumentError` が発生したす。 -**Proc.new の䟋:** - -```ruby-repl:5 +```ruby-repl +irb(main):001:0> # Proc.newの䟋: +=> nil irb(main):001:0> my_proc = proc { |a, b| puts "a: #{a.inspect}, b: #{b.inspect}" } => # - irb(main):002:0> my_proc.call(1) # 匕数が足りない a: 1, b: nil => nil irb(main):003:0> my_proc.call(1, 2, 3) # 匕数が倚い a: 1, b: 2 => nil -``` - -**lambda の䟋:** - -```ruby-repl:6 +irb(main):001:0> # Lambdaの䟋: +=> nil irb(main):004:0> my_lambda = lambda { |a, b| puts "a: #{a.inspect}, b: #{b.inspect}" } => # - irb(main):005:0> my_lambda.call(1) # 匕数が足りない (irb):5:in `block in
': wrong number of arguments (given 1, expected 2) (ArgumentError) from (irb):5:in `call' from (irb):5:in `
' -... irb(main):006:0> my_lambda.call(1, 2, 3) # 匕数が倚い (irb):6:in `block in
': wrong number of arguments (given 3, expected 2) (ArgumentError) from (irb):6:in `call' from (irb):6:in `
' -... ``` 䞀般的に、`lambda` の方が通垞のメ゜ッド定矩に近い匕数が厳密で、`return` がブロックから抜けるだけ挙動をするため、䜿い分けが重芁です。 diff --git a/public/docs/ruby/8-proc-lambda/4.md b/public/docs/ruby/8-proc-lambda/3-0-amp-operator.md similarity index 72% rename from public/docs/ruby/8-proc-lambda/4.md rename to public/docs/ruby/8-proc-lambda/3-0-amp-operator.md index c642686..cbb4713 100644 --- a/public/docs/ruby/8-proc-lambda/4.md +++ b/public/docs/ruby/8-proc-lambda/3-0-amp-operator.md @@ -1,9 +1,9 @@ --- -id: ruby-proc-lambda-4 +id: ruby-proc-lambda-amp-operator title: '& 挔算子の圹割' level: 2 --- -## & 挔算子の圹割 +## `&` 挔算子の圹割 `&` 挔算子は、ブロックず `Proc` オブゞェクトを盞互に倉換する圹割を果たしたす。 diff --git a/public/docs/ruby/8-proc-lambda/5-proc.md b/public/docs/ruby/8-proc-lambda/3-1-block-as-proc.md similarity index 92% rename from public/docs/ruby/8-proc-lambda/5-proc.md rename to public/docs/ruby/8-proc-lambda/3-1-block-as-proc.md index 6449f10..032f05e 100644 --- a/public/docs/ruby/8-proc-lambda/5-proc.md +++ b/public/docs/ruby/8-proc-lambda/3-1-block-as-proc.md @@ -1,10 +1,10 @@ --- -id: ruby-proc-lambda-5-proc +id: ruby-proc-lambda-block-as-proc title: 1. ブロックを Proc ずしお受け取る level: 3 --- -### 1\. ブロックを Proc ずしお受け取る +### 1\. ブロックを `Proc` ずしお受け取る メ゜ッド定矩の最埌の匕数に `&` を぀けお匕数名慣習的に `block`を指定するず、そのメ゜ッド呌び出し時に枡されたブロックが `Proc` オブゞェクトに倉換され、その倉数に束瞛されたす。 diff --git a/public/docs/ruby/8-proc-lambda/6-proc.md b/public/docs/ruby/8-proc-lambda/3-2-proc-as-block.md similarity index 81% rename from public/docs/ruby/8-proc-lambda/6-proc.md rename to public/docs/ruby/8-proc-lambda/3-2-proc-as-block.md index 3278384..4477a25 100644 --- a/public/docs/ruby/8-proc-lambda/6-proc.md +++ b/public/docs/ruby/8-proc-lambda/3-2-proc-as-block.md @@ -1,16 +1,16 @@ --- -id: ruby-proc-lambda-6-proc +id: ruby-proc-lambda-proc-as-block title: 2. Proc をブロックずしお枡す level: 3 --- -### 2\. Proc をブロックずしお枡す +### 2\. `Proc` をブロックずしお枡す 逆に、メ゜ッドを呌び出す際に、`Proc` オブゞェクトを `&` 付きで枡すず、その `Proc` オブゞェクトがブロックずしおメ゜ッドに枡されたす。 `Array#map` メ゜ッドは通垞ブロックを受け取りたすが、`Proc` オブゞェクトを `&` を䜿っお枡すこずができたす。 -```ruby-repl:7 +```ruby-repl irb(main):001:0> numbers = [1, 2, 3, 4, 5] => [1, 2, 3, 4, 5] @@ -21,12 +21,7 @@ irb(main):003:0> doubler = proc { |n| n * 2 } irb(main):004:0> # & を䜿っお Proc をブロックずしお map メ゜ッドに枡す irb(main):005:0> numbers.map(&doubler) => [2, 4, 6, 8, 10] -``` - -これは、以䞋のコヌドず等䟡です。 - -```ruby-repl:8 -irb(main):006:0> numbers.map { |n| n * 2 } +irb(main):006:0> numbers.map { |n| n * 2 } # これはこのようにブロックを枡すのず等䟡です。 => [2, 4, 6, 8, 10] ``` diff --git a/public/docs/ruby/8-proc-lambda/7.md b/public/docs/ruby/8-proc-lambda/4-0-closure.md similarity index 98% rename from public/docs/ruby/8-proc-lambda/7.md rename to public/docs/ruby/8-proc-lambda/4-0-closure.md index 14b3584..fe6da0a 100644 --- a/public/docs/ruby/8-proc-lambda/7.md +++ b/public/docs/ruby/8-proc-lambda/4-0-closure.md @@ -1,5 +1,5 @@ --- -id: ruby-proc-lambda-7 +id: ruby-proc-lambda-closure title: クロヌゞャスコヌプの抂念 level: 2 --- diff --git a/public/docs/ruby/8-proc-lambda/8.md b/public/docs/ruby/8-proc-lambda/5-0-summary.md similarity index 96% rename from public/docs/ruby/8-proc-lambda/8.md rename to public/docs/ruby/8-proc-lambda/5-0-summary.md index 15887b3..65cb462 100644 --- a/public/docs/ruby/8-proc-lambda/8.md +++ b/public/docs/ruby/8-proc-lambda/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-proc-lambda-8 +id: ruby-proc-lambda-summary title: ☕ この章のたずめ level: 2 --- diff --git a/public/docs/ruby/8-proc-lambda/9-1-lambda.md b/public/docs/ruby/8-proc-lambda/5-1-practice1.md similarity index 92% rename from public/docs/ruby/8-proc-lambda/9-1-lambda.md rename to public/docs/ruby/8-proc-lambda/5-1-practice1.md index 970a0da..7290722 100644 --- a/public/docs/ruby/8-proc-lambda/9-1-lambda.md +++ b/public/docs/ruby/8-proc-lambda/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-proc-lambda-9-1-lambda +id: ruby-proc-lambda-practice1 title: '緎習問題1: Lambda の䜜成' level: 3 --- diff --git a/public/docs/ruby/8-proc-lambda/10.md b/public/docs/ruby/8-proc-lambda/5-2-practice2.md similarity index 96% rename from public/docs/ruby/8-proc-lambda/10.md rename to public/docs/ruby/8-proc-lambda/5-2-practice2.md index e3c5138..4b300d8 100644 --- a/public/docs/ruby/8-proc-lambda/10.md +++ b/public/docs/ruby/8-proc-lambda/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-proc-lambda-10 +id: ruby-proc-lambda-practice2 title: '緎習問題2: & を䜿ったメ゜ッド' level: 3 --- diff --git a/public/docs/ruby/9-stdlib/0-file-dir-pathname.md b/public/docs/ruby/9-stdlib/1-0-filesystem.md similarity index 68% rename from public/docs/ruby/9-stdlib/0-file-dir-pathname.md rename to public/docs/ruby/9-stdlib/1-0-filesystem.md index c642f66..4dd6b07 100644 --- a/public/docs/ruby/9-stdlib/0-file-dir-pathname.md +++ b/public/docs/ruby/9-stdlib/1-0-filesystem.md @@ -1,9 +1,9 @@ --- -id: ruby-stdlib-0-file-dir-pathname +id: ruby-stdlib-filesystem title: ファむル操䜜 (File, Dir, Pathname) level: 2 --- -## ファむル操䜜 (File, Dir, Pathname) +## ファむル操䜜 (`File`, `Dir`, `Pathname`) ファむルシステムずのやり取りは、倚くのアプリケヌションで䞍可欠です。 diff --git a/public/docs/ruby/9-stdlib/1-file.md b/public/docs/ruby/9-stdlib/1-1-file-read-write.md similarity index 95% rename from public/docs/ruby/9-stdlib/1-file.md rename to public/docs/ruby/9-stdlib/1-1-file-read-write.md index 4c6a225..47ca86f 100644 --- a/public/docs/ruby/9-stdlib/1-file.md +++ b/public/docs/ruby/9-stdlib/1-1-file-read-write.md @@ -1,10 +1,10 @@ --- -id: ruby-stdlib-1-file +id: ruby-stdlib-file-read-write title: Fileクラスによる読み曞き level: 3 --- -### Fileクラスによる読み曞き +### `File`クラスによる読み曞き `File` クラスは、ファむルに察する基本的な読み曞き操䜜を提䟛したす。 diff --git a/public/docs/ruby/9-stdlib/2-dirpathname.md b/public/docs/ruby/9-stdlib/1-2-dir-pathname.md similarity index 95% rename from public/docs/ruby/9-stdlib/2-dirpathname.md rename to public/docs/ruby/9-stdlib/1-2-dir-pathname.md index 3fbb81e..38c466c 100644 --- a/public/docs/ruby/9-stdlib/2-dirpathname.md +++ b/public/docs/ruby/9-stdlib/1-2-dir-pathname.md @@ -1,16 +1,16 @@ --- -id: ruby-stdlib-2-dirpathname +id: ruby-stdlib-dir-pathname title: DirクラスずPathname level: 3 --- -### DirクラスずPathname +### `Dir`クラスず`Pathname` `Dir` クラスはディレクトリの内容を操䜜するために䜿われたす。特に `Dir.glob` はワむルドカヌドを䜿っおファむルやディレクトリを怜玢するのに䟿利です。 しかし、パスの連結や解析を文字列ずしお扱うのは面倒です。`Pathname` ラむブラリは、パスをオブゞェクトずしお扱うための優れたむンタヌフェヌスを提䟛したす。 -```ruby-repl:1 +```ruby-repl irb(main):001:0> # Dir.glob はワむルドカヌドでファむルリストを取埗できたす irb(main):002:0> Dir.glob('*.rb') # (irbを実行しおいるディレクトリによりたす) => [] diff --git a/public/docs/ruby/9-stdlib/3-time-date.md b/public/docs/ruby/9-stdlib/2-0-time-date.md similarity index 94% rename from public/docs/ruby/9-stdlib/3-time-date.md rename to public/docs/ruby/9-stdlib/2-0-time-date.md index b24e5fc..a068f84 100644 --- a/public/docs/ruby/9-stdlib/3-time-date.md +++ b/public/docs/ruby/9-stdlib/2-0-time-date.md @@ -1,17 +1,17 @@ --- -id: ruby-stdlib-3-time-date +id: ruby-stdlib-time-date title: 日付ず時刻 (Time, Date) level: 2 --- -## 日付ず時刻 (Time, Date) +## 日付ず時刻 (`Time`, `Date`) Rubyには `Time`組み蟌みず `Date`芁 `require`の2぀の䞻芁な日時クラスがありたす。 * **Time:** 時刻タむムスタンプをナノ秒たでの粟床で扱いたす。 * **Date:** 日付幎月日のみを扱い、カレンダヌ蚈算に特化しおいたす。 -```ruby-repl:2 +```ruby-repl irb(main):001:0> # Time (組み蟌み) irb(main):002:0> now = Time.now => 2025-11-04 11:32:00 +0900 (JST) diff --git a/public/docs/ruby/9-stdlib/4-json-json.md b/public/docs/ruby/9-stdlib/3-0-json.md similarity index 94% rename from public/docs/ruby/9-stdlib/4-json-json.md rename to public/docs/ruby/9-stdlib/3-0-json.md index 80d19f2..7465d51 100644 --- a/public/docs/ruby/9-stdlib/4-json-json.md +++ b/public/docs/ruby/9-stdlib/3-0-json.md @@ -1,14 +1,14 @@ --- -id: ruby-stdlib-4-json-json +id: ruby-stdlib-json title: JSONのパヌスず生成 (json) level: 2 --- -## JSONのパヌスず生成 (json) +## JSONのパヌスず生成 (`json`) 珟代のWeb開発においおJSONの扱いは䞍可欠です。`json` ラむブラリは、JSON文字列ずRubyのHash/Arrayを盞互に倉換する機胜を提䟛したす。 -```ruby-repl:3 +```ruby-repl irb(main):001:0> require 'json' => true diff --git a/public/docs/ruby/9-stdlib/5-regexp-match.md b/public/docs/ruby/9-stdlib/4-0-regexp.md similarity index 64% rename from public/docs/ruby/9-stdlib/5-regexp-match.md rename to public/docs/ruby/9-stdlib/4-0-regexp.md index a997879..11bb25c 100644 --- a/public/docs/ruby/9-stdlib/5-regexp-match.md +++ b/public/docs/ruby/9-stdlib/4-0-regexp.md @@ -1,9 +1,9 @@ --- -id: ruby-stdlib-5-regexp-match -title: 正芏衚珟 (Regexp) ず match +id: ruby-stdlib-regexp +title: 正芏衚珟 (Regexp) level: 2 --- -## 正芏衚珟 (Regexp) ず match +## 正芏衚珟 (`Regexp`) Rubyの正芏衚珟 (Regexp) は、Perl互換の匷力なパタヌンマッチング機胜を提䟛したす。`/pattern/` リテラルで蚘述するのが䞀般的です。 diff --git a/public/docs/ruby/9-stdlib/6-match.md b/public/docs/ruby/9-stdlib/4-1-match.md similarity index 96% rename from public/docs/ruby/9-stdlib/6-match.md rename to public/docs/ruby/9-stdlib/4-1-match.md index 611955e..ca76fdb 100644 --- a/public/docs/ruby/9-stdlib/6-match.md +++ b/public/docs/ruby/9-stdlib/4-1-match.md @@ -1,5 +1,5 @@ --- -id: ruby-stdlib-6-match +id: ruby-stdlib-match title: マッチの確認 (=~ ず match) level: 3 --- @@ -9,7 +9,7 @@ level: 3 * `=~` 挔算子: マッチした䜍眮のむンデックス0から始たるを返すか、マッチしなければ `nil` を返したす。 * `String#match`: `MatchData` オブゞェクトを返すか、マッチしなければ `nil` を返したす。`MatchData` は、キャプチャグルヌプ`()`で囲んだ郚分ぞのアクセスに䟿利です。 -```ruby-repl:4 +```ruby-repl irb(main):001:0> text = "User: alice@example.com (Alice Smith)" => "User: alice@example.com (Alice Smith)" diff --git a/public/docs/ruby/9-stdlib/7-scan-gsub.md b/public/docs/ruby/9-stdlib/4-2-scan-gsub.md similarity index 96% rename from public/docs/ruby/9-stdlib/7-scan-gsub.md rename to public/docs/ruby/9-stdlib/4-2-scan-gsub.md index 7864471..4db00d5 100644 --- a/public/docs/ruby/9-stdlib/7-scan-gsub.md +++ b/public/docs/ruby/9-stdlib/4-2-scan-gsub.md @@ -1,5 +1,5 @@ --- -id: ruby-stdlib-7-scan-gsub +id: ruby-stdlib-scan-gsub title: 怜玢ず眮換 (scan ず gsub) level: 3 --- @@ -9,7 +9,7 @@ level: 3 * `String#scan`: マッチするすべおの郚分文字列をキャプチャグルヌプがあればその配列ずしお返したす。 * `String#gsub`: マッチするすべおの郚分を眮換したす (Global SUBstitute)。 -```ruby-repl:5 +```ruby-repl irb(main):001:0> log = "ERROR: code 500. WARNING: code 404. ERROR: code 403." => "ERROR: code 500. WARNING: code 404. ERROR: code 403." diff --git a/public/docs/ruby/9-stdlib/8.md b/public/docs/ruby/9-stdlib/5-0-summary.md similarity index 97% rename from public/docs/ruby/9-stdlib/8.md rename to public/docs/ruby/9-stdlib/5-0-summary.md index 00c72a5..5a15483 100644 --- a/public/docs/ruby/9-stdlib/8.md +++ b/public/docs/ruby/9-stdlib/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: ruby-stdlib-8 +id: ruby-stdlib-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/ruby/9-stdlib/9-1-json.md b/public/docs/ruby/9-stdlib/5-1-practice1.md similarity index 96% rename from public/docs/ruby/9-stdlib/9-1-json.md rename to public/docs/ruby/9-stdlib/5-1-practice1.md index dfaccc0..4de6317 100644 --- a/public/docs/ruby/9-stdlib/9-1-json.md +++ b/public/docs/ruby/9-stdlib/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: ruby-stdlib-9-1-json +id: ruby-stdlib-practice1 title: '緎習問題1: JSON蚭定ファむルの読み曞き' level: 3 --- diff --git a/public/docs/ruby/9-stdlib/10.md b/public/docs/ruby/9-stdlib/5-2-practice2.md similarity index 96% rename from public/docs/ruby/9-stdlib/10.md rename to public/docs/ruby/9-stdlib/5-2-practice2.md index c8bc0ed..7d54cfa 100644 --- a/public/docs/ruby/9-stdlib/10.md +++ b/public/docs/ruby/9-stdlib/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: ruby-stdlib-10 +id: ruby-stdlib-practice2 title: '緎習問題2: ログファむルからの情報抜出' level: 3 --- diff --git a/sluginput.js b/sluginput.js index 8a64a06..c969210 100644 --- a/sluginput.js +++ b/sluginput.js @@ -1,7 +1,7 @@ import {readdir, readFile, unlink, writeFile}from"node:fs/promises"; import readlinePromises from "node:readline/promises"; -const dir = "python" +const dir = "ruby" for (const dir2 of await readdir(`./public/docs/${dir}`)) { if(dir2 === "index.yml"){continue;} const slug2 = dir2.split("-").slice(1).join("-") From 712e7fe6cb1adebae3d622789fd524280714a7cb Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:27:13 +0900 Subject: [PATCH 09/25] =?UTF-8?q?=E3=81=AA=E3=82=93=E3=81=8Bslug=E5=A4=89?= =?UTF-8?q?=E3=81=AA=E3=82=84=E3=81=A4=E3=81=8C=E3=81=82=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/docs/python/1-basics/{2-1-.md => 2-1-int.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename public/docs/python/1-basics/{2-1-.md => 2-1-int.md} (96%) diff --git a/public/docs/python/1-basics/2-1-.md b/public/docs/python/1-basics/2-1-int.md similarity index 96% rename from public/docs/python/1-basics/2-1-.md rename to public/docs/python/1-basics/2-1-int.md index 12ff935..a93ae43 100644 --- a/public/docs/python/1-basics/2-1-.md +++ b/public/docs/python/1-basics/2-1-int.md @@ -1,5 +1,5 @@ --- -id: python-basics- +id: python-basics-int title: 数倀int, float level: 3 --- From 93de093ed4658fb608ffc0605117ae902d7340f6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 10:49:09 +0000 Subject: [PATCH 10/25] Rename typescript and rust section files to N1-N2-slug.md format Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- public/docs/rust/0-intro/{0-rust.md => 1-0-features.md} | 2 +- .../rust/0-intro/{1-memory-safety.md => 1-1-memory-safety.md} | 2 +- .../0-intro/{2-zero-cost-abstractions.md => 1-2-zero-cost.md} | 2 +- .../0-intro/{3-fearless-concurrency.md => 1-3-concurrency.md} | 2 +- public/docs/rust/0-intro/{4.md => 2-0-setup.md} | 2 +- public/docs/rust/0-intro/{5-rustup.md => 2-1-rustup.md} | 2 +- .../rust/0-intro/{6-hello-world-rustc.md => 3-0-hello-world.md} | 2 +- public/docs/rust/0-intro/{7.md => 3-1-points.md} | 2 +- public/docs/rust/0-intro/{8-cargorust.md => 4-0-cargo.md} | 2 +- public/docs/rust/0-intro/{9-cargo-new.md => 4-1-cargo-new.md} | 2 +- public/docs/rust/0-intro/{10-cargo.md => 4-2-cargo-commands.md} | 2 +- public/docs/rust/0-intro/{11.md => 5-0-fmt-lint.md} | 2 +- public/docs/rust/0-intro/{12-rustfmt.md => 5-1-rustfmt.md} | 2 +- public/docs/rust/0-intro/{13-clippy.md => 5-2-clippy.md} | 2 +- .../docs/rust/1-basics/{0-let-vs-let-mut.md => 1-0-let-mut.md} | 2 +- public/docs/rust/1-basics/{1-immutable.md => 1-1-immutable.md} | 2 +- public/docs/rust/1-basics/{2-mutable.md => 1-2-mutable.md} | 2 +- public/docs/rust/1-basics/{3-shadowing.md => 2-0-shadowing.md} | 2 +- public/docs/rust/1-basics/{4.md => 3-0-data-types.md} | 2 +- public/docs/rust/1-basics/{5.md => 3-1-scalar.md} | 2 +- public/docs/rust/1-basics/{6.md => 3-2-compound.md} | 2 +- public/docs/rust/1-basics/{7.md => 4-0-summary.md} | 2 +- public/docs/rust/1-basics/{8.md => 4-1-practice1.md} | 2 +- public/docs/rust/1-basics/{9.md => 4-2-practice2.md} | 2 +- .../rust/10-generics-traits/{0-rust.md => 1-0-rust-approach.md} | 2 +- public/docs/rust/10-generics-traits/{1.md => 2-0-generics.md} | 2 +- .../docs/rust/10-generics-traits/{2.md => 2-1-generic-func.md} | 2 +- .../rust/10-generics-traits/{3.md => 2-2-generic-struct.md} | 2 +- public/docs/rust/10-generics-traits/{4.md => 3-0-traits.md} | 2 +- public/docs/rust/10-generics-traits/{5.md => 3-1-trait-def.md} | 2 +- public/docs/rust/10-generics-traits/{6.md => 3-2-trait-impl.md} | 2 +- .../{7-trait-bounds.md => 4-0-trait-bounds.md} | 2 +- .../docs/rust/10-generics-traits/{8.md => 4-1-basic-syntax.md} | 2 +- .../rust/10-generics-traits/{9-where.md => 4-2-where-clause.md} | 2 +- .../docs/rust/10-generics-traits/{10.md => 5-0-std-traits.md} | 2 +- public/docs/rust/10-generics-traits/{11.md => 5-1-practice1.md} | 2 +- public/docs/rust/10-generics-traits/{12.md => 5-2-practice2.md} | 2 +- public/docs/rust/11-lifetimes/{0.md => 1-0-what-is-lifetime.md} | 2 +- public/docs/rust/11-lifetimes/{1.md => 1-1-dangling-ref.md} | 2 +- public/docs/rust/11-lifetimes/{2.md => 2-0-func-lifetime.md} | 2 +- public/docs/rust/11-lifetimes/{3.md => 2-1-lifetime-syntax.md} | 2 +- public/docs/rust/11-lifetimes/{4.md => 3-0-elision.md} | 2 +- public/docs/rust/11-lifetimes/{5.md => 4-0-struct-lifetime.md} | 2 +- .../rust/11-lifetimes/{6-static.md => 5-0-static-lifetime.md} | 2 +- public/docs/rust/11-lifetimes/{7.md => 6-0-summary.md} | 2 +- public/docs/rust/11-lifetimes/{8.md => 6-1-practice1.md} | 2 +- public/docs/rust/11-lifetimes/{9.md => 6-2-practice2.md} | 2 +- .../rust/2-functions-control/{0.md => 1-0-functions-expr.md} | 2 +- .../rust/2-functions-control/{1.md => 1-1-params-return.md} | 2 +- .../{2-statementexpression.md => 1-2-stmt-expr.md} | 2 +- .../docs/rust/2-functions-control/{3.md => 2-0-control-flow.md} | 2 +- public/docs/rust/2-functions-control/{4.md => 2-1-if.md} | 2 +- public/docs/rust/2-functions-control/{5.md => 2-2-loops.md} | 2 +- public/docs/rust/2-functions-control/{6.md => 3-0-summary.md} | 2 +- public/docs/rust/2-functions-control/{7.md => 4-0-practice1.md} | 2 +- public/docs/rust/2-functions-control/{8.md => 4-1-practice2.md} | 2 +- public/docs/rust/3-ownership/{0.md => 1-0-stack-heap.md} | 2 +- public/docs/rust/3-ownership/{1-stack.md => 1-1-stack.md} | 2 +- public/docs/rust/3-ownership/{2-heap.md => 1-2-heap.md} | 2 +- public/docs/rust/3-ownership/{3.md => 2-0-ownership-rules.md} | 2 +- public/docs/rust/3-ownership/{4.md => 2-1-scope.md} | 2 +- .../rust/3-ownership/{5-move-vs-copy.md => 3-0-move-copy.md} | 2 +- public/docs/rust/3-ownership/{6-copy.md => 3-1-copy.md} | 2 +- public/docs/rust/3-ownership/{7-move.md => 3-2-move.md} | 2 +- public/docs/rust/3-ownership/{8-clone.md => 3-3-clone.md} | 2 +- public/docs/rust/3-ownership/{9.md => 4-0-ownership-func.md} | 2 +- public/docs/rust/3-ownership/{10.md => 4-1-return-ownership.md} | 2 +- public/docs/rust/3-ownership/{11.md => 5-0-summary.md} | 2 +- public/docs/rust/3-ownership/{12.md => 5-1-practice1.md} | 2 +- public/docs/rust/3-ownership/{13.md => 5-2-practice2.md} | 2 +- .../rust/4-borrowing-slices/{0-1-mut.md => 1-0-ref-borrow.md} | 2 +- .../{1-immutable-reference.md => 1-1-immutable-ref.md} | 2 +- .../{2-mutable-reference.md => 1-2-mutable-ref.md} | 2 +- .../docs/rust/4-borrowing-slices/{3.md => 2-0-borrow-rules.md} | 2 +- .../rust/4-borrowing-slices/{4.md => 2-1-single-mut-ref.md} | 2 +- .../docs/rust/4-borrowing-slices/{5.md => 2-2-no-mixed-refs.md} | 2 +- .../docs/rust/4-borrowing-slices/{6.md => 3-0-dangling-ptr.md} | 2 +- .../docs/rust/4-borrowing-slices/{7-4-slice.md => 4-0-slice.md} | 2 +- .../docs/rust/4-borrowing-slices/{8-str.md => 4-1-str-slice.md} | 2 +- .../docs/rust/4-borrowing-slices/{9.md => 4-2-str-literal.md} | 2 +- .../rust/4-borrowing-slices/{10-str.md => 4-3-str-param.md} | 2 +- .../docs/rust/4-borrowing-slices/{11.md => 5-0-other-slices.md} | 2 +- public/docs/rust/4-borrowing-slices/{12.md => 6-0-summary.md} | 2 +- public/docs/rust/4-borrowing-slices/{13.md => 7-0-practice1.md} | 2 +- public/docs/rust/4-borrowing-slices/{14.md => 7-1-practice2.md} | 2 +- public/docs/rust/5-structs-methods/{0.md => 1-0-struct-def.md} | 2 +- public/docs/rust/5-structs-methods/{1.md => 1-1-basic-def.md} | 2 +- .../rust/5-structs-methods/{2.md => 1-2-field-shorthand.md} | 2 +- .../docs/rust/5-structs-methods/{3.md => 1-3-struct-update.md} | 2 +- .../rust/5-structs-methods/{4.md => 2-0-tuple-unit-structs.md} | 2 +- .../{5-tuple-structs.md => 2-1-tuple-structs.md} | 2 +- .../{6-unit-like-structs.md => 2-2-unit-structs.md} | 2 +- .../rust/5-structs-methods/{7.md => 3-0-ownership-structs.md} | 2 +- public/docs/rust/5-structs-methods/{8-impl.md => 4-0-impl.md} | 2 +- public/docs/rust/5-structs-methods/{9.md => 4-1-methods.md} | 2 +- .../{10-associated-functions.md => 4-2-assoc-funcs.md} | 2 +- public/docs/rust/5-structs-methods/{11.md => 5-0-summary.md} | 2 +- .../rust/5-structs-methods/{12-1-rpg.md => 5-1-practice1.md} | 2 +- public/docs/rust/5-structs-methods/{13.md => 5-2-practice2.md} | 2 +- public/docs/rust/6-enums-pattern/{0-enum.md => 1-0-enum-def.md} | 2 +- .../docs/rust/6-enums-pattern/{1.md => 1-1-enum-vs-struct.md} | 2 +- public/docs/rust/6-enums-pattern/{2.md => 1-2-enum-data.md} | 2 +- .../rust/6-enums-pattern/{3-optiont-null.md => 2-0-option.md} | 2 +- public/docs/rust/6-enums-pattern/{4.md => 2-1-why-safe.md} | 2 +- public/docs/rust/6-enums-pattern/{5-match.md => 3-0-match.md} | 2 +- public/docs/rust/6-enums-pattern/{6.md => 3-1-exhaustive.md} | 2 +- .../6-enums-pattern/{7-optiont-match.md => 3-2-option-match.md} | 2 +- public/docs/rust/6-enums-pattern/{8.md => 3-3-placeholder.md} | 2 +- public/docs/rust/6-enums-pattern/{9-if-let.md => 4-0-if-let.md} | 2 +- public/docs/rust/6-enums-pattern/{10.md => 5-0-summary.md} | 2 +- public/docs/rust/6-enums-pattern/{11.md => 5-1-practice1.md} | 2 +- public/docs/rust/6-enums-pattern/{12.md => 5-2-practice2.md} | 2 +- public/docs/rust/7-modules/{0.md => 1-0-pkg-crate-module.md} | 2 +- public/docs/rust/7-modules/{1-mod.md => 1-1-mod-def.md} | 2 +- public/docs/rust/7-modules/{2-pub.md => 2-0-visibility.md} | 2 +- public/docs/rust/7-modules/{3.md => 2-1-struct-visibility.md} | 2 +- public/docs/rust/7-modules/{4-use.md => 3-0-use-paths.md} | 2 +- public/docs/rust/7-modules/{5.md => 3-1-abs-rel-paths.md} | 2 +- public/docs/rust/7-modules/{6.md => 4-0-file-split.md} | 2 +- public/docs/rust/7-modules/{7.md => 5-0-external-crates.md} | 2 +- public/docs/rust/7-modules/{8-cargotoml.md => 5-1-cargotoml.md} | 2 +- public/docs/rust/7-modules/{9.md => 5-2-usage.md} | 2 +- public/docs/rust/7-modules/{10.md => 6-0-summary.md} | 2 +- public/docs/rust/7-modules/{11.md => 6-1-practice1.md} | 2 +- public/docs/rust/7-modules/{12.md => 6-2-practice2.md} | 2 +- .../docs/rust/8-collections-strings/{0-vect.md => 1-0-vec.md} | 2 +- .../docs/rust/8-collections-strings/{1.md => 1-1-vec-create.md} | 2 +- .../docs/rust/8-collections-strings/{2.md => 1-2-vec-access.md} | 2 +- .../{3-string-utf-8.md => 2-0-string-utf8.md} | 2 +- .../{4-string-str.md => 2-1-string-str.md} | 2 +- .../docs/rust/8-collections-strings/{5.md => 2-2-string-ops.md} | 2 +- .../rust/8-collections-strings/{6.md => 2-3-no-indexing.md} | 2 +- .../8-collections-strings/{7-hashmapk-v.md => 3-0-hashmap.md} | 2 +- .../rust/8-collections-strings/{8.md => 3-1-hashmap-basic.md} | 2 +- .../docs/rust/8-collections-strings/{9.md => 3-2-ownership.md} | 2 +- .../rust/8-collections-strings/{10-api.md => 3-3-entry-api.md} | 2 +- .../docs/rust/8-collections-strings/{11.md => 4-0-summary.md} | 2 +- .../docs/rust/8-collections-strings/{12.md => 4-1-practice1.md} | 2 +- .../{13-2-pig-latin.md => 4-2-practice2.md} | 2 +- public/docs/rust/9-error-handling/{0.md => 1-0-error-types.md} | 2 +- public/docs/rust/9-error-handling/{1-panic.md => 2-0-panic.md} | 2 +- .../rust/9-error-handling/{2-resultt-e.md => 3-0-result.md} | 2 +- .../rust/9-error-handling/{3-result.md => 3-1-result-basic.md} | 2 +- .../{4-unwrap-expect.md => 4-0-unwrap-expect.md} | 2 +- .../docs/rust/9-error-handling/{5-unwrap.md => 4-1-unwrap.md} | 2 +- .../docs/rust/9-error-handling/{6-expect.md => 4-2-expect.md} | 2 +- public/docs/rust/9-error-handling/{7.md => 5-0-propagation.md} | 2 +- public/docs/rust/9-error-handling/{8.md => 6-0-custom-error.md} | 2 +- public/docs/rust/9-error-handling/{9.md => 7-0-summary.md} | 2 +- public/docs/rust/9-error-handling/{10.md => 7-1-practice1.md} | 2 +- public/docs/rust/9-error-handling/{11.md => 7-2-practice2.md} | 2 +- .../docs/typescript/0-intro/{0-typescript.md => 1-0-about.md} | 2 +- public/docs/typescript/0-intro/{1-typescript.md => 2-0-why.md} | 2 +- public/docs/typescript/0-intro/{2.md => 3-0-setup.md} | 2 +- .../0-intro/{3-typescript.md => 3-1-create-install.md} | 2 +- .../typescript/0-intro/{4-typescript.md => 4-0-first-ts.md} | 2 +- public/docs/typescript/0-intro/{5.md => 4-1-code.md} | 2 +- public/docs/typescript/0-intro/{6.md => 4-2-compile-run.md} | 2 +- .../typescript/0-intro/{7-tsconfigjson.md => 5-0-tsconfig.md} | 2 +- public/docs/typescript/0-intro/{8.md => 5-1-compile-config.md} | 2 +- .../{0-1-type-annotations.md => 1-0-type-annotations.md} | 2 +- public/docs/typescript/1-types/{1.md => 2-0-primitive-types.md} | 2 +- .../1-types/{2-3-type-inference.md => 3-0-type-inference.md} | 2 +- .../1-types/{3-4-any-unknown-never.md => 4-0-special-types.md} | 2 +- public/docs/typescript/1-types/{4-any.md => 4-1-any.md} | 2 +- public/docs/typescript/1-types/{5-unknown.md => 4-2-unknown.md} | 2 +- public/docs/typescript/1-types/{6-never.md => 4-3-never.md} | 2 +- public/docs/typescript/1-types/{7.md => 5-0-array-tuple.md} | 2 +- public/docs/typescript/1-types/{8-array.md => 5-1-array.md} | 2 +- public/docs/typescript/1-types/{9-tuple.md => 5-2-tuple.md} | 2 +- public/docs/typescript/1-types/{10.md => 6-0-summary.md} | 2 +- public/docs/typescript/1-types/{11.md => 6-1-practice1.md} | 2 +- .../typescript/1-types/{12-2-unknown.md => 6-2-practice2.md} | 2 +- .../2-objects-interfaces/{0.md => 1-0-object-types.md} | 2 +- .../2-objects-interfaces/{1-type.md => 2-0-type-alias.md} | 2 +- .../2-objects-interfaces/{2-interface.md => 3-0-interface.md} | 2 +- .../{3-type-vs-interface.md => 4-0-type-vs-interface.md} | 2 +- .../2-objects-interfaces/{4.md => 5-0-optional-props.md} | 2 +- .../2-objects-interfaces/{5-readonly.md => 6-0-readonly.md} | 2 +- .../typescript/2-objects-interfaces/{6.md => 7-0-summary.md} | 2 +- .../typescript/2-objects-interfaces/{7.md => 7-1-practice1.md} | 2 +- .../typescript/2-objects-interfaces/{8.md => 7-2-practice2.md} | 2 +- .../typescript/3-function-types/{0.md => 1-0-params-return.md} | 2 +- .../3-function-types/{1.md => 2-0-optional-default.md} | 2 +- .../docs/typescript/3-function-types/{2.md => 2-1-optional.md} | 2 +- .../docs/typescript/3-function-types/{3.md => 2-2-default.md} | 2 +- .../3-function-types/{4-this.md => 3-0-arrow-this.md} | 2 +- .../typescript/3-function-types/{5.md => 3-1-arrow-type.md} | 2 +- .../typescript/3-function-types/{6-this.md => 3-2-this-type.md} | 2 +- .../docs/typescript/3-function-types/{7.md => 4-0-overload.md} | 2 +- .../{8-rest-parameters.md => 5-0-rest-params.md} | 2 +- .../typescript/3-function-types/{9.md => 6-0-type-alias.md} | 2 +- .../docs/typescript/3-function-types/{10.md => 7-0-summary.md} | 2 +- .../typescript/3-function-types/{11.md => 7-1-practice1.md} | 2 +- .../typescript/3-function-types/{12.md => 7-2-practice2.md} | 2 +- .../typescript/4-combining-types/{0-union.md => 1-0-union.md} | 2 +- .../4-combining-types/{1-literal.md => 2-0-literal.md} | 2 +- .../{2-intersection.md => 3-0-intersection.md} | 2 +- .../{3-null-undefined.md => 4-0-null-undefined.md} | 2 +- .../4-combining-types/{4-type-guards.md => 5-0-type-guards.md} | 2 +- .../typescript/4-combining-types/{5-typeof.md => 5-1-typeof.md} | 2 +- public/docs/typescript/4-combining-types/{6.md => 5-2-in.md} | 2 +- .../4-combining-types/{7-instanceof.md => 5-3-instanceof.md} | 2 +- .../{8-type-assertions.md => 6-0-type-assertions.md} | 2 +- .../docs/typescript/4-combining-types/{9.md => 7-0-summary.md} | 2 +- .../typescript/4-combining-types/{10.md => 7-1-practice1.md} | 2 +- .../typescript/4-combining-types/{11.md => 7-2-practice2.md} | 2 +- .../5-generics/{0-generics.md => 1-0-generics-intro.md} | 2 +- .../5-generics/{1-generics.md => 2-0-generics-func.md} | 2 +- .../5-generics/{2-generics.md => 3-0-generics-interface.md} | 2 +- .../5-generics/{3-generics.md => 4-0-generics-class.md} | 2 +- .../{4-extends-generics.md => 5-0-type-constraint.md} | 2 +- public/docs/typescript/5-generics/{5.md => 6-0-summary.md} | 2 +- public/docs/typescript/5-generics/{6.md => 6-1-practice1.md} | 2 +- public/docs/typescript/5-generics/{7.md => 6-2-practice2.md} | 2 +- .../{0-js-constructor-extends.md => 1-0-js-class-review.md} | 2 +- .../typescript/6-classes/{1-typescript.md => 2-0-ts-class.md} | 2 +- .../{2-public-private-protected.md => 3-0-access-modifiers.md} | 2 +- public/docs/typescript/6-classes/{3.md => 3-1-param-props.md} | 2 +- .../typescript/6-classes/{4-readonly.md => 4-0-readonly.md} | 2 +- .../typescript/6-classes/{5-implements.md => 5-0-implements.md} | 2 +- .../typescript/6-classes/{6-abstract.md => 6-0-abstract.md} | 2 +- public/docs/typescript/6-classes/{7.md => 7-0-summary.md} | 2 +- public/docs/typescript/6-classes/{8.md => 7-1-practice1.md} | 2 +- public/docs/typescript/6-classes/{9.md => 7-2-practice2.md} | 2 +- .../{0-promise-asyncawait.md => 1-0-async-types.md} | 2 +- .../typescript/7-async-utilities/{1.md => 1-1-basic-def.md} | 2 +- .../7-async-utilities/{2.md => 1-2-error-handling.md} | 2 +- .../{3-utility-types.md => 2-0-utility-types.md} | 2 +- .../typescript/7-async-utilities/{4.md => 2-1-base-types.md} | 2 +- .../7-async-utilities/{5-partialt.md => 2-2-partial.md} | 2 +- .../7-async-utilities/{6-readonlyt.md => 2-3-readonly.md} | 2 +- .../typescript/7-async-utilities/{7-pickt-k.md => 2-4-pick.md} | 2 +- .../typescript/7-async-utilities/{8-omitt-k.md => 2-5-omit.md} | 2 +- .../7-async-utilities/{9.md => 3-0-advanced-types.md} | 2 +- .../{10-mapped-types.md => 3-1-mapped-types.md} | 2 +- .../{11-conditional-types.md => 3-2-conditional-types.md} | 2 +- .../docs/typescript/7-async-utilities/{12.md => 4-0-summary.md} | 2 +- .../typescript/7-async-utilities/{13.md => 4-1-practice1.md} | 2 +- .../typescript/7-async-utilities/{14.md => 4-2-practice2.md} | 2 +- 240 files changed, 240 insertions(+), 240 deletions(-) rename public/docs/rust/0-intro/{0-rust.md => 1-0-features.md} (90%) rename public/docs/rust/0-intro/{1-memory-safety.md => 1-1-memory-safety.md} (94%) rename public/docs/rust/0-intro/{2-zero-cost-abstractions.md => 1-2-zero-cost.md} (92%) rename public/docs/rust/0-intro/{3-fearless-concurrency.md => 1-3-concurrency.md} (92%) rename public/docs/rust/0-intro/{4.md => 2-0-setup.md} (90%) rename public/docs/rust/0-intro/{5-rustup.md => 2-1-rustup.md} (96%) rename public/docs/rust/0-intro/{6-hello-world-rustc.md => 3-0-hello-world.md} (95%) rename public/docs/rust/0-intro/{7.md => 3-1-points.md} (95%) rename public/docs/rust/0-intro/{8-cargorust.md => 4-0-cargo.md} (95%) rename public/docs/rust/0-intro/{9-cargo-new.md => 4-1-cargo-new.md} (95%) rename public/docs/rust/0-intro/{10-cargo.md => 4-2-cargo-commands.md} (97%) rename public/docs/rust/0-intro/{11.md => 5-0-fmt-lint.md} (91%) rename public/docs/rust/0-intro/{12-rustfmt.md => 5-1-rustfmt.md} (92%) rename public/docs/rust/0-intro/{13-clippy.md => 5-2-clippy.md} (94%) rename public/docs/rust/1-basics/{0-let-vs-let-mut.md => 1-0-let-mut.md} (90%) rename public/docs/rust/1-basics/{1-immutable.md => 1-1-immutable.md} (96%) rename public/docs/rust/1-basics/{2-mutable.md => 1-2-mutable.md} (97%) rename public/docs/rust/1-basics/{3-shadowing.md => 2-0-shadowing.md} (98%) rename public/docs/rust/1-basics/{4.md => 3-0-data-types.md} (91%) rename public/docs/rust/1-basics/{5.md => 3-1-scalar.md} (96%) rename public/docs/rust/1-basics/{6.md => 3-2-compound.md} (98%) rename public/docs/rust/1-basics/{7.md => 4-0-summary.md} (97%) rename public/docs/rust/1-basics/{8.md => 4-1-practice1.md} (96%) rename public/docs/rust/1-basics/{9.md => 4-2-practice2.md} (95%) rename public/docs/rust/10-generics-traits/{0-rust.md => 1-0-rust-approach.md} (97%) rename public/docs/rust/10-generics-traits/{1.md => 2-0-generics.md} (90%) rename public/docs/rust/10-generics-traits/{2.md => 2-1-generic-func.md} (95%) rename public/docs/rust/10-generics-traits/{3.md => 2-2-generic-struct.md} (95%) rename public/docs/rust/10-generics-traits/{4.md => 3-0-traits.md} (89%) rename public/docs/rust/10-generics-traits/{5.md => 3-1-trait-def.md} (90%) rename public/docs/rust/10-generics-traits/{6.md => 3-2-trait-impl.md} (97%) rename public/docs/rust/10-generics-traits/{7-trait-bounds.md => 4-0-trait-bounds.md} (90%) rename public/docs/rust/10-generics-traits/{8.md => 4-1-basic-syntax.md} (92%) rename public/docs/rust/10-generics-traits/{9-where.md => 4-2-where-clause.md} (97%) rename public/docs/rust/10-generics-traits/{10.md => 5-0-std-traits.md} (98%) rename public/docs/rust/10-generics-traits/{11.md => 5-1-practice1.md} (95%) rename public/docs/rust/10-generics-traits/{12.md => 5-2-practice2.md} (96%) rename public/docs/rust/11-lifetimes/{0.md => 1-0-what-is-lifetime.md} (94%) rename public/docs/rust/11-lifetimes/{1.md => 1-1-dangling-ref.md} (97%) rename public/docs/rust/11-lifetimes/{2.md => 2-0-func-lifetime.md} (97%) rename public/docs/rust/11-lifetimes/{3.md => 2-1-lifetime-syntax.md} (98%) rename public/docs/rust/11-lifetimes/{4.md => 3-0-elision.md} (98%) rename public/docs/rust/11-lifetimes/{5.md => 4-0-struct-lifetime.md} (97%) rename public/docs/rust/11-lifetimes/{6-static.md => 5-0-static-lifetime.md} (96%) rename public/docs/rust/11-lifetimes/{7.md => 6-0-summary.md} (97%) rename public/docs/rust/11-lifetimes/{8.md => 6-1-practice1.md} (97%) rename public/docs/rust/11-lifetimes/{9.md => 6-2-practice2.md} (97%) rename public/docs/rust/2-functions-control/{0.md => 1-0-functions-expr.md} (85%) rename public/docs/rust/2-functions-control/{1.md => 1-1-params-return.md} (87%) rename public/docs/rust/2-functions-control/{2-statementexpression.md => 1-2-stmt-expr.md} (97%) rename public/docs/rust/2-functions-control/{3.md => 2-0-control-flow.md} (81%) rename public/docs/rust/2-functions-control/{4.md => 2-1-if.md} (96%) rename public/docs/rust/2-functions-control/{5.md => 2-2-loops.md} (98%) rename public/docs/rust/2-functions-control/{6.md => 3-0-summary.md} (93%) rename public/docs/rust/2-functions-control/{7.md => 4-0-practice1.md} (93%) rename public/docs/rust/2-functions-control/{8.md => 4-1-practice2.md} (94%) rename public/docs/rust/3-ownership/{0.md => 1-0-stack-heap.md} (94%) rename public/docs/rust/3-ownership/{1-stack.md => 1-1-stack.md} (93%) rename public/docs/rust/3-ownership/{2-heap.md => 1-2-heap.md} (96%) rename public/docs/rust/3-ownership/{3.md => 2-0-ownership-rules.md} (93%) rename public/docs/rust/3-ownership/{4.md => 2-1-scope.md} (96%) rename public/docs/rust/3-ownership/{5-move-vs-copy.md => 3-0-move-copy.md} (87%) rename public/docs/rust/3-ownership/{6-copy.md => 3-1-copy.md} (94%) rename public/docs/rust/3-ownership/{7-move.md => 3-2-move.md} (98%) rename public/docs/rust/3-ownership/{8-clone.md => 3-3-clone.md} (94%) rename public/docs/rust/3-ownership/{9.md => 4-0-ownership-func.md} (97%) rename public/docs/rust/3-ownership/{10.md => 4-1-return-ownership.md} (96%) rename public/docs/rust/3-ownership/{11.md => 5-0-summary.md} (98%) rename public/docs/rust/3-ownership/{12.md => 5-1-practice1.md} (95%) rename public/docs/rust/3-ownership/{13.md => 5-2-practice2.md} (97%) rename public/docs/rust/4-borrowing-slices/{0-1-mut.md => 1-0-ref-borrow.md} (94%) rename public/docs/rust/4-borrowing-slices/{1-immutable-reference.md => 1-1-immutable-ref.md} (95%) rename public/docs/rust/4-borrowing-slices/{2-mutable-reference.md => 1-2-mutable-ref.md} (92%) rename public/docs/rust/4-borrowing-slices/{3.md => 2-0-borrow-rules.md} (93%) rename public/docs/rust/4-borrowing-slices/{4.md => 2-1-single-mut-ref.md} (91%) rename public/docs/rust/4-borrowing-slices/{5.md => 2-2-no-mixed-refs.md} (97%) rename public/docs/rust/4-borrowing-slices/{6.md => 3-0-dangling-ptr.md} (96%) rename public/docs/rust/4-borrowing-slices/{7-4-slice.md => 4-0-slice.md} (90%) rename public/docs/rust/4-borrowing-slices/{8-str.md => 4-1-str-slice.md} (96%) rename public/docs/rust/4-borrowing-slices/{9.md => 4-2-str-literal.md} (92%) rename public/docs/rust/4-borrowing-slices/{10-str.md => 4-3-str-param.md} (92%) rename public/docs/rust/4-borrowing-slices/{11.md => 5-0-other-slices.md} (93%) rename public/docs/rust/4-borrowing-slices/{12.md => 6-0-summary.md} (96%) rename public/docs/rust/4-borrowing-slices/{13.md => 7-0-practice1.md} (96%) rename public/docs/rust/4-borrowing-slices/{14.md => 7-1-practice2.md} (97%) rename public/docs/rust/5-structs-methods/{0.md => 1-0-struct-def.md} (86%) rename public/docs/rust/5-structs-methods/{1.md => 1-1-basic-def.md} (96%) rename public/docs/rust/5-structs-methods/{2.md => 1-2-field-shorthand.md} (92%) rename public/docs/rust/5-structs-methods/{3.md => 1-3-struct-update.md} (92%) rename public/docs/rust/5-structs-methods/{4.md => 2-0-tuple-unit-structs.md} (81%) rename public/docs/rust/5-structs-methods/{5-tuple-structs.md => 2-1-tuple-structs.md} (95%) rename public/docs/rust/5-structs-methods/{6-unit-like-structs.md => 2-2-unit-structs.md} (89%) rename public/docs/rust/5-structs-methods/{7.md => 3-0-ownership-structs.md} (96%) rename public/docs/rust/5-structs-methods/{8-impl.md => 4-0-impl.md} (91%) rename public/docs/rust/5-structs-methods/{9.md => 4-1-methods.md} (97%) rename public/docs/rust/5-structs-methods/{10-associated-functions.md => 4-2-assoc-funcs.md} (96%) rename public/docs/rust/5-structs-methods/{11.md => 5-0-summary.md} (96%) rename public/docs/rust/5-structs-methods/{12-1-rpg.md => 5-1-practice1.md} (97%) rename public/docs/rust/5-structs-methods/{13.md => 5-2-practice2.md} (96%) rename public/docs/rust/6-enums-pattern/{0-enum.md => 1-0-enum-def.md} (96%) rename public/docs/rust/6-enums-pattern/{1.md => 1-1-enum-vs-struct.md} (92%) rename public/docs/rust/6-enums-pattern/{2.md => 1-2-enum-data.md} (97%) rename public/docs/rust/6-enums-pattern/{3-optiont-null.md => 2-0-option.md} (94%) rename public/docs/rust/6-enums-pattern/{4.md => 2-1-why-safe.md} (97%) rename public/docs/rust/6-enums-pattern/{5-match.md => 3-0-match.md} (91%) rename public/docs/rust/6-enums-pattern/{6.md => 3-1-exhaustive.md} (97%) rename public/docs/rust/6-enums-pattern/{7-optiont-match.md => 3-2-option-match.md} (93%) rename public/docs/rust/6-enums-pattern/{8.md => 3-3-placeholder.md} (93%) rename public/docs/rust/6-enums-pattern/{9-if-let.md => 4-0-if-let.md} (97%) rename public/docs/rust/6-enums-pattern/{10.md => 5-0-summary.md} (95%) rename public/docs/rust/6-enums-pattern/{11.md => 5-1-practice1.md} (97%) rename public/docs/rust/6-enums-pattern/{12.md => 5-2-practice2.md} (97%) rename public/docs/rust/7-modules/{0.md => 1-0-pkg-crate-module.md} (96%) rename public/docs/rust/7-modules/{1-mod.md => 1-1-mod-def.md} (98%) rename public/docs/rust/7-modules/{2-pub.md => 2-0-visibility.md} (98%) rename public/docs/rust/7-modules/{3.md => 2-1-struct-visibility.md} (97%) rename public/docs/rust/7-modules/{4-use.md => 3-0-use-paths.md} (94%) rename public/docs/rust/7-modules/{5.md => 3-1-abs-rel-paths.md} (97%) rename public/docs/rust/7-modules/{6.md => 4-0-file-split.md} (98%) rename public/docs/rust/7-modules/{7.md => 5-0-external-crates.md} (87%) rename public/docs/rust/7-modules/{8-cargotoml.md => 5-1-cargotoml.md} (91%) rename public/docs/rust/7-modules/{9.md => 5-2-usage.md} (97%) rename public/docs/rust/7-modules/{10.md => 6-0-summary.md} (97%) rename public/docs/rust/7-modules/{11.md => 6-1-practice1.md} (97%) rename public/docs/rust/7-modules/{12.md => 6-2-practice2.md} (96%) rename public/docs/rust/8-collections-strings/{0-vect.md => 1-0-vec.md} (89%) rename public/docs/rust/8-collections-strings/{1.md => 1-1-vec-create.md} (96%) rename public/docs/rust/8-collections-strings/{2.md => 1-2-vec-access.md} (97%) rename public/docs/rust/8-collections-strings/{3-string-utf-8.md => 2-0-string-utf8.md} (88%) rename public/docs/rust/8-collections-strings/{4-string-str.md => 2-1-string-str.md} (89%) rename public/docs/rust/8-collections-strings/{5.md => 2-2-string-ops.md} (96%) rename public/docs/rust/8-collections-strings/{6.md => 2-3-no-indexing.md} (97%) rename public/docs/rust/8-collections-strings/{7-hashmapk-v.md => 3-0-hashmap.md} (90%) rename public/docs/rust/8-collections-strings/{8.md => 3-1-hashmap-basic.md} (94%) rename public/docs/rust/8-collections-strings/{9.md => 3-2-ownership.md} (90%) rename public/docs/rust/8-collections-strings/{10-api.md => 3-3-entry-api.md} (97%) rename public/docs/rust/8-collections-strings/{11.md => 4-0-summary.md} (94%) rename public/docs/rust/8-collections-strings/{12.md => 4-1-practice1.md} (94%) rename public/docs/rust/8-collections-strings/{13-2-pig-latin.md => 4-2-practice2.md} (95%) rename public/docs/rust/9-error-handling/{0.md => 1-0-error-types.md} (94%) rename public/docs/rust/9-error-handling/{1-panic.md => 2-0-panic.md} (97%) rename public/docs/rust/9-error-handling/{2-resultt-e.md => 3-0-result.md} (94%) rename public/docs/rust/9-error-handling/{3-result.md => 3-1-result-basic.md} (97%) rename public/docs/rust/9-error-handling/{4-unwrap-expect.md => 4-0-unwrap-expect.md} (90%) rename public/docs/rust/9-error-handling/{5-unwrap.md => 4-1-unwrap.md} (87%) rename public/docs/rust/9-error-handling/{6-expect.md => 4-2-expect.md} (97%) rename public/docs/rust/9-error-handling/{7.md => 5-0-propagation.md} (98%) rename public/docs/rust/9-error-handling/{8.md => 6-0-custom-error.md} (98%) rename public/docs/rust/9-error-handling/{9.md => 7-0-summary.md} (95%) rename public/docs/rust/9-error-handling/{10.md => 7-1-practice1.md} (96%) rename public/docs/rust/9-error-handling/{11.md => 7-2-practice2.md} (97%) rename public/docs/typescript/0-intro/{0-typescript.md => 1-0-about.md} (96%) rename public/docs/typescript/0-intro/{1-typescript.md => 2-0-why.md} (96%) rename public/docs/typescript/0-intro/{2.md => 3-0-setup.md} (83%) rename public/docs/typescript/0-intro/{3-typescript.md => 3-1-create-install.md} (96%) rename public/docs/typescript/0-intro/{4-typescript.md => 4-0-first-ts.md} (80%) rename public/docs/typescript/0-intro/{5.md => 4-1-code.md} (95%) rename public/docs/typescript/0-intro/{6.md => 4-2-compile-run.md} (97%) rename public/docs/typescript/0-intro/{7-tsconfigjson.md => 5-0-tsconfig.md} (97%) rename public/docs/typescript/0-intro/{8.md => 5-1-compile-config.md} (94%) rename public/docs/typescript/1-types/{0-1-type-annotations.md => 1-0-type-annotations.md} (96%) rename public/docs/typescript/1-types/{1.md => 2-0-primitive-types.md} (96%) rename public/docs/typescript/1-types/{2-3-type-inference.md => 3-0-type-inference.md} (96%) rename public/docs/typescript/1-types/{3-4-any-unknown-never.md => 4-0-special-types.md} (87%) rename public/docs/typescript/1-types/{4-any.md => 4-1-any.md} (92%) rename public/docs/typescript/1-types/{5-unknown.md => 4-2-unknown.md} (93%) rename public/docs/typescript/1-types/{6-never.md => 4-3-never.md} (97%) rename public/docs/typescript/1-types/{7.md => 5-0-array-tuple.md} (80%) rename public/docs/typescript/1-types/{8-array.md => 5-1-array.md} (87%) rename public/docs/typescript/1-types/{9-tuple.md => 5-2-tuple.md} (97%) rename public/docs/typescript/1-types/{10.md => 6-0-summary.md} (96%) rename public/docs/typescript/1-types/{11.md => 6-1-practice1.md} (95%) rename public/docs/typescript/1-types/{12-2-unknown.md => 6-2-practice2.md} (95%) rename public/docs/typescript/2-objects-interfaces/{0.md => 1-0-object-types.md} (95%) rename public/docs/typescript/2-objects-interfaces/{1-type.md => 2-0-type-alias.md} (95%) rename public/docs/typescript/2-objects-interfaces/{2-interface.md => 3-0-interface.md} (95%) rename public/docs/typescript/2-objects-interfaces/{3-type-vs-interface.md => 4-0-type-vs-interface.md} (96%) rename public/docs/typescript/2-objects-interfaces/{4.md => 5-0-optional-props.md} (95%) rename public/docs/typescript/2-objects-interfaces/{5-readonly.md => 6-0-readonly.md} (96%) rename public/docs/typescript/2-objects-interfaces/{6.md => 7-0-summary.md} (93%) rename public/docs/typescript/2-objects-interfaces/{7.md => 7-1-practice1.md} (93%) rename public/docs/typescript/2-objects-interfaces/{8.md => 7-2-practice2.md} (93%) rename public/docs/typescript/3-function-types/{0.md => 1-0-params-return.md} (96%) rename public/docs/typescript/3-function-types/{1.md => 2-0-optional-default.md} (88%) rename public/docs/typescript/3-function-types/{2.md => 2-1-optional.md} (90%) rename public/docs/typescript/3-function-types/{3.md => 2-2-default.md} (96%) rename public/docs/typescript/3-function-types/{4-this.md => 3-0-arrow-this.md} (65%) rename public/docs/typescript/3-function-types/{5.md => 3-1-arrow-type.md} (92%) rename public/docs/typescript/3-function-types/{6-this.md => 3-2-this-type.md} (95%) rename public/docs/typescript/3-function-types/{7.md => 4-0-overload.md} (97%) rename public/docs/typescript/3-function-types/{8-rest-parameters.md => 5-0-rest-params.md} (94%) rename public/docs/typescript/3-function-types/{9.md => 6-0-type-alias.md} (95%) rename public/docs/typescript/3-function-types/{10.md => 7-0-summary.md} (94%) rename public/docs/typescript/3-function-types/{11.md => 7-1-practice1.md} (94%) rename public/docs/typescript/3-function-types/{12.md => 7-2-practice2.md} (94%) rename public/docs/typescript/4-combining-types/{0-union.md => 1-0-union.md} (96%) rename public/docs/typescript/4-combining-types/{1-literal.md => 2-0-literal.md} (96%) rename public/docs/typescript/4-combining-types/{2-intersection.md => 3-0-intersection.md} (96%) rename public/docs/typescript/4-combining-types/{3-null-undefined.md => 4-0-null-undefined.md} (95%) rename public/docs/typescript/4-combining-types/{4-type-guards.md => 5-0-type-guards.md} (92%) rename public/docs/typescript/4-combining-types/{5-typeof.md => 5-1-typeof.md} (94%) rename public/docs/typescript/4-combining-types/{6.md => 5-2-in.md} (94%) rename public/docs/typescript/4-combining-types/{7-instanceof.md => 5-3-instanceof.md} (91%) rename public/docs/typescript/4-combining-types/{8-type-assertions.md => 6-0-type-assertions.md} (96%) rename public/docs/typescript/4-combining-types/{9.md => 7-0-summary.md} (95%) rename public/docs/typescript/4-combining-types/{10.md => 7-1-practice1.md} (95%) rename public/docs/typescript/4-combining-types/{11.md => 7-2-practice2.md} (95%) rename public/docs/typescript/5-generics/{0-generics.md => 1-0-generics-intro.md} (96%) rename public/docs/typescript/5-generics/{1-generics.md => 2-0-generics-func.md} (96%) rename public/docs/typescript/5-generics/{2-generics.md => 3-0-generics-interface.md} (96%) rename public/docs/typescript/5-generics/{3-generics.md => 4-0-generics-class.md} (97%) rename public/docs/typescript/5-generics/{4-extends-generics.md => 5-0-type-constraint.md} (98%) rename public/docs/typescript/5-generics/{5.md => 6-0-summary.md} (95%) rename public/docs/typescript/5-generics/{6.md => 6-1-practice1.md} (96%) rename public/docs/typescript/5-generics/{7.md => 6-2-practice2.md} (96%) rename public/docs/typescript/6-classes/{0-js-constructor-extends.md => 1-0-js-class-review.md} (97%) rename public/docs/typescript/6-classes/{1-typescript.md => 2-0-ts-class.md} (97%) rename public/docs/typescript/6-classes/{2-public-private-protected.md => 3-0-access-modifiers.md} (93%) rename public/docs/typescript/6-classes/{3.md => 3-1-param-props.md} (98%) rename public/docs/typescript/6-classes/{4-readonly.md => 4-0-readonly.md} (96%) rename public/docs/typescript/6-classes/{5-implements.md => 5-0-implements.md} (97%) rename public/docs/typescript/6-classes/{6-abstract.md => 6-0-abstract.md} (97%) rename public/docs/typescript/6-classes/{7.md => 7-0-summary.md} (96%) rename public/docs/typescript/6-classes/{8.md => 7-1-practice1.md} (96%) rename public/docs/typescript/6-classes/{9.md => 7-2-practice2.md} (95%) rename public/docs/typescript/7-async-utilities/{0-promise-asyncawait.md => 1-0-async-types.md} (88%) rename public/docs/typescript/7-async-utilities/{1.md => 1-1-basic-def.md} (96%) rename public/docs/typescript/7-async-utilities/{2.md => 1-2-error-handling.md} (87%) rename public/docs/typescript/7-async-utilities/{3-utility-types.md => 2-0-utility-types.md} (92%) rename public/docs/typescript/7-async-utilities/{4.md => 2-1-base-types.md} (84%) rename public/docs/typescript/7-async-utilities/{5-partialt.md => 2-2-partial.md} (96%) rename public/docs/typescript/7-async-utilities/{6-readonlyt.md => 2-3-readonly.md} (95%) rename public/docs/typescript/7-async-utilities/{7-pickt-k.md => 2-4-pick.md} (95%) rename public/docs/typescript/7-async-utilities/{8-omitt-k.md => 2-5-omit.md} (95%) rename public/docs/typescript/7-async-utilities/{9.md => 3-0-advanced-types.md} (88%) rename public/docs/typescript/7-async-utilities/{10-mapped-types.md => 3-1-mapped-types.md} (91%) rename public/docs/typescript/7-async-utilities/{11-conditional-types.md => 3-2-conditional-types.md} (91%) rename public/docs/typescript/7-async-utilities/{12.md => 4-0-summary.md} (95%) rename public/docs/typescript/7-async-utilities/{13.md => 4-1-practice1.md} (94%) rename public/docs/typescript/7-async-utilities/{14.md => 4-2-practice2.md} (95%) diff --git a/public/docs/rust/0-intro/0-rust.md b/public/docs/rust/0-intro/1-0-features.md similarity index 90% rename from public/docs/rust/0-intro/0-rust.md rename to public/docs/rust/0-intro/1-0-features.md index cd96e40..cdc292e 100644 --- a/public/docs/rust/0-intro/0-rust.md +++ b/public/docs/rust/0-intro/1-0-features.md @@ -1,5 +1,5 @@ --- -id: rust-intro-0-rust +id: rust-intro-features title: Rustの特城なぜ孊ぶのか level: 2 --- diff --git a/public/docs/rust/0-intro/1-memory-safety.md b/public/docs/rust/0-intro/1-1-memory-safety.md similarity index 94% rename from public/docs/rust/0-intro/1-memory-safety.md rename to public/docs/rust/0-intro/1-1-memory-safety.md index 5a91efc..f1cc490 100644 --- a/public/docs/rust/0-intro/1-memory-safety.md +++ b/public/docs/rust/0-intro/1-1-memory-safety.md @@ -1,5 +1,5 @@ --- -id: rust-intro-1-memory-safety +id: rust-intro-memory-safety title: 1. メモリ安党性Memory Safety level: 3 --- diff --git a/public/docs/rust/0-intro/2-zero-cost-abstractions.md b/public/docs/rust/0-intro/1-2-zero-cost.md similarity index 92% rename from public/docs/rust/0-intro/2-zero-cost-abstractions.md rename to public/docs/rust/0-intro/1-2-zero-cost.md index 765f401..02dc55d 100644 --- a/public/docs/rust/0-intro/2-zero-cost-abstractions.md +++ b/public/docs/rust/0-intro/1-2-zero-cost.md @@ -1,5 +1,5 @@ --- -id: rust-intro-2-zero-cost-abstractio +id: rust-intro-zero-cost title: 2. れロコスト抜象化Zero-cost Abstractions level: 3 --- diff --git a/public/docs/rust/0-intro/3-fearless-concurrency.md b/public/docs/rust/0-intro/1-3-concurrency.md similarity index 92% rename from public/docs/rust/0-intro/3-fearless-concurrency.md rename to public/docs/rust/0-intro/1-3-concurrency.md index ea531c3..6df2408 100644 --- a/public/docs/rust/0-intro/3-fearless-concurrency.md +++ b/public/docs/rust/0-intro/1-3-concurrency.md @@ -1,5 +1,5 @@ --- -id: rust-intro-3-fearless-concurrency +id: rust-intro-concurrency title: 3. 安党な䞊行性Fearless Concurrency level: 3 --- diff --git a/public/docs/rust/0-intro/4.md b/public/docs/rust/0-intro/2-0-setup.md similarity index 90% rename from public/docs/rust/0-intro/4.md rename to public/docs/rust/0-intro/2-0-setup.md index 61c4bae..4c0a3e9 100644 --- a/public/docs/rust/0-intro/4.md +++ b/public/docs/rust/0-intro/2-0-setup.md @@ -1,5 +1,5 @@ --- -id: rust-intro-4 +id: rust-intro-setup title: 開発環境の構築 level: 2 --- diff --git a/public/docs/rust/0-intro/5-rustup.md b/public/docs/rust/0-intro/2-1-rustup.md similarity index 96% rename from public/docs/rust/0-intro/5-rustup.md rename to public/docs/rust/0-intro/2-1-rustup.md index e9a1e47..23edef4 100644 --- a/public/docs/rust/0-intro/5-rustup.md +++ b/public/docs/rust/0-intro/2-1-rustup.md @@ -1,5 +1,5 @@ --- -id: rust-intro-5-rustup +id: rust-intro-rustup title: rustup のむンストヌル level: 3 --- diff --git a/public/docs/rust/0-intro/6-hello-world-rustc.md b/public/docs/rust/0-intro/3-0-hello-world.md similarity index 95% rename from public/docs/rust/0-intro/6-hello-world-rustc.md rename to public/docs/rust/0-intro/3-0-hello-world.md index 50cdc24..ed07d23 100644 --- a/public/docs/rust/0-intro/6-hello-world-rustc.md +++ b/public/docs/rust/0-intro/3-0-hello-world.md @@ -1,5 +1,5 @@ --- -id: rust-intro-6-hello-world-rustc +id: rust-intro-hello-world title: Hello World (rustc を盎接䜿う) level: 2 --- diff --git a/public/docs/rust/0-intro/7.md b/public/docs/rust/0-intro/3-1-points.md similarity index 95% rename from public/docs/rust/0-intro/7.md rename to public/docs/rust/0-intro/3-1-points.md index c0b14aa..7fa141c 100644 --- a/public/docs/rust/0-intro/7.md +++ b/public/docs/rust/0-intro/3-1-points.md @@ -1,5 +1,5 @@ --- -id: rust-intro-7 +id: rust-intro-points title: ポむント level: 3 --- diff --git a/public/docs/rust/0-intro/8-cargorust.md b/public/docs/rust/0-intro/4-0-cargo.md similarity index 95% rename from public/docs/rust/0-intro/8-cargorust.md rename to public/docs/rust/0-intro/4-0-cargo.md index 4d8a7bf..b4572cf 100644 --- a/public/docs/rust/0-intro/8-cargorust.md +++ b/public/docs/rust/0-intro/4-0-cargo.md @@ -1,5 +1,5 @@ --- -id: rust-intro-8-cargorust +id: rust-intro-cargo title: CargoRustのビルドシステムずパッケヌゞマネヌゞャ level: 2 --- diff --git a/public/docs/rust/0-intro/9-cargo-new.md b/public/docs/rust/0-intro/4-1-cargo-new.md similarity index 95% rename from public/docs/rust/0-intro/9-cargo-new.md rename to public/docs/rust/0-intro/4-1-cargo-new.md index 97f98f4..da3d758 100644 --- a/public/docs/rust/0-intro/9-cargo-new.md +++ b/public/docs/rust/0-intro/4-1-cargo-new.md @@ -1,5 +1,5 @@ --- -id: rust-intro-9-cargo-new +id: rust-intro-cargo-new title: プロゞェクトの䜜成 (cargo new) level: 3 --- diff --git a/public/docs/rust/0-intro/10-cargo.md b/public/docs/rust/0-intro/4-2-cargo-commands.md similarity index 97% rename from public/docs/rust/0-intro/10-cargo.md rename to public/docs/rust/0-intro/4-2-cargo-commands.md index 8028481..a841c3d 100644 --- a/public/docs/rust/0-intro/10-cargo.md +++ b/public/docs/rust/0-intro/4-2-cargo-commands.md @@ -1,5 +1,5 @@ --- -id: rust-intro-10-cargo +id: rust-intro-cargo-commands title: Cargoの䞻芁コマンド level: 3 --- diff --git a/public/docs/rust/0-intro/11.md b/public/docs/rust/0-intro/5-0-fmt-lint.md similarity index 91% rename from public/docs/rust/0-intro/11.md rename to public/docs/rust/0-intro/5-0-fmt-lint.md index d46480a..3e5e685 100644 --- a/public/docs/rust/0-intro/11.md +++ b/public/docs/rust/0-intro/5-0-fmt-lint.md @@ -1,5 +1,5 @@ --- -id: rust-intro-11 +id: rust-intro-fmt-lint title: フォヌマッタずリンタ level: 2 --- diff --git a/public/docs/rust/0-intro/12-rustfmt.md b/public/docs/rust/0-intro/5-1-rustfmt.md similarity index 92% rename from public/docs/rust/0-intro/12-rustfmt.md rename to public/docs/rust/0-intro/5-1-rustfmt.md index ca718ca..367c70b 100644 --- a/public/docs/rust/0-intro/12-rustfmt.md +++ b/public/docs/rust/0-intro/5-1-rustfmt.md @@ -1,5 +1,5 @@ --- -id: rust-intro-12-rustfmt +id: rust-intro-rustfmt title: rustfmt (コヌドフォヌマッタ) level: 3 --- diff --git a/public/docs/rust/0-intro/13-clippy.md b/public/docs/rust/0-intro/5-2-clippy.md similarity index 94% rename from public/docs/rust/0-intro/13-clippy.md rename to public/docs/rust/0-intro/5-2-clippy.md index f43a339..940ee04 100644 --- a/public/docs/rust/0-intro/13-clippy.md +++ b/public/docs/rust/0-intro/5-2-clippy.md @@ -1,5 +1,5 @@ --- -id: rust-intro-13-clippy +id: rust-intro-clippy title: clippy (リンタ) level: 3 --- diff --git a/public/docs/rust/1-basics/0-let-vs-let-mut.md b/public/docs/rust/1-basics/1-0-let-mut.md similarity index 90% rename from public/docs/rust/1-basics/0-let-vs-let-mut.md rename to public/docs/rust/1-basics/1-0-let-mut.md index a4b706e..5da7763 100644 --- a/public/docs/rust/1-basics/0-let-vs-let-mut.md +++ b/public/docs/rust/1-basics/1-0-let-mut.md @@ -1,5 +1,5 @@ --- -id: rust-basics-0-let-vs-let-mut +id: rust-basics-let-mut title: 倉数ず可倉性let vs let mut level: 2 --- diff --git a/public/docs/rust/1-basics/1-immutable.md b/public/docs/rust/1-basics/1-1-immutable.md similarity index 96% rename from public/docs/rust/1-basics/1-immutable.md rename to public/docs/rust/1-basics/1-1-immutable.md index 974aaa7..663593f 100644 --- a/public/docs/rust/1-basics/1-immutable.md +++ b/public/docs/rust/1-basics/1-1-immutable.md @@ -1,5 +1,5 @@ --- -id: rust-basics-1-immutable +id: rust-basics-immutable title: 䞍倉倉数Immutable level: 3 --- diff --git a/public/docs/rust/1-basics/2-mutable.md b/public/docs/rust/1-basics/1-2-mutable.md similarity index 97% rename from public/docs/rust/1-basics/2-mutable.md rename to public/docs/rust/1-basics/1-2-mutable.md index 9bd8fb3..e8f8321 100644 --- a/public/docs/rust/1-basics/2-mutable.md +++ b/public/docs/rust/1-basics/1-2-mutable.md @@ -1,5 +1,5 @@ --- -id: rust-basics-2-mutable +id: rust-basics-mutable title: 可倉倉数Mutable level: 3 --- diff --git a/public/docs/rust/1-basics/3-shadowing.md b/public/docs/rust/1-basics/2-0-shadowing.md similarity index 98% rename from public/docs/rust/1-basics/3-shadowing.md rename to public/docs/rust/1-basics/2-0-shadowing.md index 4d9d980..cf89412 100644 --- a/public/docs/rust/1-basics/3-shadowing.md +++ b/public/docs/rust/1-basics/2-0-shadowing.md @@ -1,5 +1,5 @@ --- -id: rust-basics-3-shadowing +id: rust-basics-shadowing title: シャドヌむングShadowing level: 2 --- diff --git a/public/docs/rust/1-basics/4.md b/public/docs/rust/1-basics/3-0-data-types.md similarity index 91% rename from public/docs/rust/1-basics/4.md rename to public/docs/rust/1-basics/3-0-data-types.md index 601fe7e..c9dad4f 100644 --- a/public/docs/rust/1-basics/4.md +++ b/public/docs/rust/1-basics/3-0-data-types.md @@ -1,5 +1,5 @@ --- -id: rust-basics-4 +id: rust-basics-data-types title: 基本的なデヌタ型 level: 2 --- diff --git a/public/docs/rust/1-basics/5.md b/public/docs/rust/1-basics/3-1-scalar.md similarity index 96% rename from public/docs/rust/1-basics/5.md rename to public/docs/rust/1-basics/3-1-scalar.md index e9a982e..f33b80a 100644 --- a/public/docs/rust/1-basics/5.md +++ b/public/docs/rust/1-basics/3-1-scalar.md @@ -1,5 +1,5 @@ --- -id: rust-basics-5 +id: rust-basics-scalar title: スカラヌ型単䞀の倀を衚す level: 3 --- diff --git a/public/docs/rust/1-basics/6.md b/public/docs/rust/1-basics/3-2-compound.md similarity index 98% rename from public/docs/rust/1-basics/6.md rename to public/docs/rust/1-basics/3-2-compound.md index ce5f35a..2a6f96f 100644 --- a/public/docs/rust/1-basics/6.md +++ b/public/docs/rust/1-basics/3-2-compound.md @@ -1,5 +1,5 @@ --- -id: rust-basics-6 +id: rust-basics-compound title: 耇合型耇数の倀をたずめる level: 3 --- diff --git a/public/docs/rust/1-basics/7.md b/public/docs/rust/1-basics/4-0-summary.md similarity index 97% rename from public/docs/rust/1-basics/7.md rename to public/docs/rust/1-basics/4-0-summary.md index dd99222..2c21fd9 100644 --- a/public/docs/rust/1-basics/7.md +++ b/public/docs/rust/1-basics/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-basics-7 +id: rust-basics-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/1-basics/8.md b/public/docs/rust/1-basics/4-1-practice1.md similarity index 96% rename from public/docs/rust/1-basics/8.md rename to public/docs/rust/1-basics/4-1-practice1.md index 85aa53a..8d04207 100644 --- a/public/docs/rust/1-basics/8.md +++ b/public/docs/rust/1-basics/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-basics-8 +id: rust-basics-practice1 title: '緎習問題 1: 蚈算ずシャドヌむング' level: 3 --- diff --git a/public/docs/rust/1-basics/9.md b/public/docs/rust/1-basics/4-2-practice2.md similarity index 95% rename from public/docs/rust/1-basics/9.md rename to public/docs/rust/1-basics/4-2-practice2.md index 8c8a642..eb7bfd2 100644 --- a/public/docs/rust/1-basics/9.md +++ b/public/docs/rust/1-basics/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-basics-9 +id: rust-basics-practice2 title: '緎習問題 2: 配列ずタプルの操䜜' level: 3 --- diff --git a/public/docs/rust/10-generics-traits/0-rust.md b/public/docs/rust/10-generics-traits/1-0-rust-approach.md similarity index 97% rename from public/docs/rust/10-generics-traits/0-rust.md rename to public/docs/rust/10-generics-traits/1-0-rust-approach.md index 3ddc0c2..96cf030 100644 --- a/public/docs/rust/10-generics-traits/0-rust.md +++ b/public/docs/rust/10-generics-traits/1-0-rust-approach.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-0-rust +id: rust-generics-traits-rust-approach title: 他蚀語ずの違いRustのアプロヌチ level: 2 --- diff --git a/public/docs/rust/10-generics-traits/1.md b/public/docs/rust/10-generics-traits/2-0-generics.md similarity index 90% rename from public/docs/rust/10-generics-traits/1.md rename to public/docs/rust/10-generics-traits/2-0-generics.md index 2e55da2..3447065 100644 --- a/public/docs/rust/10-generics-traits/1.md +++ b/public/docs/rust/10-generics-traits/2-0-generics.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-1 +id: rust-generics-traits-generics title: ゞェネリックなデヌタ型ず関数 level: 2 --- diff --git a/public/docs/rust/10-generics-traits/2.md b/public/docs/rust/10-generics-traits/2-1-generic-func.md similarity index 95% rename from public/docs/rust/10-generics-traits/2.md rename to public/docs/rust/10-generics-traits/2-1-generic-func.md index 3d06638..caa2434 100644 --- a/public/docs/rust/10-generics-traits/2.md +++ b/public/docs/rust/10-generics-traits/2-1-generic-func.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-2 +id: rust-generics-traits-generic-func title: ゞェネリックな関数 level: 3 --- diff --git a/public/docs/rust/10-generics-traits/3.md b/public/docs/rust/10-generics-traits/2-2-generic-struct.md similarity index 95% rename from public/docs/rust/10-generics-traits/3.md rename to public/docs/rust/10-generics-traits/2-2-generic-struct.md index 87376ca..4db2995 100644 --- a/public/docs/rust/10-generics-traits/3.md +++ b/public/docs/rust/10-generics-traits/2-2-generic-struct.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-3 +id: rust-generics-traits-generic-struct title: ゞェネリックな構造䜓 level: 3 --- diff --git a/public/docs/rust/10-generics-traits/4.md b/public/docs/rust/10-generics-traits/3-0-traits.md similarity index 89% rename from public/docs/rust/10-generics-traits/4.md rename to public/docs/rust/10-generics-traits/3-0-traits.md index e9c8702..3e8920a 100644 --- a/public/docs/rust/10-generics-traits/4.md +++ b/public/docs/rust/10-generics-traits/3-0-traits.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-4 +id: rust-generics-traits-traits title: トレむトの定矩ず実装 level: 2 --- diff --git a/public/docs/rust/10-generics-traits/5.md b/public/docs/rust/10-generics-traits/3-1-trait-def.md similarity index 90% rename from public/docs/rust/10-generics-traits/5.md rename to public/docs/rust/10-generics-traits/3-1-trait-def.md index df03863..a85332e 100644 --- a/public/docs/rust/10-generics-traits/5.md +++ b/public/docs/rust/10-generics-traits/3-1-trait-def.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-5 +id: rust-generics-traits-trait-def title: トレむトの定矩 level: 3 --- diff --git a/public/docs/rust/10-generics-traits/6.md b/public/docs/rust/10-generics-traits/3-2-trait-impl.md similarity index 97% rename from public/docs/rust/10-generics-traits/6.md rename to public/docs/rust/10-generics-traits/3-2-trait-impl.md index 10321b9..8118a79 100644 --- a/public/docs/rust/10-generics-traits/6.md +++ b/public/docs/rust/10-generics-traits/3-2-trait-impl.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-6 +id: rust-generics-traits-trait-impl title: トレむトの実装 level: 3 --- diff --git a/public/docs/rust/10-generics-traits/7-trait-bounds.md b/public/docs/rust/10-generics-traits/4-0-trait-bounds.md similarity index 90% rename from public/docs/rust/10-generics-traits/7-trait-bounds.md rename to public/docs/rust/10-generics-traits/4-0-trait-bounds.md index d4a0b96..ec9c740 100644 --- a/public/docs/rust/10-generics-traits/7-trait-bounds.md +++ b/public/docs/rust/10-generics-traits/4-0-trait-bounds.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-7-trait-bounds +id: rust-generics-traits-trait-bounds title: トレむト境界Trait Bounds level: 2 --- diff --git a/public/docs/rust/10-generics-traits/8.md b/public/docs/rust/10-generics-traits/4-1-basic-syntax.md similarity index 92% rename from public/docs/rust/10-generics-traits/8.md rename to public/docs/rust/10-generics-traits/4-1-basic-syntax.md index 8d5a9c7..60cdb2f 100644 --- a/public/docs/rust/10-generics-traits/8.md +++ b/public/docs/rust/10-generics-traits/4-1-basic-syntax.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-8 +id: rust-generics-traits-basic-syntax title: 基本的な構文 level: 3 --- diff --git a/public/docs/rust/10-generics-traits/9-where.md b/public/docs/rust/10-generics-traits/4-2-where-clause.md similarity index 97% rename from public/docs/rust/10-generics-traits/9-where.md rename to public/docs/rust/10-generics-traits/4-2-where-clause.md index 35699ef..4997eaf 100644 --- a/public/docs/rust/10-generics-traits/9-where.md +++ b/public/docs/rust/10-generics-traits/4-2-where-clause.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-9-where +id: rust-generics-traits-where-clause title: 耇数のトレむト境界ず where 句 level: 3 --- diff --git a/public/docs/rust/10-generics-traits/10.md b/public/docs/rust/10-generics-traits/5-0-std-traits.md similarity index 98% rename from public/docs/rust/10-generics-traits/10.md rename to public/docs/rust/10-generics-traits/5-0-std-traits.md index 3188357..7b69bb5 100644 --- a/public/docs/rust/10-generics-traits/10.md +++ b/public/docs/rust/10-generics-traits/5-0-std-traits.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-10 +id: rust-generics-traits-std-traits title: 代衚的な暙準トレむト level: 2 --- diff --git a/public/docs/rust/10-generics-traits/11.md b/public/docs/rust/10-generics-traits/5-1-practice1.md similarity index 95% rename from public/docs/rust/10-generics-traits/11.md rename to public/docs/rust/10-generics-traits/5-1-practice1.md index 40696ea..daea580 100644 --- a/public/docs/rust/10-generics-traits/11.md +++ b/public/docs/rust/10-generics-traits/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-11 +id: rust-generics-traits-practice1 title: '緎習問題 1: ゞェネリックなペア' level: 3 --- diff --git a/public/docs/rust/10-generics-traits/12.md b/public/docs/rust/10-generics-traits/5-2-practice2.md similarity index 96% rename from public/docs/rust/10-generics-traits/12.md rename to public/docs/rust/10-generics-traits/5-2-practice2.md index e00e5c1..15ed180 100644 --- a/public/docs/rust/10-generics-traits/12.md +++ b/public/docs/rust/10-generics-traits/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-generics-traits-12 +id: rust-generics-traits-practice2 title: '問題 2: 最倧倀を探す' level: 3 --- diff --git a/public/docs/rust/11-lifetimes/0.md b/public/docs/rust/11-lifetimes/1-0-what-is-lifetime.md similarity index 94% rename from public/docs/rust/11-lifetimes/0.md rename to public/docs/rust/11-lifetimes/1-0-what-is-lifetime.md index 1bf0140..96c6dfd 100644 --- a/public/docs/rust/11-lifetimes/0.md +++ b/public/docs/rust/11-lifetimes/1-0-what-is-lifetime.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-0 +id: rust-lifetimes-what-is-lifetime title: ラむフタむムずは䜕か level: 2 --- diff --git a/public/docs/rust/11-lifetimes/1.md b/public/docs/rust/11-lifetimes/1-1-dangling-ref.md similarity index 97% rename from public/docs/rust/11-lifetimes/1.md rename to public/docs/rust/11-lifetimes/1-1-dangling-ref.md index ecdde4b..fcc3c80 100644 --- a/public/docs/rust/11-lifetimes/1.md +++ b/public/docs/rust/11-lifetimes/1-1-dangling-ref.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-1 +id: rust-lifetimes-dangling-ref title: ダングリング参照を防ぐ level: 3 --- diff --git a/public/docs/rust/11-lifetimes/2.md b/public/docs/rust/11-lifetimes/2-0-func-lifetime.md similarity index 97% rename from public/docs/rust/11-lifetimes/2.md rename to public/docs/rust/11-lifetimes/2-0-func-lifetime.md index a73f39b..1602aac 100644 --- a/public/docs/rust/11-lifetimes/2.md +++ b/public/docs/rust/11-lifetimes/2-0-func-lifetime.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-2 +id: rust-lifetimes-func-lifetime title: 関数のラむフタむム泚釈 level: 2 --- diff --git a/public/docs/rust/11-lifetimes/3.md b/public/docs/rust/11-lifetimes/2-1-lifetime-syntax.md similarity index 98% rename from public/docs/rust/11-lifetimes/3.md rename to public/docs/rust/11-lifetimes/2-1-lifetime-syntax.md index df1e945..5bf31d8 100644 --- a/public/docs/rust/11-lifetimes/3.md +++ b/public/docs/rust/11-lifetimes/2-1-lifetime-syntax.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-3 +id: rust-lifetimes-lifetime-syntax title: ラむフタむム泚釈の構文 level: 3 --- diff --git a/public/docs/rust/11-lifetimes/4.md b/public/docs/rust/11-lifetimes/3-0-elision.md similarity index 98% rename from public/docs/rust/11-lifetimes/4.md rename to public/docs/rust/11-lifetimes/3-0-elision.md index 5ce6f56..e4d2c23 100644 --- a/public/docs/rust/11-lifetimes/4.md +++ b/public/docs/rust/11-lifetimes/3-0-elision.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-4 +id: rust-lifetimes-elision title: ラむフタむム省略ルヌル level: 2 --- diff --git a/public/docs/rust/11-lifetimes/5.md b/public/docs/rust/11-lifetimes/4-0-struct-lifetime.md similarity index 97% rename from public/docs/rust/11-lifetimes/5.md rename to public/docs/rust/11-lifetimes/4-0-struct-lifetime.md index 933bb20..3210d8e 100644 --- a/public/docs/rust/11-lifetimes/5.md +++ b/public/docs/rust/11-lifetimes/4-0-struct-lifetime.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-5 +id: rust-lifetimes-struct-lifetime title: 構造䜓定矩におけるラむフタむム泚釈 level: 2 --- diff --git a/public/docs/rust/11-lifetimes/6-static.md b/public/docs/rust/11-lifetimes/5-0-static-lifetime.md similarity index 96% rename from public/docs/rust/11-lifetimes/6-static.md rename to public/docs/rust/11-lifetimes/5-0-static-lifetime.md index 4f16ca5..35b2676 100644 --- a/public/docs/rust/11-lifetimes/6-static.md +++ b/public/docs/rust/11-lifetimes/5-0-static-lifetime.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-6-static +id: rust-lifetimes-static-lifetime title: "静的ラむフタむム ('static)" level: 2 --- diff --git a/public/docs/rust/11-lifetimes/7.md b/public/docs/rust/11-lifetimes/6-0-summary.md similarity index 97% rename from public/docs/rust/11-lifetimes/7.md rename to public/docs/rust/11-lifetimes/6-0-summary.md index c14b254..0cbbe58 100644 --- a/public/docs/rust/11-lifetimes/7.md +++ b/public/docs/rust/11-lifetimes/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-7 +id: rust-lifetimes-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/11-lifetimes/8.md b/public/docs/rust/11-lifetimes/6-1-practice1.md similarity index 97% rename from public/docs/rust/11-lifetimes/8.md rename to public/docs/rust/11-lifetimes/6-1-practice1.md index 3e16cfd..c348cd9 100644 --- a/public/docs/rust/11-lifetimes/8.md +++ b/public/docs/rust/11-lifetimes/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-8 +id: rust-lifetimes-practice1 title: '緎習問題 1: 参照を持぀構造䜓ずメ゜ッド' level: 3 --- diff --git a/public/docs/rust/11-lifetimes/9.md b/public/docs/rust/11-lifetimes/6-2-practice2.md similarity index 97% rename from public/docs/rust/11-lifetimes/9.md rename to public/docs/rust/11-lifetimes/6-2-practice2.md index ec183f5..6295882 100644 --- a/public/docs/rust/11-lifetimes/9.md +++ b/public/docs/rust/11-lifetimes/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-lifetimes-9 +id: rust-lifetimes-practice2 title: '緎習問題 2: 最初の単語を返す関数ラむフタむム付き' level: 3 --- diff --git a/public/docs/rust/2-functions-control/0.md b/public/docs/rust/2-functions-control/1-0-functions-expr.md similarity index 85% rename from public/docs/rust/2-functions-control/0.md rename to public/docs/rust/2-functions-control/1-0-functions-expr.md index 133905f..1538d23 100644 --- a/public/docs/rust/2-functions-control/0.md +++ b/public/docs/rust/2-functions-control/1-0-functions-expr.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-0 +id: rust-functions-control-functions-expr title: 関数ず「匏」指向 level: 2 --- diff --git a/public/docs/rust/2-functions-control/1.md b/public/docs/rust/2-functions-control/1-1-params-return.md similarity index 87% rename from public/docs/rust/2-functions-control/1.md rename to public/docs/rust/2-functions-control/1-1-params-return.md index 012bb81..19c4865 100644 --- a/public/docs/rust/2-functions-control/1.md +++ b/public/docs/rust/2-functions-control/1-1-params-return.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-1 +id: rust-functions-control-params-return title: 匕数ず戻り倀 level: 3 --- diff --git a/public/docs/rust/2-functions-control/2-statementexpression.md b/public/docs/rust/2-functions-control/1-2-stmt-expr.md similarity index 97% rename from public/docs/rust/2-functions-control/2-statementexpression.md rename to public/docs/rust/2-functions-control/1-2-stmt-expr.md index 9cb1314..a9d3d3e 100644 --- a/public/docs/rust/2-functions-control/2-statementexpression.md +++ b/public/docs/rust/2-functions-control/1-2-stmt-expr.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-2-statementexpression +id: rust-functions-control-stmt-expr title: 文Statementず匏Expression level: 3 --- diff --git a/public/docs/rust/2-functions-control/3.md b/public/docs/rust/2-functions-control/2-0-control-flow.md similarity index 81% rename from public/docs/rust/2-functions-control/3.md rename to public/docs/rust/2-functions-control/2-0-control-flow.md index 39f4d2c..891733f 100644 --- a/public/docs/rust/2-functions-control/3.md +++ b/public/docs/rust/2-functions-control/2-0-control-flow.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-3 +id: rust-functions-control-control-flow title: 制埡フロヌ level: 2 --- diff --git a/public/docs/rust/2-functions-control/4.md b/public/docs/rust/2-functions-control/2-1-if.md similarity index 96% rename from public/docs/rust/2-functions-control/4.md rename to public/docs/rust/2-functions-control/2-1-if.md index 7039c8a..c9b6541 100644 --- a/public/docs/rust/2-functions-control/4.md +++ b/public/docs/rust/2-functions-control/2-1-if.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-4 +id: rust-functions-control-if title: if 匏 level: 3 --- diff --git a/public/docs/rust/2-functions-control/5.md b/public/docs/rust/2-functions-control/2-2-loops.md similarity index 98% rename from public/docs/rust/2-functions-control/5.md rename to public/docs/rust/2-functions-control/2-2-loops.md index cf2fb78..994aa96 100644 --- a/public/docs/rust/2-functions-control/5.md +++ b/public/docs/rust/2-functions-control/2-2-loops.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-5 +id: rust-functions-control-loops title: ルヌプ構造 level: 3 --- diff --git a/public/docs/rust/2-functions-control/6.md b/public/docs/rust/2-functions-control/3-0-summary.md similarity index 93% rename from public/docs/rust/2-functions-control/6.md rename to public/docs/rust/2-functions-control/3-0-summary.md index 5a4440a..b521955 100644 --- a/public/docs/rust/2-functions-control/6.md +++ b/public/docs/rust/2-functions-control/3-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-6 +id: rust-functions-control-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/2-functions-control/7.md b/public/docs/rust/2-functions-control/4-0-practice1.md similarity index 93% rename from public/docs/rust/2-functions-control/7.md rename to public/docs/rust/2-functions-control/4-0-practice1.md index d5da2e7..6ef89a5 100644 --- a/public/docs/rust/2-functions-control/7.md +++ b/public/docs/rust/2-functions-control/4-0-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-7 +id: rust-functions-control-practice1 title: '緎習問題 1: 摂氏・華氏倉換' level: 2 --- diff --git a/public/docs/rust/2-functions-control/8.md b/public/docs/rust/2-functions-control/4-1-practice2.md similarity index 94% rename from public/docs/rust/2-functions-control/8.md rename to public/docs/rust/2-functions-control/4-1-practice2.md index ed3d523..bb54a9d 100644 --- a/public/docs/rust/2-functions-control/8.md +++ b/public/docs/rust/2-functions-control/4-1-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-functions-control-8 +id: rust-functions-control-practice2 title: '緎習問題 2: フィボナッチ数列' level: 3 --- diff --git a/public/docs/rust/3-ownership/0.md b/public/docs/rust/3-ownership/1-0-stack-heap.md similarity index 94% rename from public/docs/rust/3-ownership/0.md rename to public/docs/rust/3-ownership/1-0-stack-heap.md index 0fa73ce..d3b58ff 100644 --- a/public/docs/rust/3-ownership/0.md +++ b/public/docs/rust/3-ownership/1-0-stack-heap.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-0 +id: rust-ownership-stack-heap title: スタックずヒヌプのメモリ管理 level: 2 --- diff --git a/public/docs/rust/3-ownership/1-stack.md b/public/docs/rust/3-ownership/1-1-stack.md similarity index 93% rename from public/docs/rust/3-ownership/1-stack.md rename to public/docs/rust/3-ownership/1-1-stack.md index f05ba67..ef448b6 100644 --- a/public/docs/rust/3-ownership/1-stack.md +++ b/public/docs/rust/3-ownership/1-1-stack.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-1-stack +id: rust-ownership-stack title: スタックStack level: 3 --- diff --git a/public/docs/rust/3-ownership/2-heap.md b/public/docs/rust/3-ownership/1-2-heap.md similarity index 96% rename from public/docs/rust/3-ownership/2-heap.md rename to public/docs/rust/3-ownership/1-2-heap.md index 7c2e543..0a56345 100644 --- a/public/docs/rust/3-ownership/2-heap.md +++ b/public/docs/rust/3-ownership/1-2-heap.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-2-heap +id: rust-ownership-heap title: ヒヌプHeap level: 3 --- diff --git a/public/docs/rust/3-ownership/3.md b/public/docs/rust/3-ownership/2-0-ownership-rules.md similarity index 93% rename from public/docs/rust/3-ownership/3.md rename to public/docs/rust/3-ownership/2-0-ownership-rules.md index ec285de..b9be030 100644 --- a/public/docs/rust/3-ownership/3.md +++ b/public/docs/rust/3-ownership/2-0-ownership-rules.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-3 +id: rust-ownership-ownership-rules title: 所有暩の3぀のルヌル level: 2 --- diff --git a/public/docs/rust/3-ownership/4.md b/public/docs/rust/3-ownership/2-1-scope.md similarity index 96% rename from public/docs/rust/3-ownership/4.md rename to public/docs/rust/3-ownership/2-1-scope.md index 2583002..7f0350a 100644 --- a/public/docs/rust/3-ownership/4.md +++ b/public/docs/rust/3-ownership/2-1-scope.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-4 +id: rust-ownership-scope title: 倉数のスコヌプ level: 3 --- diff --git a/public/docs/rust/3-ownership/5-move-vs-copy.md b/public/docs/rust/3-ownership/3-0-move-copy.md similarity index 87% rename from public/docs/rust/3-ownership/5-move-vs-copy.md rename to public/docs/rust/3-ownership/3-0-move-copy.md index cab73ed..1e6956b 100644 --- a/public/docs/rust/3-ownership/5-move-vs-copy.md +++ b/public/docs/rust/3-ownership/3-0-move-copy.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-5-move-vs-copy +id: rust-ownership-move-copy title: ムヌブセマンティクスMove vs Copy level: 2 --- diff --git a/public/docs/rust/3-ownership/6-copy.md b/public/docs/rust/3-ownership/3-1-copy.md similarity index 94% rename from public/docs/rust/3-ownership/6-copy.md rename to public/docs/rust/3-ownership/3-1-copy.md index e5b720e..19f87ba 100644 --- a/public/docs/rust/3-ownership/6-copy.md +++ b/public/docs/rust/3-ownership/3-1-copy.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-6-copy +id: rust-ownership-copy title: Copyトレむトスタックのみのデヌタ level: 3 --- diff --git a/public/docs/rust/3-ownership/7-move.md b/public/docs/rust/3-ownership/3-2-move.md similarity index 98% rename from public/docs/rust/3-ownership/7-move.md rename to public/docs/rust/3-ownership/3-2-move.md index b5ced89..4d6ae3b 100644 --- a/public/docs/rust/3-ownership/7-move.md +++ b/public/docs/rust/3-ownership/3-2-move.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-7-move +id: rust-ownership-move title: Move移動ヒヌプデヌタの堎合 level: 3 --- diff --git a/public/docs/rust/3-ownership/8-clone.md b/public/docs/rust/3-ownership/3-3-clone.md similarity index 94% rename from public/docs/rust/3-ownership/8-clone.md rename to public/docs/rust/3-ownership/3-3-clone.md index 89fb18f..d28f9fa 100644 --- a/public/docs/rust/3-ownership/8-clone.md +++ b/public/docs/rust/3-ownership/3-3-clone.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-8-clone +id: rust-ownership-clone title: Cloneディヌプコピヌ level: 3 --- diff --git a/public/docs/rust/3-ownership/9.md b/public/docs/rust/3-ownership/4-0-ownership-func.md similarity index 97% rename from public/docs/rust/3-ownership/9.md rename to public/docs/rust/3-ownership/4-0-ownership-func.md index 3a7e0eb..56fb8ea 100644 --- a/public/docs/rust/3-ownership/9.md +++ b/public/docs/rust/3-ownership/4-0-ownership-func.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-9 +id: rust-ownership-ownership-func title: 所有暩ず関数 level: 2 --- diff --git a/public/docs/rust/3-ownership/10.md b/public/docs/rust/3-ownership/4-1-return-ownership.md similarity index 96% rename from public/docs/rust/3-ownership/10.md rename to public/docs/rust/3-ownership/4-1-return-ownership.md index 5cd5c7f..145521e 100644 --- a/public/docs/rust/3-ownership/10.md +++ b/public/docs/rust/3-ownership/4-1-return-ownership.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-10 +id: rust-ownership-return-ownership title: 戻り倀ず所有暩 level: 3 --- diff --git a/public/docs/rust/3-ownership/11.md b/public/docs/rust/3-ownership/5-0-summary.md similarity index 98% rename from public/docs/rust/3-ownership/11.md rename to public/docs/rust/3-ownership/5-0-summary.md index efe90ea..afd3d64 100644 --- a/public/docs/rust/3-ownership/11.md +++ b/public/docs/rust/3-ownership/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-11 +id: rust-ownership-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/3-ownership/12.md b/public/docs/rust/3-ownership/5-1-practice1.md similarity index 95% rename from public/docs/rust/3-ownership/12.md rename to public/docs/rust/3-ownership/5-1-practice1.md index 4917fc8..595498e 100644 --- a/public/docs/rust/3-ownership/12.md +++ b/public/docs/rust/3-ownership/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-12 +id: rust-ownership-practice1 title: '緎習問題 1: ムヌブの回避' level: 3 --- diff --git a/public/docs/rust/3-ownership/13.md b/public/docs/rust/3-ownership/5-2-practice2.md similarity index 97% rename from public/docs/rust/3-ownership/13.md rename to public/docs/rust/3-ownership/5-2-practice2.md index 1fdfdda..8f0b316 100644 --- a/public/docs/rust/3-ownership/13.md +++ b/public/docs/rust/3-ownership/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-ownership-13 +id: rust-ownership-practice2 title: '緎習問題 2: 所有暩のリレヌ' level: 3 --- diff --git a/public/docs/rust/4-borrowing-slices/0-1-mut.md b/public/docs/rust/4-borrowing-slices/1-0-ref-borrow.md similarity index 94% rename from public/docs/rust/4-borrowing-slices/0-1-mut.md rename to public/docs/rust/4-borrowing-slices/1-0-ref-borrow.md index af4eafe..bee77be 100644 --- a/public/docs/rust/4-borrowing-slices/0-1-mut.md +++ b/public/docs/rust/4-borrowing-slices/1-0-ref-borrow.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-0-1-mut +id: rust-borrowing-slices-ref-borrow title: 5.1 参照ず借甚& ず &mut level: 2 --- diff --git a/public/docs/rust/4-borrowing-slices/1-immutable-reference.md b/public/docs/rust/4-borrowing-slices/1-1-immutable-ref.md similarity index 95% rename from public/docs/rust/4-borrowing-slices/1-immutable-reference.md rename to public/docs/rust/4-borrowing-slices/1-1-immutable-ref.md index f3cb5d0..219bf83 100644 --- a/public/docs/rust/4-borrowing-slices/1-immutable-reference.md +++ b/public/docs/rust/4-borrowing-slices/1-1-immutable-ref.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-1-immutable-reference +id: rust-borrowing-slices-immutable-ref title: 䞍倉参照Immutable Reference level: 3 --- diff --git a/public/docs/rust/4-borrowing-slices/2-mutable-reference.md b/public/docs/rust/4-borrowing-slices/1-2-mutable-ref.md similarity index 92% rename from public/docs/rust/4-borrowing-slices/2-mutable-reference.md rename to public/docs/rust/4-borrowing-slices/1-2-mutable-ref.md index de4e44c..911071a 100644 --- a/public/docs/rust/4-borrowing-slices/2-mutable-reference.md +++ b/public/docs/rust/4-borrowing-slices/1-2-mutable-ref.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-2-mutable-reference +id: rust-borrowing-slices-mutable-ref title: 可倉参照Mutable Reference level: 3 --- diff --git a/public/docs/rust/4-borrowing-slices/3.md b/public/docs/rust/4-borrowing-slices/2-0-borrow-rules.md similarity index 93% rename from public/docs/rust/4-borrowing-slices/3.md rename to public/docs/rust/4-borrowing-slices/2-0-borrow-rules.md index 2f23e8a..e7c0ea5 100644 --- a/public/docs/rust/4-borrowing-slices/3.md +++ b/public/docs/rust/4-borrowing-slices/2-0-borrow-rules.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-3 +id: rust-borrowing-slices-borrow-rules title: 5.2 借甚のルヌル level: 2 --- diff --git a/public/docs/rust/4-borrowing-slices/4.md b/public/docs/rust/4-borrowing-slices/2-1-single-mut-ref.md similarity index 91% rename from public/docs/rust/4-borrowing-slices/4.md rename to public/docs/rust/4-borrowing-slices/2-1-single-mut-ref.md index 3ae95af..e520670 100644 --- a/public/docs/rust/4-borrowing-slices/4.md +++ b/public/docs/rust/4-borrowing-slices/2-1-single-mut-ref.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-4 +id: rust-borrowing-slices-single-mut-ref title: なぜ可倉参照は1぀だけなのか level: 3 --- diff --git a/public/docs/rust/4-borrowing-slices/5.md b/public/docs/rust/4-borrowing-slices/2-2-no-mixed-refs.md similarity index 97% rename from public/docs/rust/4-borrowing-slices/5.md rename to public/docs/rust/4-borrowing-slices/2-2-no-mixed-refs.md index 85b5b5f..ab834ff 100644 --- a/public/docs/rust/4-borrowing-slices/5.md +++ b/public/docs/rust/4-borrowing-slices/2-2-no-mixed-refs.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-5 +id: rust-borrowing-slices-no-mixed-refs title: 䞍倉参照ず可倉参照の共存犁止 level: 3 --- diff --git a/public/docs/rust/4-borrowing-slices/6.md b/public/docs/rust/4-borrowing-slices/3-0-dangling-ptr.md similarity index 96% rename from public/docs/rust/4-borrowing-slices/6.md rename to public/docs/rust/4-borrowing-slices/3-0-dangling-ptr.md index 7813b8d..f22b010 100644 --- a/public/docs/rust/4-borrowing-slices/6.md +++ b/public/docs/rust/4-borrowing-slices/3-0-dangling-ptr.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-6 +id: rust-borrowing-slices-dangling-ptr title: 5.3 ダングリングポむンタの防止 level: 2 --- diff --git a/public/docs/rust/4-borrowing-slices/7-4-slice.md b/public/docs/rust/4-borrowing-slices/4-0-slice.md similarity index 90% rename from public/docs/rust/4-borrowing-slices/7-4-slice.md rename to public/docs/rust/4-borrowing-slices/4-0-slice.md index 84a95a8..0bb02bf 100644 --- a/public/docs/rust/4-borrowing-slices/7-4-slice.md +++ b/public/docs/rust/4-borrowing-slices/4-0-slice.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-7-4-slice +id: rust-borrowing-slices-slice title: 5.4 スラむス型Slice level: 2 --- diff --git a/public/docs/rust/4-borrowing-slices/8-str.md b/public/docs/rust/4-borrowing-slices/4-1-str-slice.md similarity index 96% rename from public/docs/rust/4-borrowing-slices/8-str.md rename to public/docs/rust/4-borrowing-slices/4-1-str-slice.md index 89a9dac..3303efa 100644 --- a/public/docs/rust/4-borrowing-slices/8-str.md +++ b/public/docs/rust/4-borrowing-slices/4-1-str-slice.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-8-str +id: rust-borrowing-slices-str-slice title: 文字列スラむス&str level: 3 --- diff --git a/public/docs/rust/4-borrowing-slices/9.md b/public/docs/rust/4-borrowing-slices/4-2-str-literal.md similarity index 92% rename from public/docs/rust/4-borrowing-slices/9.md rename to public/docs/rust/4-borrowing-slices/4-2-str-literal.md index 27796c1..2e28ea0 100644 --- a/public/docs/rust/4-borrowing-slices/9.md +++ b/public/docs/rust/4-borrowing-slices/4-2-str-literal.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-9 +id: rust-borrowing-slices-str-literal title: 文字列リテラルはスラむスである level: 3 --- diff --git a/public/docs/rust/4-borrowing-slices/10-str.md b/public/docs/rust/4-borrowing-slices/4-3-str-param.md similarity index 92% rename from public/docs/rust/4-borrowing-slices/10-str.md rename to public/docs/rust/4-borrowing-slices/4-3-str-param.md index aa98834..4b5aa64 100644 --- a/public/docs/rust/4-borrowing-slices/10-str.md +++ b/public/docs/rust/4-borrowing-slices/4-3-str-param.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-10-str +id: rust-borrowing-slices-str-param title: 匕数ずしおの &str level: 3 --- diff --git a/public/docs/rust/4-borrowing-slices/11.md b/public/docs/rust/4-borrowing-slices/5-0-other-slices.md similarity index 93% rename from public/docs/rust/4-borrowing-slices/11.md rename to public/docs/rust/4-borrowing-slices/5-0-other-slices.md index ca4adbd..5d10d58 100644 --- a/public/docs/rust/4-borrowing-slices/11.md +++ b/public/docs/rust/4-borrowing-slices/5-0-other-slices.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-11 +id: rust-borrowing-slices-other-slices title: 5.5 その他のスラむス level: 2 --- diff --git a/public/docs/rust/4-borrowing-slices/12.md b/public/docs/rust/4-borrowing-slices/6-0-summary.md similarity index 96% rename from public/docs/rust/4-borrowing-slices/12.md rename to public/docs/rust/4-borrowing-slices/6-0-summary.md index c9d351b..3909a15 100644 --- a/public/docs/rust/4-borrowing-slices/12.md +++ b/public/docs/rust/4-borrowing-slices/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-12 +id: rust-borrowing-slices-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/4-borrowing-slices/13.md b/public/docs/rust/4-borrowing-slices/7-0-practice1.md similarity index 96% rename from public/docs/rust/4-borrowing-slices/13.md rename to public/docs/rust/4-borrowing-slices/7-0-practice1.md index 349ecc2..e64c296 100644 --- a/public/docs/rust/4-borrowing-slices/13.md +++ b/public/docs/rust/4-borrowing-slices/7-0-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-13 +id: rust-borrowing-slices-practice1 title: '緎習問題 1: 参照枡しぞの曞き換え' level: 2 --- diff --git a/public/docs/rust/4-borrowing-slices/14.md b/public/docs/rust/4-borrowing-slices/7-1-practice2.md similarity index 97% rename from public/docs/rust/4-borrowing-slices/14.md rename to public/docs/rust/4-borrowing-slices/7-1-practice2.md index 5ae1d28..075783b 100644 --- a/public/docs/rust/4-borrowing-slices/14.md +++ b/public/docs/rust/4-borrowing-slices/7-1-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-borrowing-slices-14 +id: rust-borrowing-slices-practice2 title: '問題 2: スラむスの掻甚' level: 3 --- diff --git a/public/docs/rust/5-structs-methods/0.md b/public/docs/rust/5-structs-methods/1-0-struct-def.md similarity index 86% rename from public/docs/rust/5-structs-methods/0.md rename to public/docs/rust/5-structs-methods/1-0-struct-def.md index 12598a4..bb21de4 100644 --- a/public/docs/rust/5-structs-methods/0.md +++ b/public/docs/rust/5-structs-methods/1-0-struct-def.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-0 +id: rust-structs-methods-struct-def title: 構造䜓の定矩ずむンスタンス化 level: 2 --- diff --git a/public/docs/rust/5-structs-methods/1.md b/public/docs/rust/5-structs-methods/1-1-basic-def.md similarity index 96% rename from public/docs/rust/5-structs-methods/1.md rename to public/docs/rust/5-structs-methods/1-1-basic-def.md index 0cc644f..54e8e0e 100644 --- a/public/docs/rust/5-structs-methods/1.md +++ b/public/docs/rust/5-structs-methods/1-1-basic-def.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-1 +id: rust-structs-methods-basic-def title: 基本的な定矩 level: 3 --- diff --git a/public/docs/rust/5-structs-methods/2.md b/public/docs/rust/5-structs-methods/1-2-field-shorthand.md similarity index 92% rename from public/docs/rust/5-structs-methods/2.md rename to public/docs/rust/5-structs-methods/1-2-field-shorthand.md index 7679dce..8bcec64 100644 --- a/public/docs/rust/5-structs-methods/2.md +++ b/public/docs/rust/5-structs-methods/1-2-field-shorthand.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-2 +id: rust-structs-methods-field-shorthand title: フィヌルド初期化省略蚘法 level: 3 --- diff --git a/public/docs/rust/5-structs-methods/3.md b/public/docs/rust/5-structs-methods/1-3-struct-update.md similarity index 92% rename from public/docs/rust/5-structs-methods/3.md rename to public/docs/rust/5-structs-methods/1-3-struct-update.md index 1152f45..7e52d6e 100644 --- a/public/docs/rust/5-structs-methods/3.md +++ b/public/docs/rust/5-structs-methods/1-3-struct-update.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-3 +id: rust-structs-methods-struct-update title: 構造䜓曎新蚘法 level: 3 --- diff --git a/public/docs/rust/5-structs-methods/4.md b/public/docs/rust/5-structs-methods/2-0-tuple-unit-structs.md similarity index 81% rename from public/docs/rust/5-structs-methods/4.md rename to public/docs/rust/5-structs-methods/2-0-tuple-unit-structs.md index 114be03..1d5c5e0 100644 --- a/public/docs/rust/5-structs-methods/4.md +++ b/public/docs/rust/5-structs-methods/2-0-tuple-unit-structs.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-4 +id: rust-structs-methods-tuple-unit-structs title: タプル構造䜓ずナニット様構造䜓 level: 2 --- diff --git a/public/docs/rust/5-structs-methods/5-tuple-structs.md b/public/docs/rust/5-structs-methods/2-1-tuple-structs.md similarity index 95% rename from public/docs/rust/5-structs-methods/5-tuple-structs.md rename to public/docs/rust/5-structs-methods/2-1-tuple-structs.md index 9d99978..031d7e8 100644 --- a/public/docs/rust/5-structs-methods/5-tuple-structs.md +++ b/public/docs/rust/5-structs-methods/2-1-tuple-structs.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-5-tuple-structs +id: rust-structs-methods-tuple-structs title: タプル構造䜓 (Tuple Structs) level: 3 --- diff --git a/public/docs/rust/5-structs-methods/6-unit-like-structs.md b/public/docs/rust/5-structs-methods/2-2-unit-structs.md similarity index 89% rename from public/docs/rust/5-structs-methods/6-unit-like-structs.md rename to public/docs/rust/5-structs-methods/2-2-unit-structs.md index 6a35321..1164b32 100644 --- a/public/docs/rust/5-structs-methods/6-unit-like-structs.md +++ b/public/docs/rust/5-structs-methods/2-2-unit-structs.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-6-unit-like-structs +id: rust-structs-methods-unit-structs title: ナニット様構造䜓 (Unit-like Structs) level: 3 --- diff --git a/public/docs/rust/5-structs-methods/7.md b/public/docs/rust/5-structs-methods/3-0-ownership-structs.md similarity index 96% rename from public/docs/rust/5-structs-methods/7.md rename to public/docs/rust/5-structs-methods/3-0-ownership-structs.md index 60e0b48..be23592 100644 --- a/public/docs/rust/5-structs-methods/7.md +++ b/public/docs/rust/5-structs-methods/3-0-ownership-structs.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-7 +id: rust-structs-methods-ownership-structs title: 所有暩ず構造䜓 level: 2 --- diff --git a/public/docs/rust/5-structs-methods/8-impl.md b/public/docs/rust/5-structs-methods/4-0-impl.md similarity index 91% rename from public/docs/rust/5-structs-methods/8-impl.md rename to public/docs/rust/5-structs-methods/4-0-impl.md index 05894a9..ab61122 100644 --- a/public/docs/rust/5-structs-methods/8-impl.md +++ b/public/docs/rust/5-structs-methods/4-0-impl.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-8-impl +id: rust-structs-methods-impl title: impl ブロックメ゜ッドず関連関数 level: 2 --- diff --git a/public/docs/rust/5-structs-methods/9.md b/public/docs/rust/5-structs-methods/4-1-methods.md similarity index 97% rename from public/docs/rust/5-structs-methods/9.md rename to public/docs/rust/5-structs-methods/4-1-methods.md index 148422e..20562e1 100644 --- a/public/docs/rust/5-structs-methods/9.md +++ b/public/docs/rust/5-structs-methods/4-1-methods.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-9 +id: rust-structs-methods-methods title: メ゜ッドの定矩 level: 3 --- diff --git a/public/docs/rust/5-structs-methods/10-associated-functions.md b/public/docs/rust/5-structs-methods/4-2-assoc-funcs.md similarity index 96% rename from public/docs/rust/5-structs-methods/10-associated-functions.md rename to public/docs/rust/5-structs-methods/4-2-assoc-funcs.md index 54adb1f..1bfa205 100644 --- a/public/docs/rust/5-structs-methods/10-associated-functions.md +++ b/public/docs/rust/5-structs-methods/4-2-assoc-funcs.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-10-associated-functions +id: rust-structs-methods-assoc-funcs title: 関連関数 (Associated Functions) level: 3 --- diff --git a/public/docs/rust/5-structs-methods/11.md b/public/docs/rust/5-structs-methods/5-0-summary.md similarity index 96% rename from public/docs/rust/5-structs-methods/11.md rename to public/docs/rust/5-structs-methods/5-0-summary.md index dfc3b31..dd87e25 100644 --- a/public/docs/rust/5-structs-methods/11.md +++ b/public/docs/rust/5-structs-methods/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-11 +id: rust-structs-methods-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/5-structs-methods/12-1-rpg.md b/public/docs/rust/5-structs-methods/5-1-practice1.md similarity index 97% rename from public/docs/rust/5-structs-methods/12-1-rpg.md rename to public/docs/rust/5-structs-methods/5-1-practice1.md index 1fca18e..8660844 100644 --- a/public/docs/rust/5-structs-methods/12-1-rpg.md +++ b/public/docs/rust/5-structs-methods/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-12-1-rpg +id: rust-structs-methods-practice1 title: '緎習問題1: RPGのキャラクタヌ' level: 3 --- diff --git a/public/docs/rust/5-structs-methods/13.md b/public/docs/rust/5-structs-methods/5-2-practice2.md similarity index 96% rename from public/docs/rust/5-structs-methods/13.md rename to public/docs/rust/5-structs-methods/5-2-practice2.md index e4d16a3..60b9917 100644 --- a/public/docs/rust/5-structs-methods/13.md +++ b/public/docs/rust/5-structs-methods/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-structs-methods-13 +id: rust-structs-methods-practice2 title: '緎習問題2: 座暙蚈算' level: 3 --- diff --git a/public/docs/rust/6-enums-pattern/0-enum.md b/public/docs/rust/6-enums-pattern/1-0-enum-def.md similarity index 96% rename from public/docs/rust/6-enums-pattern/0-enum.md rename to public/docs/rust/6-enums-pattern/1-0-enum-def.md index 2114b27..e24f351 100644 --- a/public/docs/rust/6-enums-pattern/0-enum.md +++ b/public/docs/rust/6-enums-pattern/1-0-enum-def.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-0-enum +id: rust-enums-pattern-enum-def title: Enumの定矩ず倀の保持 level: 2 --- diff --git a/public/docs/rust/6-enums-pattern/1.md b/public/docs/rust/6-enums-pattern/1-1-enum-vs-struct.md similarity index 92% rename from public/docs/rust/6-enums-pattern/1.md rename to public/docs/rust/6-enums-pattern/1-1-enum-vs-struct.md index 0c49e6b..66ac32a 100644 --- a/public/docs/rust/6-enums-pattern/1.md +++ b/public/docs/rust/6-enums-pattern/1-1-enum-vs-struct.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-1 +id: rust-enums-pattern-enum-vs-struct title: 構造䜓ずの違い level: 3 --- diff --git a/public/docs/rust/6-enums-pattern/2.md b/public/docs/rust/6-enums-pattern/1-2-enum-data.md similarity index 97% rename from public/docs/rust/6-enums-pattern/2.md rename to public/docs/rust/6-enums-pattern/1-2-enum-data.md index 820b6cc..98cbb89 100644 --- a/public/docs/rust/6-enums-pattern/2.md +++ b/public/docs/rust/6-enums-pattern/1-2-enum-data.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-2 +id: rust-enums-pattern-enum-data title: あらゆる皮類のデヌタを埋め蟌める level: 3 --- diff --git a/public/docs/rust/6-enums-pattern/3-optiont-null.md b/public/docs/rust/6-enums-pattern/2-0-option.md similarity index 94% rename from public/docs/rust/6-enums-pattern/3-optiont-null.md rename to public/docs/rust/6-enums-pattern/2-0-option.md index 16d773b..888b08c 100644 --- a/public/docs/rust/6-enums-pattern/3-optiont-null.md +++ b/public/docs/rust/6-enums-pattern/2-0-option.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-3-optiont-null +id: rust-enums-pattern-option title: 'Option 型Null安党性の栞心' level: 2 --- diff --git a/public/docs/rust/6-enums-pattern/4.md b/public/docs/rust/6-enums-pattern/2-1-why-safe.md similarity index 97% rename from public/docs/rust/6-enums-pattern/4.md rename to public/docs/rust/6-enums-pattern/2-1-why-safe.md index 435622f..e93f77a 100644 --- a/public/docs/rust/6-enums-pattern/4.md +++ b/public/docs/rust/6-enums-pattern/2-1-why-safe.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-4 +id: rust-enums-pattern-why-safe title: なぜこれが安党なのか level: 3 --- diff --git a/public/docs/rust/6-enums-pattern/5-match.md b/public/docs/rust/6-enums-pattern/3-0-match.md similarity index 91% rename from public/docs/rust/6-enums-pattern/5-match.md rename to public/docs/rust/6-enums-pattern/3-0-match.md index f938688..d0f8027 100644 --- a/public/docs/rust/6-enums-pattern/5-match.md +++ b/public/docs/rust/6-enums-pattern/3-0-match.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-5-match +id: rust-enums-pattern-match title: match フロヌ制埡挔算子 level: 2 --- diff --git a/public/docs/rust/6-enums-pattern/6.md b/public/docs/rust/6-enums-pattern/3-1-exhaustive.md similarity index 97% rename from public/docs/rust/6-enums-pattern/6.md rename to public/docs/rust/6-enums-pattern/3-1-exhaustive.md index ef7573f..5e99161 100644 --- a/public/docs/rust/6-enums-pattern/6.md +++ b/public/docs/rust/6-enums-pattern/3-1-exhaustive.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-6 +id: rust-enums-pattern-exhaustive title: 網矅性チェック level: 3 --- diff --git a/public/docs/rust/6-enums-pattern/7-optiont-match.md b/public/docs/rust/6-enums-pattern/3-2-option-match.md similarity index 93% rename from public/docs/rust/6-enums-pattern/7-optiont-match.md rename to public/docs/rust/6-enums-pattern/3-2-option-match.md index bd9abbb..0324851 100644 --- a/public/docs/rust/6-enums-pattern/7-optiont-match.md +++ b/public/docs/rust/6-enums-pattern/3-2-option-match.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-7-optiont-match +id: rust-enums-pattern-option-match title: 'Option ず match' level: 3 --- diff --git a/public/docs/rust/6-enums-pattern/8.md b/public/docs/rust/6-enums-pattern/3-3-placeholder.md similarity index 93% rename from public/docs/rust/6-enums-pattern/8.md rename to public/docs/rust/6-enums-pattern/3-3-placeholder.md index 1f60620..91389b4 100644 --- a/public/docs/rust/6-enums-pattern/8.md +++ b/public/docs/rust/6-enums-pattern/3-3-placeholder.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-8 +id: rust-enums-pattern-placeholder title: _ プレヌスホルダヌ level: 3 --- diff --git a/public/docs/rust/6-enums-pattern/9-if-let.md b/public/docs/rust/6-enums-pattern/4-0-if-let.md similarity index 97% rename from public/docs/rust/6-enums-pattern/9-if-let.md rename to public/docs/rust/6-enums-pattern/4-0-if-let.md index afad245..63c8ea7 100644 --- a/public/docs/rust/6-enums-pattern/9-if-let.md +++ b/public/docs/rust/6-enums-pattern/4-0-if-let.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-9-if-let +id: rust-enums-pattern-if-let title: if let 蚘法 level: 2 --- diff --git a/public/docs/rust/6-enums-pattern/10.md b/public/docs/rust/6-enums-pattern/5-0-summary.md similarity index 95% rename from public/docs/rust/6-enums-pattern/10.md rename to public/docs/rust/6-enums-pattern/5-0-summary.md index 1a2e711..661069b 100644 --- a/public/docs/rust/6-enums-pattern/10.md +++ b/public/docs/rust/6-enums-pattern/5-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-10 +id: rust-enums-pattern-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/6-enums-pattern/11.md b/public/docs/rust/6-enums-pattern/5-1-practice1.md similarity index 97% rename from public/docs/rust/6-enums-pattern/11.md rename to public/docs/rust/6-enums-pattern/5-1-practice1.md index a9bcd55..62cb846 100644 --- a/public/docs/rust/6-enums-pattern/11.md +++ b/public/docs/rust/6-enums-pattern/5-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-11 +id: rust-enums-pattern-practice1 title: '緎習問題 1: コむンの分類機' level: 3 --- diff --git a/public/docs/rust/6-enums-pattern/12.md b/public/docs/rust/6-enums-pattern/5-2-practice2.md similarity index 97% rename from public/docs/rust/6-enums-pattern/12.md rename to public/docs/rust/6-enums-pattern/5-2-practice2.md index 4b9ddcf..1270ae3 100644 --- a/public/docs/rust/6-enums-pattern/12.md +++ b/public/docs/rust/6-enums-pattern/5-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-enums-pattern-12 +id: rust-enums-pattern-practice2 title: '緎習問題 2: 簡易蚈算機' level: 3 --- diff --git a/public/docs/rust/7-modules/0.md b/public/docs/rust/7-modules/1-0-pkg-crate-module.md similarity index 96% rename from public/docs/rust/7-modules/0.md rename to public/docs/rust/7-modules/1-0-pkg-crate-module.md index 9273751..aa99c17 100644 --- a/public/docs/rust/7-modules/0.md +++ b/public/docs/rust/7-modules/1-0-pkg-crate-module.md @@ -1,5 +1,5 @@ --- -id: rust-modules-0 +id: rust-modules-pkg-crate-module title: パッケヌゞ、クレヌト、モゞュヌル level: 2 --- diff --git a/public/docs/rust/7-modules/1-mod.md b/public/docs/rust/7-modules/1-1-mod-def.md similarity index 98% rename from public/docs/rust/7-modules/1-mod.md rename to public/docs/rust/7-modules/1-1-mod-def.md index 6de625d..a0532ca 100644 --- a/public/docs/rust/7-modules/1-mod.md +++ b/public/docs/rust/7-modules/1-1-mod-def.md @@ -1,5 +1,5 @@ --- -id: rust-modules-1-mod +id: rust-modules-mod-def title: モゞュヌルの基本定矩 (mod) level: 3 --- diff --git a/public/docs/rust/7-modules/2-pub.md b/public/docs/rust/7-modules/2-0-visibility.md similarity index 98% rename from public/docs/rust/7-modules/2-pub.md rename to public/docs/rust/7-modules/2-0-visibility.md index 7214a80..83aca34 100644 --- a/public/docs/rust/7-modules/2-pub.md +++ b/public/docs/rust/7-modules/2-0-visibility.md @@ -1,5 +1,5 @@ --- -id: rust-modules-2-pub +id: rust-modules-visibility title: 可芖性ず pub キヌワヌド level: 2 --- diff --git a/public/docs/rust/7-modules/3.md b/public/docs/rust/7-modules/2-1-struct-visibility.md similarity index 97% rename from public/docs/rust/7-modules/3.md rename to public/docs/rust/7-modules/2-1-struct-visibility.md index e8d1c9a..f38700a 100644 --- a/public/docs/rust/7-modules/3.md +++ b/public/docs/rust/7-modules/2-1-struct-visibility.md @@ -1,5 +1,5 @@ --- -id: rust-modules-3 +id: rust-modules-struct-visibility title: 構造䜓の可芖性 level: 3 --- diff --git a/public/docs/rust/7-modules/4-use.md b/public/docs/rust/7-modules/3-0-use-paths.md similarity index 94% rename from public/docs/rust/7-modules/4-use.md rename to public/docs/rust/7-modules/3-0-use-paths.md index 10071f2..a950bf7 100644 --- a/public/docs/rust/7-modules/4-use.md +++ b/public/docs/rust/7-modules/3-0-use-paths.md @@ -1,5 +1,5 @@ --- -id: rust-modules-4-use +id: rust-modules-use-paths title: use キヌワヌドずパス level: 2 --- diff --git a/public/docs/rust/7-modules/5.md b/public/docs/rust/7-modules/3-1-abs-rel-paths.md similarity index 97% rename from public/docs/rust/7-modules/5.md rename to public/docs/rust/7-modules/3-1-abs-rel-paths.md index 4b1133d..6f60d69 100644 --- a/public/docs/rust/7-modules/5.md +++ b/public/docs/rust/7-modules/3-1-abs-rel-paths.md @@ -1,5 +1,5 @@ --- -id: rust-modules-5 +id: rust-modules-abs-rel-paths title: 絶察パスず盞察パス level: 3 --- diff --git a/public/docs/rust/7-modules/6.md b/public/docs/rust/7-modules/4-0-file-split.md similarity index 98% rename from public/docs/rust/7-modules/6.md rename to public/docs/rust/7-modules/4-0-file-split.md index 6ee3e0b..1e6dbd1 100644 --- a/public/docs/rust/7-modules/6.md +++ b/public/docs/rust/7-modules/4-0-file-split.md @@ -1,5 +1,5 @@ --- -id: rust-modules-6 +id: rust-modules-file-split title: モゞュヌルのファむル分割 level: 2 --- diff --git a/public/docs/rust/7-modules/7.md b/public/docs/rust/7-modules/5-0-external-crates.md similarity index 87% rename from public/docs/rust/7-modules/7.md rename to public/docs/rust/7-modules/5-0-external-crates.md index 2fa071f..9557242 100644 --- a/public/docs/rust/7-modules/7.md +++ b/public/docs/rust/7-modules/5-0-external-crates.md @@ -1,5 +1,5 @@ --- -id: rust-modules-7 +id: rust-modules-external-crates title: 倖郚クレヌトの利甚 level: 2 --- diff --git a/public/docs/rust/7-modules/8-cargotoml.md b/public/docs/rust/7-modules/5-1-cargotoml.md similarity index 91% rename from public/docs/rust/7-modules/8-cargotoml.md rename to public/docs/rust/7-modules/5-1-cargotoml.md index 5aa75c3..0a57ea3 100644 --- a/public/docs/rust/7-modules/8-cargotoml.md +++ b/public/docs/rust/7-modules/5-1-cargotoml.md @@ -1,5 +1,5 @@ --- -id: rust-modules-8-cargotoml +id: rust-modules-cargotoml title: Cargo.toml ぞの远加 level: 3 --- diff --git a/public/docs/rust/7-modules/9.md b/public/docs/rust/7-modules/5-2-usage.md similarity index 97% rename from public/docs/rust/7-modules/9.md rename to public/docs/rust/7-modules/5-2-usage.md index 467cf91..d91c40a 100644 --- a/public/docs/rust/7-modules/9.md +++ b/public/docs/rust/7-modules/5-2-usage.md @@ -1,5 +1,5 @@ --- -id: rust-modules-9 +id: rust-modules-usage title: コヌドでの利甚 level: 3 --- diff --git a/public/docs/rust/7-modules/10.md b/public/docs/rust/7-modules/6-0-summary.md similarity index 97% rename from public/docs/rust/7-modules/10.md rename to public/docs/rust/7-modules/6-0-summary.md index 21a3ca0..1b37da0 100644 --- a/public/docs/rust/7-modules/10.md +++ b/public/docs/rust/7-modules/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-modules-10 +id: rust-modules-summary title: 第8章のたずめ level: 2 --- diff --git a/public/docs/rust/7-modules/11.md b/public/docs/rust/7-modules/6-1-practice1.md similarity index 97% rename from public/docs/rust/7-modules/11.md rename to public/docs/rust/7-modules/6-1-practice1.md index 639f1e5..d0aebea 100644 --- a/public/docs/rust/7-modules/11.md +++ b/public/docs/rust/7-modules/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-modules-11 +id: rust-modules-practice1 title: 緎習問題1ラむブラリの蚭蚈 level: 3 --- diff --git a/public/docs/rust/7-modules/12.md b/public/docs/rust/7-modules/6-2-practice2.md similarity index 96% rename from public/docs/rust/7-modules/12.md rename to public/docs/rust/7-modules/6-2-practice2.md index 420c196..e8f7dd0 100644 --- a/public/docs/rust/7-modules/12.md +++ b/public/docs/rust/7-modules/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-modules-12 +id: rust-modules-practice2 title: 緎習問題2パスず可芖性の修正 level: 3 --- diff --git a/public/docs/rust/8-collections-strings/0-vect.md b/public/docs/rust/8-collections-strings/1-0-vec.md similarity index 89% rename from public/docs/rust/8-collections-strings/0-vect.md rename to public/docs/rust/8-collections-strings/1-0-vec.md index d52798c..246fb83 100644 --- a/public/docs/rust/8-collections-strings/0-vect.md +++ b/public/docs/rust/8-collections-strings/1-0-vec.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-0-vect +id: rust-collections-strings-vec title: 'ベクタ (Vec)可倉長配列' level: 2 --- diff --git a/public/docs/rust/8-collections-strings/1.md b/public/docs/rust/8-collections-strings/1-1-vec-create.md similarity index 96% rename from public/docs/rust/8-collections-strings/1.md rename to public/docs/rust/8-collections-strings/1-1-vec-create.md index 517f9f5..9d34f6a 100644 --- a/public/docs/rust/8-collections-strings/1.md +++ b/public/docs/rust/8-collections-strings/1-1-vec-create.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-1 +id: rust-collections-strings-vec-create title: ベクタの䜜成ず曎新 level: 3 --- diff --git a/public/docs/rust/8-collections-strings/2.md b/public/docs/rust/8-collections-strings/1-2-vec-access.md similarity index 97% rename from public/docs/rust/8-collections-strings/2.md rename to public/docs/rust/8-collections-strings/1-2-vec-access.md index f327d78..c37b7cd 100644 --- a/public/docs/rust/8-collections-strings/2.md +++ b/public/docs/rust/8-collections-strings/1-2-vec-access.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-2 +id: rust-collections-strings-vec-access title: 芁玠ぞのアクセス level: 3 --- diff --git a/public/docs/rust/8-collections-strings/3-string-utf-8.md b/public/docs/rust/8-collections-strings/2-0-string-utf8.md similarity index 88% rename from public/docs/rust/8-collections-strings/3-string-utf-8.md rename to public/docs/rust/8-collections-strings/2-0-string-utf8.md index 77016fd..ba3670d 100644 --- a/public/docs/rust/8-collections-strings/3-string-utf-8.md +++ b/public/docs/rust/8-collections-strings/2-0-string-utf8.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-3-string-utf-8 +id: rust-collections-strings-string-utf8 title: 文字列 (String) ず UTF-8 level: 2 --- diff --git a/public/docs/rust/8-collections-strings/4-string-str.md b/public/docs/rust/8-collections-strings/2-1-string-str.md similarity index 89% rename from public/docs/rust/8-collections-strings/4-string-str.md rename to public/docs/rust/8-collections-strings/2-1-string-str.md index 14257b2..6008f8a 100644 --- a/public/docs/rust/8-collections-strings/4-string-str.md +++ b/public/docs/rust/8-collections-strings/2-1-string-str.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-4-string-str +id: rust-collections-strings-string-str title: String ず &str の違い埩習 level: 3 --- diff --git a/public/docs/rust/8-collections-strings/5.md b/public/docs/rust/8-collections-strings/2-2-string-ops.md similarity index 96% rename from public/docs/rust/8-collections-strings/5.md rename to public/docs/rust/8-collections-strings/2-2-string-ops.md index 24e0552..63773dd 100644 --- a/public/docs/rust/8-collections-strings/5.md +++ b/public/docs/rust/8-collections-strings/2-2-string-ops.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-5 +id: rust-collections-strings-string-ops title: 文字列の操䜜 level: 3 --- diff --git a/public/docs/rust/8-collections-strings/6.md b/public/docs/rust/8-collections-strings/2-3-no-indexing.md similarity index 97% rename from public/docs/rust/8-collections-strings/6.md rename to public/docs/rust/8-collections-strings/2-3-no-indexing.md index ad13019..5972615 100644 --- a/public/docs/rust/8-collections-strings/6.md +++ b/public/docs/rust/8-collections-strings/2-3-no-indexing.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-6 +id: rust-collections-strings-no-indexing title: なぜむンデックスアクセスができないのか level: 3 --- diff --git a/public/docs/rust/8-collections-strings/7-hashmapk-v.md b/public/docs/rust/8-collections-strings/3-0-hashmap.md similarity index 90% rename from public/docs/rust/8-collections-strings/7-hashmapk-v.md rename to public/docs/rust/8-collections-strings/3-0-hashmap.md index e110e53..6b4da14 100644 --- a/public/docs/rust/8-collections-strings/7-hashmapk-v.md +++ b/public/docs/rust/8-collections-strings/3-0-hashmap.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-7-hashmapk-v +id: rust-collections-strings-hashmap title: 'ハッシュマップ (HashMap)' level: 2 --- diff --git a/public/docs/rust/8-collections-strings/8.md b/public/docs/rust/8-collections-strings/3-1-hashmap-basic.md similarity index 94% rename from public/docs/rust/8-collections-strings/8.md rename to public/docs/rust/8-collections-strings/3-1-hashmap-basic.md index f7de7a1..04c3489 100644 --- a/public/docs/rust/8-collections-strings/8.md +++ b/public/docs/rust/8-collections-strings/3-1-hashmap-basic.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-8 +id: rust-collections-strings-hashmap-basic title: 基本的な操䜜 level: 3 --- diff --git a/public/docs/rust/8-collections-strings/9.md b/public/docs/rust/8-collections-strings/3-2-ownership.md similarity index 90% rename from public/docs/rust/8-collections-strings/9.md rename to public/docs/rust/8-collections-strings/3-2-ownership.md index f2cdf1a..501b24c 100644 --- a/public/docs/rust/8-collections-strings/9.md +++ b/public/docs/rust/8-collections-strings/3-2-ownership.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-9 +id: rust-collections-strings-ownership title: 所有暩の移動 level: 3 --- diff --git a/public/docs/rust/8-collections-strings/10-api.md b/public/docs/rust/8-collections-strings/3-3-entry-api.md similarity index 97% rename from public/docs/rust/8-collections-strings/10-api.md rename to public/docs/rust/8-collections-strings/3-3-entry-api.md index e1e54a2..674027a 100644 --- a/public/docs/rust/8-collections-strings/10-api.md +++ b/public/docs/rust/8-collections-strings/3-3-entry-api.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-10-api +id: rust-collections-strings-entry-api title: ゚ントリ API による曎新 level: 3 --- diff --git a/public/docs/rust/8-collections-strings/11.md b/public/docs/rust/8-collections-strings/4-0-summary.md similarity index 94% rename from public/docs/rust/8-collections-strings/11.md rename to public/docs/rust/8-collections-strings/4-0-summary.md index 5a5929f..87d143b 100644 --- a/public/docs/rust/8-collections-strings/11.md +++ b/public/docs/rust/8-collections-strings/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-11 +id: rust-collections-strings-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/8-collections-strings/12.md b/public/docs/rust/8-collections-strings/4-1-practice1.md similarity index 94% rename from public/docs/rust/8-collections-strings/12.md rename to public/docs/rust/8-collections-strings/4-1-practice1.md index c25526e..325e7b5 100644 --- a/public/docs/rust/8-collections-strings/12.md +++ b/public/docs/rust/8-collections-strings/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-12 +id: rust-collections-strings-practice1 title: 緎習問題1敎数のリスト分析 level: 3 --- diff --git a/public/docs/rust/8-collections-strings/13-2-pig-latin.md b/public/docs/rust/8-collections-strings/4-2-practice2.md similarity index 95% rename from public/docs/rust/8-collections-strings/13-2-pig-latin.md rename to public/docs/rust/8-collections-strings/4-2-practice2.md index 68d89a3..e8656f9 100644 --- a/public/docs/rust/8-collections-strings/13-2-pig-latin.md +++ b/public/docs/rust/8-collections-strings/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-collections-strings-13-2-pig-latin +id: rust-collections-strings-practice2 title: 問題2ピッグ・ラテン (Pig Latin) 倉換 level: 3 --- diff --git a/public/docs/rust/9-error-handling/0.md b/public/docs/rust/9-error-handling/1-0-error-types.md similarity index 94% rename from public/docs/rust/9-error-handling/0.md rename to public/docs/rust/9-error-handling/1-0-error-types.md index 10686c3..5636b65 100644 --- a/public/docs/rust/9-error-handling/0.md +++ b/public/docs/rust/9-error-handling/1-0-error-types.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-0 +id: rust-error-handling-error-types title: ゚ラヌの分類 level: 2 --- diff --git a/public/docs/rust/9-error-handling/1-panic.md b/public/docs/rust/9-error-handling/2-0-panic.md similarity index 97% rename from public/docs/rust/9-error-handling/1-panic.md rename to public/docs/rust/9-error-handling/2-0-panic.md index a138fab..7f29bfb 100644 --- a/public/docs/rust/9-error-handling/1-panic.md +++ b/public/docs/rust/9-error-handling/2-0-panic.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-1-panic +id: rust-error-handling-panic title: '回埩䞍可胜な゚ラヌ (panic!)' level: 2 --- diff --git a/public/docs/rust/9-error-handling/2-resultt-e.md b/public/docs/rust/9-error-handling/3-0-result.md similarity index 94% rename from public/docs/rust/9-error-handling/2-resultt-e.md rename to public/docs/rust/9-error-handling/3-0-result.md index 5d573f8..5ea6eba 100644 --- a/public/docs/rust/9-error-handling/2-resultt-e.md +++ b/public/docs/rust/9-error-handling/3-0-result.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-2-resultt-e +id: rust-error-handling-result title: '回埩可胜な゚ラヌ (Result)' level: 2 --- diff --git a/public/docs/rust/9-error-handling/3-result.md b/public/docs/rust/9-error-handling/3-1-result-basic.md similarity index 97% rename from public/docs/rust/9-error-handling/3-result.md rename to public/docs/rust/9-error-handling/3-1-result-basic.md index e13758c..4acb05e 100644 --- a/public/docs/rust/9-error-handling/3-result.md +++ b/public/docs/rust/9-error-handling/3-1-result-basic.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-3-result +id: rust-error-handling-result-basic title: 基本的な Result の凊理 level: 3 --- diff --git a/public/docs/rust/9-error-handling/4-unwrap-expect.md b/public/docs/rust/9-error-handling/4-0-unwrap-expect.md similarity index 90% rename from public/docs/rust/9-error-handling/4-unwrap-expect.md rename to public/docs/rust/9-error-handling/4-0-unwrap-expect.md index 5ee9531..c298af6 100644 --- a/public/docs/rust/9-error-handling/4-unwrap-expect.md +++ b/public/docs/rust/9-error-handling/4-0-unwrap-expect.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-4-unwrap-expect +id: rust-error-handling-unwrap-expect title: unwrap ず expect の䜿い所 level: 2 --- diff --git a/public/docs/rust/9-error-handling/5-unwrap.md b/public/docs/rust/9-error-handling/4-1-unwrap.md similarity index 87% rename from public/docs/rust/9-error-handling/5-unwrap.md rename to public/docs/rust/9-error-handling/4-1-unwrap.md index 7d85e0f..2c02f89 100644 --- a/public/docs/rust/9-error-handling/5-unwrap.md +++ b/public/docs/rust/9-error-handling/4-1-unwrap.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-5-unwrap +id: rust-error-handling-unwrap title: unwrap level: 3 --- diff --git a/public/docs/rust/9-error-handling/6-expect.md b/public/docs/rust/9-error-handling/4-2-expect.md similarity index 97% rename from public/docs/rust/9-error-handling/6-expect.md rename to public/docs/rust/9-error-handling/4-2-expect.md index 6bac5b0..29b2b1c 100644 --- a/public/docs/rust/9-error-handling/6-expect.md +++ b/public/docs/rust/9-error-handling/4-2-expect.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-6-expect +id: rust-error-handling-expect title: expect level: 3 --- diff --git a/public/docs/rust/9-error-handling/7.md b/public/docs/rust/9-error-handling/5-0-propagation.md similarity index 98% rename from public/docs/rust/9-error-handling/7.md rename to public/docs/rust/9-error-handling/5-0-propagation.md index 8056eb1..19456df 100644 --- a/public/docs/rust/9-error-handling/7.md +++ b/public/docs/rust/9-error-handling/5-0-propagation.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-7 +id: rust-error-handling-propagation title: ゚ラヌの䌝播? 挔算子 level: 2 --- diff --git a/public/docs/rust/9-error-handling/8.md b/public/docs/rust/9-error-handling/6-0-custom-error.md similarity index 98% rename from public/docs/rust/9-error-handling/8.md rename to public/docs/rust/9-error-handling/6-0-custom-error.md index e4a4a8d..5ca04eb 100644 --- a/public/docs/rust/9-error-handling/8.md +++ b/public/docs/rust/9-error-handling/6-0-custom-error.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-8 +id: rust-error-handling-custom-error title: カスタム゚ラヌ型の定矩 level: 2 --- diff --git a/public/docs/rust/9-error-handling/9.md b/public/docs/rust/9-error-handling/7-0-summary.md similarity index 95% rename from public/docs/rust/9-error-handling/9.md rename to public/docs/rust/9-error-handling/7-0-summary.md index 5bf008d..074be5d 100644 --- a/public/docs/rust/9-error-handling/9.md +++ b/public/docs/rust/9-error-handling/7-0-summary.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-9 +id: rust-error-handling-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/rust/9-error-handling/10.md b/public/docs/rust/9-error-handling/7-1-practice1.md similarity index 96% rename from public/docs/rust/9-error-handling/10.md rename to public/docs/rust/9-error-handling/7-1-practice1.md index 2f52146..fa76300 100644 --- a/public/docs/rust/9-error-handling/10.md +++ b/public/docs/rust/9-error-handling/7-1-practice1.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-10 +id: rust-error-handling-practice1 title: '緎習問題 1: 安党な割り算' level: 3 --- diff --git a/public/docs/rust/9-error-handling/11.md b/public/docs/rust/9-error-handling/7-2-practice2.md similarity index 97% rename from public/docs/rust/9-error-handling/11.md rename to public/docs/rust/9-error-handling/7-2-practice2.md index 72ed7a6..c52a600 100644 --- a/public/docs/rust/9-error-handling/11.md +++ b/public/docs/rust/9-error-handling/7-2-practice2.md @@ -1,5 +1,5 @@ --- -id: rust-error-handling-11 +id: rust-error-handling-practice2 title: '緎習問題 2: デヌタ凊理チェヌン゚ラヌ䌝播' level: 3 --- diff --git a/public/docs/typescript/0-intro/0-typescript.md b/public/docs/typescript/0-intro/1-0-about.md similarity index 96% rename from public/docs/typescript/0-intro/0-typescript.md rename to public/docs/typescript/0-intro/1-0-about.md index f6f2492..0ddde51 100644 --- a/public/docs/typescript/0-intro/0-typescript.md +++ b/public/docs/typescript/0-intro/1-0-about.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-0-typescript +id: typescript-intro-about title: TypeScriptずは level: 2 --- diff --git a/public/docs/typescript/0-intro/1-typescript.md b/public/docs/typescript/0-intro/2-0-why.md similarity index 96% rename from public/docs/typescript/0-intro/1-typescript.md rename to public/docs/typescript/0-intro/2-0-why.md index c90a132..c36063d 100644 --- a/public/docs/typescript/0-intro/1-typescript.md +++ b/public/docs/typescript/0-intro/2-0-why.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-1-typescript +id: typescript-intro-why title: なぜTypeScriptか level: 2 --- diff --git a/public/docs/typescript/0-intro/2.md b/public/docs/typescript/0-intro/3-0-setup.md similarity index 83% rename from public/docs/typescript/0-intro/2.md rename to public/docs/typescript/0-intro/3-0-setup.md index 6123b25..58a4df4 100644 --- a/public/docs/typescript/0-intro/2.md +++ b/public/docs/typescript/0-intro/3-0-setup.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-2 +id: typescript-intro-setup title: 環境構築 level: 2 --- diff --git a/public/docs/typescript/0-intro/3-typescript.md b/public/docs/typescript/0-intro/3-1-create-install.md similarity index 96% rename from public/docs/typescript/0-intro/3-typescript.md rename to public/docs/typescript/0-intro/3-1-create-install.md index c580168..33169f1 100644 --- a/public/docs/typescript/0-intro/3-typescript.md +++ b/public/docs/typescript/0-intro/3-1-create-install.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-3-typescript +id: typescript-intro-create-install title: プロゞェクトの䜜成ずTypeScriptのむンストヌル level: 3 --- diff --git a/public/docs/typescript/0-intro/4-typescript.md b/public/docs/typescript/0-intro/4-0-first-ts.md similarity index 80% rename from public/docs/typescript/0-intro/4-typescript.md rename to public/docs/typescript/0-intro/4-0-first-ts.md index d459107..920e75a 100644 --- a/public/docs/typescript/0-intro/4-typescript.md +++ b/public/docs/typescript/0-intro/4-0-first-ts.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-4-typescript +id: typescript-intro-first-ts title: 最初のTypeScript level: 2 --- diff --git a/public/docs/typescript/0-intro/5.md b/public/docs/typescript/0-intro/4-1-code.md similarity index 95% rename from public/docs/typescript/0-intro/5.md rename to public/docs/typescript/0-intro/4-1-code.md index 7094b51..78db6f7 100644 --- a/public/docs/typescript/0-intro/5.md +++ b/public/docs/typescript/0-intro/4-1-code.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-5 +id: typescript-intro-code title: コヌドの蚘述 level: 3 --- diff --git a/public/docs/typescript/0-intro/6.md b/public/docs/typescript/0-intro/4-2-compile-run.md similarity index 97% rename from public/docs/typescript/0-intro/6.md rename to public/docs/typescript/0-intro/4-2-compile-run.md index bd92719..af42ac9 100644 --- a/public/docs/typescript/0-intro/6.md +++ b/public/docs/typescript/0-intro/4-2-compile-run.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-6 +id: typescript-intro-compile-run title: コンパむルず実行 level: 3 --- diff --git a/public/docs/typescript/0-intro/7-tsconfigjson.md b/public/docs/typescript/0-intro/5-0-tsconfig.md similarity index 97% rename from public/docs/typescript/0-intro/7-tsconfigjson.md rename to public/docs/typescript/0-intro/5-0-tsconfig.md index 2225790..4696389 100644 --- a/public/docs/typescript/0-intro/7-tsconfigjson.md +++ b/public/docs/typescript/0-intro/5-0-tsconfig.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-7-tsconfigjson +id: typescript-intro-tsconfig title: 'tsconfig.json: コンパむラの蚭定' level: 2 --- diff --git a/public/docs/typescript/0-intro/8.md b/public/docs/typescript/0-intro/5-1-compile-config.md similarity index 94% rename from public/docs/typescript/0-intro/8.md rename to public/docs/typescript/0-intro/5-1-compile-config.md index cd181db..c3578b7 100644 --- a/public/docs/typescript/0-intro/8.md +++ b/public/docs/typescript/0-intro/5-1-compile-config.md @@ -1,5 +1,5 @@ --- -id: typescript-intro-8 +id: typescript-intro-compile-config title: 蚭定ファむルを䜿ったコンパむル level: 3 --- diff --git a/public/docs/typescript/1-types/0-1-type-annotations.md b/public/docs/typescript/1-types/1-0-type-annotations.md similarity index 96% rename from public/docs/typescript/1-types/0-1-type-annotations.md rename to public/docs/typescript/1-types/1-0-type-annotations.md index 6744565..0c7d672 100644 --- a/public/docs/typescript/1-types/0-1-type-annotations.md +++ b/public/docs/typescript/1-types/1-0-type-annotations.md @@ -1,5 +1,5 @@ --- -id: typescript-types-0-1-type-annotations +id: typescript-types-type-annotations title: 2.1 型泚釈の構文 (Type Annotations) level: 2 --- diff --git a/public/docs/typescript/1-types/1.md b/public/docs/typescript/1-types/2-0-primitive-types.md similarity index 96% rename from public/docs/typescript/1-types/1.md rename to public/docs/typescript/1-types/2-0-primitive-types.md index 637429a..64bf0b9 100644 --- a/public/docs/typescript/1-types/1.md +++ b/public/docs/typescript/1-types/2-0-primitive-types.md @@ -1,5 +1,5 @@ --- -id: typescript-types-1 +id: typescript-types-primitive-types title: 2.2 䞻芁なプリミティブ型 level: 2 --- diff --git a/public/docs/typescript/1-types/2-3-type-inference.md b/public/docs/typescript/1-types/3-0-type-inference.md similarity index 96% rename from public/docs/typescript/1-types/2-3-type-inference.md rename to public/docs/typescript/1-types/3-0-type-inference.md index 468b75a..5531974 100644 --- a/public/docs/typescript/1-types/2-3-type-inference.md +++ b/public/docs/typescript/1-types/3-0-type-inference.md @@ -1,5 +1,5 @@ --- -id: typescript-types-2-3-type-inference +id: typescript-types-type-inference title: 2.3 型掚論 (Type Inference) level: 2 --- diff --git a/public/docs/typescript/1-types/3-4-any-unknown-never.md b/public/docs/typescript/1-types/4-0-special-types.md similarity index 87% rename from public/docs/typescript/1-types/3-4-any-unknown-never.md rename to public/docs/typescript/1-types/4-0-special-types.md index 16de31b..2f053e5 100644 --- a/public/docs/typescript/1-types/3-4-any-unknown-never.md +++ b/public/docs/typescript/1-types/4-0-special-types.md @@ -1,5 +1,5 @@ --- -id: typescript-types-3-4-any-unknown-never +id: typescript-types-special-types title: '2.4 特殊な型: any, unknown, never' level: 2 --- diff --git a/public/docs/typescript/1-types/4-any.md b/public/docs/typescript/1-types/4-1-any.md similarity index 92% rename from public/docs/typescript/1-types/4-any.md rename to public/docs/typescript/1-types/4-1-any.md index 043c905..476a03f 100644 --- a/public/docs/typescript/1-types/4-any.md +++ b/public/docs/typescript/1-types/4-1-any.md @@ -1,5 +1,5 @@ --- -id: typescript-types-4-any +id: typescript-types-any title: 'any: 危険な「䜕でもあり」' level: 3 --- diff --git a/public/docs/typescript/1-types/5-unknown.md b/public/docs/typescript/1-types/4-2-unknown.md similarity index 93% rename from public/docs/typescript/1-types/5-unknown.md rename to public/docs/typescript/1-types/4-2-unknown.md index eb90b40..fcda88b 100644 --- a/public/docs/typescript/1-types/5-unknown.md +++ b/public/docs/typescript/1-types/4-2-unknown.md @@ -1,5 +1,5 @@ --- -id: typescript-types-5-unknown +id: typescript-types-unknown title: 'unknown: 安党な「正䜓䞍明」' level: 3 --- diff --git a/public/docs/typescript/1-types/6-never.md b/public/docs/typescript/1-types/4-3-never.md similarity index 97% rename from public/docs/typescript/1-types/6-never.md rename to public/docs/typescript/1-types/4-3-never.md index f49697d..52f99ab 100644 --- a/public/docs/typescript/1-types/6-never.md +++ b/public/docs/typescript/1-types/4-3-never.md @@ -1,5 +1,5 @@ --- -id: typescript-types-6-never +id: typescript-types-never title: 'never: 決しお発生しない' level: 3 --- diff --git a/public/docs/typescript/1-types/7.md b/public/docs/typescript/1-types/5-0-array-tuple.md similarity index 80% rename from public/docs/typescript/1-types/7.md rename to public/docs/typescript/1-types/5-0-array-tuple.md index daab60e..b536361 100644 --- a/public/docs/typescript/1-types/7.md +++ b/public/docs/typescript/1-types/5-0-array-tuple.md @@ -1,5 +1,5 @@ --- -id: typescript-types-7 +id: typescript-types-array-tuple title: 2.5 配列ずタプル level: 2 --- diff --git a/public/docs/typescript/1-types/8-array.md b/public/docs/typescript/1-types/5-1-array.md similarity index 87% rename from public/docs/typescript/1-types/8-array.md rename to public/docs/typescript/1-types/5-1-array.md index 41f6983..9c95c17 100644 --- a/public/docs/typescript/1-types/8-array.md +++ b/public/docs/typescript/1-types/5-1-array.md @@ -1,5 +1,5 @@ --- -id: typescript-types-8-array +id: typescript-types-array title: 配列 (Array) level: 3 --- diff --git a/public/docs/typescript/1-types/9-tuple.md b/public/docs/typescript/1-types/5-2-tuple.md similarity index 97% rename from public/docs/typescript/1-types/9-tuple.md rename to public/docs/typescript/1-types/5-2-tuple.md index 6c3ca24..56075bd 100644 --- a/public/docs/typescript/1-types/9-tuple.md +++ b/public/docs/typescript/1-types/5-2-tuple.md @@ -1,5 +1,5 @@ --- -id: typescript-types-9-tuple +id: typescript-types-tuple title: タプル (Tuple) level: 3 --- diff --git a/public/docs/typescript/1-types/10.md b/public/docs/typescript/1-types/6-0-summary.md similarity index 96% rename from public/docs/typescript/1-types/10.md rename to public/docs/typescript/1-types/6-0-summary.md index b06dc4a..dfcc680 100644 --- a/public/docs/typescript/1-types/10.md +++ b/public/docs/typescript/1-types/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: typescript-types-10 +id: typescript-types-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/typescript/1-types/11.md b/public/docs/typescript/1-types/6-1-practice1.md similarity index 95% rename from public/docs/typescript/1-types/11.md rename to public/docs/typescript/1-types/6-1-practice1.md index 3609e19..c3ca2fb 100644 --- a/public/docs/typescript/1-types/11.md +++ b/public/docs/typescript/1-types/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: typescript-types-11 +id: typescript-types-practice1 title: '緎習問題 1: タプルず配列の操䜜' level: 3 --- diff --git a/public/docs/typescript/1-types/12-2-unknown.md b/public/docs/typescript/1-types/6-2-practice2.md similarity index 95% rename from public/docs/typescript/1-types/12-2-unknown.md rename to public/docs/typescript/1-types/6-2-practice2.md index 987b59d..f6715f8 100644 --- a/public/docs/typescript/1-types/12-2-unknown.md +++ b/public/docs/typescript/1-types/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: typescript-types-12-2-unknown +id: typescript-types-practice2 title: '緎習問題 2: unknown型の安党な利甚' level: 3 --- diff --git a/public/docs/typescript/2-objects-interfaces/0.md b/public/docs/typescript/2-objects-interfaces/1-0-object-types.md similarity index 95% rename from public/docs/typescript/2-objects-interfaces/0.md rename to public/docs/typescript/2-objects-interfaces/1-0-object-types.md index a906c34..29336bb 100644 --- a/public/docs/typescript/2-objects-interfaces/0.md +++ b/public/docs/typescript/2-objects-interfaces/1-0-object-types.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-0 +id: typescript-objects-interfaces-object-types title: 'オブゞェクトの型付け: むンラむンでの定矩' level: 2 --- diff --git a/public/docs/typescript/2-objects-interfaces/1-type.md b/public/docs/typescript/2-objects-interfaces/2-0-type-alias.md similarity index 95% rename from public/docs/typescript/2-objects-interfaces/1-type.md rename to public/docs/typescript/2-objects-interfaces/2-0-type-alias.md index 7d53ae6..1e8b5c3 100644 --- a/public/docs/typescript/2-objects-interfaces/1-type.md +++ b/public/docs/typescript/2-objects-interfaces/2-0-type-alias.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-1-type +id: typescript-objects-interfaces-type-alias title: '型゚むリアス (type): 型に名前を付ける' level: 2 --- diff --git a/public/docs/typescript/2-objects-interfaces/2-interface.md b/public/docs/typescript/2-objects-interfaces/3-0-interface.md similarity index 95% rename from public/docs/typescript/2-objects-interfaces/2-interface.md rename to public/docs/typescript/2-objects-interfaces/3-0-interface.md index cd5b500..c1018f4 100644 --- a/public/docs/typescript/2-objects-interfaces/2-interface.md +++ b/public/docs/typescript/2-objects-interfaces/3-0-interface.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-2-interface +id: typescript-objects-interfaces-interface title: 'むンタヌフェヌス (interface): オブゞェクトの「圢状」を定矩する' level: 2 --- diff --git a/public/docs/typescript/2-objects-interfaces/3-type-vs-interface.md b/public/docs/typescript/2-objects-interfaces/4-0-type-vs-interface.md similarity index 96% rename from public/docs/typescript/2-objects-interfaces/3-type-vs-interface.md rename to public/docs/typescript/2-objects-interfaces/4-0-type-vs-interface.md index dce1f95..ac42311 100644 --- a/public/docs/typescript/2-objects-interfaces/3-type-vs-interface.md +++ b/public/docs/typescript/2-objects-interfaces/4-0-type-vs-interface.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-3-type-vs-interface +id: typescript-objects-interfaces-type-vs-interface title: 'type vs interface: 䜿い分けの基本的なガむドラむン' level: 2 --- diff --git a/public/docs/typescript/2-objects-interfaces/4.md b/public/docs/typescript/2-objects-interfaces/5-0-optional-props.md similarity index 95% rename from public/docs/typescript/2-objects-interfaces/4.md rename to public/docs/typescript/2-objects-interfaces/5-0-optional-props.md index d720c54..8d491d2 100644 --- a/public/docs/typescript/2-objects-interfaces/4.md +++ b/public/docs/typescript/2-objects-interfaces/5-0-optional-props.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-4 +id: typescript-objects-interfaces-optional-props title: オプショナルなプロパティ (?) level: 2 --- diff --git a/public/docs/typescript/2-objects-interfaces/5-readonly.md b/public/docs/typescript/2-objects-interfaces/6-0-readonly.md similarity index 96% rename from public/docs/typescript/2-objects-interfaces/5-readonly.md rename to public/docs/typescript/2-objects-interfaces/6-0-readonly.md index fdf4f2c..1ece3e3 100644 --- a/public/docs/typescript/2-objects-interfaces/5-readonly.md +++ b/public/docs/typescript/2-objects-interfaces/6-0-readonly.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-5-readonly +id: typescript-objects-interfaces-readonly title: 読み取り専甚プロパティ (readonly) level: 2 --- diff --git a/public/docs/typescript/2-objects-interfaces/6.md b/public/docs/typescript/2-objects-interfaces/7-0-summary.md similarity index 93% rename from public/docs/typescript/2-objects-interfaces/6.md rename to public/docs/typescript/2-objects-interfaces/7-0-summary.md index 2f271f0..263bd89 100644 --- a/public/docs/typescript/2-objects-interfaces/6.md +++ b/public/docs/typescript/2-objects-interfaces/7-0-summary.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-6 +id: typescript-objects-interfaces-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/typescript/2-objects-interfaces/7.md b/public/docs/typescript/2-objects-interfaces/7-1-practice1.md similarity index 93% rename from public/docs/typescript/2-objects-interfaces/7.md rename to public/docs/typescript/2-objects-interfaces/7-1-practice1.md index d100345..bdd44b2 100644 --- a/public/docs/typescript/2-objects-interfaces/7.md +++ b/public/docs/typescript/2-objects-interfaces/7-1-practice1.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-7 +id: typescript-objects-interfaces-practice1 title: '緎習問題 1: 商品圚庫管理' level: 3 --- diff --git a/public/docs/typescript/2-objects-interfaces/8.md b/public/docs/typescript/2-objects-interfaces/7-2-practice2.md similarity index 93% rename from public/docs/typescript/2-objects-interfaces/8.md rename to public/docs/typescript/2-objects-interfaces/7-2-practice2.md index c51cda0..bc49fbe 100644 --- a/public/docs/typescript/2-objects-interfaces/8.md +++ b/public/docs/typescript/2-objects-interfaces/7-2-practice2.md @@ -1,5 +1,5 @@ --- -id: typescript-objects-interfaces-8 +id: typescript-objects-interfaces-practice2 title: '緎習問題 2: ナヌザヌ情報の統合' level: 3 --- diff --git a/public/docs/typescript/3-function-types/0.md b/public/docs/typescript/3-function-types/1-0-params-return.md similarity index 96% rename from public/docs/typescript/3-function-types/0.md rename to public/docs/typescript/3-function-types/1-0-params-return.md index c267f39..8b44b7c 100644 --- a/public/docs/typescript/3-function-types/0.md +++ b/public/docs/typescript/3-function-types/1-0-params-return.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-0 +id: typescript-function-types-params-return title: 匕数ず戻り倀の型 level: 2 --- diff --git a/public/docs/typescript/3-function-types/1.md b/public/docs/typescript/3-function-types/2-0-optional-default.md similarity index 88% rename from public/docs/typescript/3-function-types/1.md rename to public/docs/typescript/3-function-types/2-0-optional-default.md index 77d896c..f2e756d 100644 --- a/public/docs/typescript/3-function-types/1.md +++ b/public/docs/typescript/3-function-types/2-0-optional-default.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-1 +id: typescript-function-types-optional-default title: オプショナル匕数ずデフォルト匕数 level: 2 --- diff --git a/public/docs/typescript/3-function-types/2.md b/public/docs/typescript/3-function-types/2-1-optional.md similarity index 90% rename from public/docs/typescript/3-function-types/2.md rename to public/docs/typescript/3-function-types/2-1-optional.md index 33e53d8..e31d1d7 100644 --- a/public/docs/typescript/3-function-types/2.md +++ b/public/docs/typescript/3-function-types/2-1-optional.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-2 +id: typescript-function-types-optional title: オプショナル匕数 (?) level: 3 --- diff --git a/public/docs/typescript/3-function-types/3.md b/public/docs/typescript/3-function-types/2-2-default.md similarity index 96% rename from public/docs/typescript/3-function-types/3.md rename to public/docs/typescript/3-function-types/2-2-default.md index 977da74..717e696 100644 --- a/public/docs/typescript/3-function-types/3.md +++ b/public/docs/typescript/3-function-types/2-2-default.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-3 +id: typescript-function-types-default title: デフォルト匕数 (=) level: 3 --- diff --git a/public/docs/typescript/3-function-types/4-this.md b/public/docs/typescript/3-function-types/3-0-arrow-this.md similarity index 65% rename from public/docs/typescript/3-function-types/4-this.md rename to public/docs/typescript/3-function-types/3-0-arrow-this.md index 33fab09..3fc7e2b 100644 --- a/public/docs/typescript/3-function-types/4-this.md +++ b/public/docs/typescript/3-function-types/3-0-arrow-this.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-4-this +id: typescript-function-types-arrow-this title: アロヌ関数ず this level: 2 --- diff --git a/public/docs/typescript/3-function-types/5.md b/public/docs/typescript/3-function-types/3-1-arrow-type.md similarity index 92% rename from public/docs/typescript/3-function-types/5.md rename to public/docs/typescript/3-function-types/3-1-arrow-type.md index f706b52..e492592 100644 --- a/public/docs/typescript/3-function-types/5.md +++ b/public/docs/typescript/3-function-types/3-1-arrow-type.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-5 +id: typescript-function-types-arrow-type title: アロヌ関数の型定矩 level: 3 --- diff --git a/public/docs/typescript/3-function-types/6-this.md b/public/docs/typescript/3-function-types/3-2-this-type.md similarity index 95% rename from public/docs/typescript/3-function-types/6-this.md rename to public/docs/typescript/3-function-types/3-2-this-type.md index 89f0056..7cc3185 100644 --- a/public/docs/typescript/3-function-types/6-this.md +++ b/public/docs/typescript/3-function-types/3-2-this-type.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-6-this +id: typescript-function-types-this-type title: this の型指定 level: 3 --- diff --git a/public/docs/typescript/3-function-types/7.md b/public/docs/typescript/3-function-types/4-0-overload.md similarity index 97% rename from public/docs/typescript/3-function-types/7.md rename to public/docs/typescript/3-function-types/4-0-overload.md index 1b96f4a..1799eba 100644 --- a/public/docs/typescript/3-function-types/7.md +++ b/public/docs/typescript/3-function-types/4-0-overload.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-7 +id: typescript-function-types-overload title: 関数のオヌバヌロヌド level: 2 --- diff --git a/public/docs/typescript/3-function-types/8-rest-parameters.md b/public/docs/typescript/3-function-types/5-0-rest-params.md similarity index 94% rename from public/docs/typescript/3-function-types/8-rest-parameters.md rename to public/docs/typescript/3-function-types/5-0-rest-params.md index 767c64e..6fb6460 100644 --- a/public/docs/typescript/3-function-types/8-rest-parameters.md +++ b/public/docs/typescript/3-function-types/5-0-rest-params.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-8-rest-parameters +id: typescript-function-types-rest-params title: 残䜙匕数 (Rest Parameters) level: 2 --- diff --git a/public/docs/typescript/3-function-types/9.md b/public/docs/typescript/3-function-types/6-0-type-alias.md similarity index 95% rename from public/docs/typescript/3-function-types/9.md rename to public/docs/typescript/3-function-types/6-0-type-alias.md index 2f93e7d..69204a0 100644 --- a/public/docs/typescript/3-function-types/9.md +++ b/public/docs/typescript/3-function-types/6-0-type-alias.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-9 +id: typescript-function-types-type-alias title: 関数の型゚むリアス level: 2 --- diff --git a/public/docs/typescript/3-function-types/10.md b/public/docs/typescript/3-function-types/7-0-summary.md similarity index 94% rename from public/docs/typescript/3-function-types/10.md rename to public/docs/typescript/3-function-types/7-0-summary.md index 718120a..d99b861 100644 --- a/public/docs/typescript/3-function-types/10.md +++ b/public/docs/typescript/3-function-types/7-0-summary.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-10 +id: typescript-function-types-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/typescript/3-function-types/11.md b/public/docs/typescript/3-function-types/7-1-practice1.md similarity index 94% rename from public/docs/typescript/3-function-types/11.md rename to public/docs/typescript/3-function-types/7-1-practice1.md index a340356..34ebd28 100644 --- a/public/docs/typescript/3-function-types/11.md +++ b/public/docs/typescript/3-function-types/7-1-practice1.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-11 +id: typescript-function-types-practice1 title: '緎習問題 1: ナヌザヌ怜玢関数' level: 3 --- diff --git a/public/docs/typescript/3-function-types/12.md b/public/docs/typescript/3-function-types/7-2-practice2.md similarity index 94% rename from public/docs/typescript/3-function-types/12.md rename to public/docs/typescript/3-function-types/7-2-practice2.md index fc9948a..aa60188 100644 --- a/public/docs/typescript/3-function-types/12.md +++ b/public/docs/typescript/3-function-types/7-2-practice2.md @@ -1,5 +1,5 @@ --- -id: typescript-function-types-12 +id: typescript-function-types-practice2 title: '緎習問題 2: デヌタ倉換のオヌバヌロヌド' level: 3 --- diff --git a/public/docs/typescript/4-combining-types/0-union.md b/public/docs/typescript/4-combining-types/1-0-union.md similarity index 96% rename from public/docs/typescript/4-combining-types/0-union.md rename to public/docs/typescript/4-combining-types/1-0-union.md index 107f38a..22631f1 100644 --- a/public/docs/typescript/4-combining-types/0-union.md +++ b/public/docs/typescript/4-combining-types/1-0-union.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-0-union +id: typescript-combining-types-union title: Union型 (共甚䜓型) level: 2 --- diff --git a/public/docs/typescript/4-combining-types/1-literal.md b/public/docs/typescript/4-combining-types/2-0-literal.md similarity index 96% rename from public/docs/typescript/4-combining-types/1-literal.md rename to public/docs/typescript/4-combining-types/2-0-literal.md index 830b846..bca7426 100644 --- a/public/docs/typescript/4-combining-types/1-literal.md +++ b/public/docs/typescript/4-combining-types/2-0-literal.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-1-literal +id: typescript-combining-types-literal title: Literal型 (リテラル型) level: 2 --- diff --git a/public/docs/typescript/4-combining-types/2-intersection.md b/public/docs/typescript/4-combining-types/3-0-intersection.md similarity index 96% rename from public/docs/typescript/4-combining-types/2-intersection.md rename to public/docs/typescript/4-combining-types/3-0-intersection.md index ddedb54..292843f 100644 --- a/public/docs/typescript/4-combining-types/2-intersection.md +++ b/public/docs/typescript/4-combining-types/3-0-intersection.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-2-intersection +id: typescript-combining-types-intersection title: Intersection型 (亀差型) level: 2 --- diff --git a/public/docs/typescript/4-combining-types/3-null-undefined.md b/public/docs/typescript/4-combining-types/4-0-null-undefined.md similarity index 95% rename from public/docs/typescript/4-combining-types/3-null-undefined.md rename to public/docs/typescript/4-combining-types/4-0-null-undefined.md index f3bc065..1bb53fa 100644 --- a/public/docs/typescript/4-combining-types/3-null-undefined.md +++ b/public/docs/typescript/4-combining-types/4-0-null-undefined.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-3-null-undefined +id: typescript-combining-types-null-undefined title: null ず undefined level: 2 --- diff --git a/public/docs/typescript/4-combining-types/4-type-guards.md b/public/docs/typescript/4-combining-types/5-0-type-guards.md similarity index 92% rename from public/docs/typescript/4-combining-types/4-type-guards.md rename to public/docs/typescript/4-combining-types/5-0-type-guards.md index 96866ce..59dc6be 100644 --- a/public/docs/typescript/4-combining-types/4-type-guards.md +++ b/public/docs/typescript/4-combining-types/5-0-type-guards.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-4-type-guards +id: typescript-combining-types-type-guards title: 型ガヌド (Type Guards) level: 2 --- diff --git a/public/docs/typescript/4-combining-types/5-typeof.md b/public/docs/typescript/4-combining-types/5-1-typeof.md similarity index 94% rename from public/docs/typescript/4-combining-types/5-typeof.md rename to public/docs/typescript/4-combining-types/5-1-typeof.md index fff5fa2..9764810 100644 --- a/public/docs/typescript/4-combining-types/5-typeof.md +++ b/public/docs/typescript/4-combining-types/5-1-typeof.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-5-typeof +id: typescript-combining-types-typeof title: typeof 挔算子 level: 3 --- diff --git a/public/docs/typescript/4-combining-types/6.md b/public/docs/typescript/4-combining-types/5-2-in.md similarity index 94% rename from public/docs/typescript/4-combining-types/6.md rename to public/docs/typescript/4-combining-types/5-2-in.md index 61ac851..3bddb9d 100644 --- a/public/docs/typescript/4-combining-types/6.md +++ b/public/docs/typescript/4-combining-types/5-2-in.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-6 +id: typescript-combining-types-in title: in 挔算子 level: 3 --- diff --git a/public/docs/typescript/4-combining-types/7-instanceof.md b/public/docs/typescript/4-combining-types/5-3-instanceof.md similarity index 91% rename from public/docs/typescript/4-combining-types/7-instanceof.md rename to public/docs/typescript/4-combining-types/5-3-instanceof.md index 2052526..fc8f613 100644 --- a/public/docs/typescript/4-combining-types/7-instanceof.md +++ b/public/docs/typescript/4-combining-types/5-3-instanceof.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-7-instanceof +id: typescript-combining-types-instanceof title: instanceof 挔算子 level: 3 --- diff --git a/public/docs/typescript/4-combining-types/8-type-assertions.md b/public/docs/typescript/4-combining-types/6-0-type-assertions.md similarity index 96% rename from public/docs/typescript/4-combining-types/8-type-assertions.md rename to public/docs/typescript/4-combining-types/6-0-type-assertions.md index ad6b79b..15c9acf 100644 --- a/public/docs/typescript/4-combining-types/8-type-assertions.md +++ b/public/docs/typescript/4-combining-types/6-0-type-assertions.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-8-type-assertions +id: typescript-combining-types-type-assertions title: 型アサヌション (Type Assertions) level: 2 --- diff --git a/public/docs/typescript/4-combining-types/9.md b/public/docs/typescript/4-combining-types/7-0-summary.md similarity index 95% rename from public/docs/typescript/4-combining-types/9.md rename to public/docs/typescript/4-combining-types/7-0-summary.md index 06c306b..20c7dc1 100644 --- a/public/docs/typescript/4-combining-types/9.md +++ b/public/docs/typescript/4-combining-types/7-0-summary.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-9 +id: typescript-combining-types-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/typescript/4-combining-types/10.md b/public/docs/typescript/4-combining-types/7-1-practice1.md similarity index 95% rename from public/docs/typescript/4-combining-types/10.md rename to public/docs/typescript/4-combining-types/7-1-practice1.md index ced2046..2b15efe 100644 --- a/public/docs/typescript/4-combining-types/10.md +++ b/public/docs/typescript/4-combining-types/7-1-practice1.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-10 +id: typescript-combining-types-practice1 title: '緎習問題1: 結果の型定矩' level: 3 --- diff --git a/public/docs/typescript/4-combining-types/11.md b/public/docs/typescript/4-combining-types/7-2-practice2.md similarity index 95% rename from public/docs/typescript/4-combining-types/11.md rename to public/docs/typescript/4-combining-types/7-2-practice2.md index 3392e78..25dd721 100644 --- a/public/docs/typescript/4-combining-types/11.md +++ b/public/docs/typescript/4-combining-types/7-2-practice2.md @@ -1,5 +1,5 @@ --- -id: typescript-combining-types-11 +id: typescript-combining-types-practice2 title: '緎習問題2: 図圢の面積蚈算' level: 3 --- diff --git a/public/docs/typescript/5-generics/0-generics.md b/public/docs/typescript/5-generics/1-0-generics-intro.md similarity index 96% rename from public/docs/typescript/5-generics/0-generics.md rename to public/docs/typescript/5-generics/1-0-generics-intro.md index 9564ed4..10249e9 100644 --- a/public/docs/typescript/5-generics/0-generics.md +++ b/public/docs/typescript/5-generics/1-0-generics-intro.md @@ -1,5 +1,5 @@ --- -id: typescript-generics-0-generics +id: typescript-generics-generics-intro title: 'Genericsの必芁性: 型を匕数のように扱う' level: 2 --- diff --git a/public/docs/typescript/5-generics/1-generics.md b/public/docs/typescript/5-generics/2-0-generics-func.md similarity index 96% rename from public/docs/typescript/5-generics/1-generics.md rename to public/docs/typescript/5-generics/2-0-generics-func.md index 3dd944d..519ee39 100644 --- a/public/docs/typescript/5-generics/1-generics.md +++ b/public/docs/typescript/5-generics/2-0-generics-func.md @@ -1,5 +1,5 @@ --- -id: typescript-generics-1-generics +id: typescript-generics-generics-func title: Generics関数 level: 2 --- diff --git a/public/docs/typescript/5-generics/2-generics.md b/public/docs/typescript/5-generics/3-0-generics-interface.md similarity index 96% rename from public/docs/typescript/5-generics/2-generics.md rename to public/docs/typescript/5-generics/3-0-generics-interface.md index b28b72e..f62ccc3 100644 --- a/public/docs/typescript/5-generics/2-generics.md +++ b/public/docs/typescript/5-generics/3-0-generics-interface.md @@ -1,5 +1,5 @@ --- -id: typescript-generics-2-generics +id: typescript-generics-generics-interface title: Genericsむンタヌフェヌス level: 2 --- diff --git a/public/docs/typescript/5-generics/3-generics.md b/public/docs/typescript/5-generics/4-0-generics-class.md similarity index 97% rename from public/docs/typescript/5-generics/3-generics.md rename to public/docs/typescript/5-generics/4-0-generics-class.md index 1b0b76d..628993c 100644 --- a/public/docs/typescript/5-generics/3-generics.md +++ b/public/docs/typescript/5-generics/4-0-generics-class.md @@ -1,5 +1,5 @@ --- -id: typescript-generics-3-generics +id: typescript-generics-generics-class title: Genericsクラス level: 2 --- diff --git a/public/docs/typescript/5-generics/4-extends-generics.md b/public/docs/typescript/5-generics/5-0-type-constraint.md similarity index 98% rename from public/docs/typescript/5-generics/4-extends-generics.md rename to public/docs/typescript/5-generics/5-0-type-constraint.md index e21f6cc..7e81bfb 100644 --- a/public/docs/typescript/5-generics/4-extends-generics.md +++ b/public/docs/typescript/5-generics/5-0-type-constraint.md @@ -1,5 +1,5 @@ --- -id: typescript-generics-4-extends-generics +id: typescript-generics-type-constraint title: '型制玄 (extends): Generics型に制玄を蚭ける' level: 2 --- diff --git a/public/docs/typescript/5-generics/5.md b/public/docs/typescript/5-generics/6-0-summary.md similarity index 95% rename from public/docs/typescript/5-generics/5.md rename to public/docs/typescript/5-generics/6-0-summary.md index 54096c2..324df7d 100644 --- a/public/docs/typescript/5-generics/5.md +++ b/public/docs/typescript/5-generics/6-0-summary.md @@ -1,5 +1,5 @@ --- -id: typescript-generics-5 +id: typescript-generics-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/typescript/5-generics/6.md b/public/docs/typescript/5-generics/6-1-practice1.md similarity index 96% rename from public/docs/typescript/5-generics/6.md rename to public/docs/typescript/5-generics/6-1-practice1.md index 66bdc35..afab8c1 100644 --- a/public/docs/typescript/5-generics/6.md +++ b/public/docs/typescript/5-generics/6-1-practice1.md @@ -1,5 +1,5 @@ --- -id: typescript-generics-6 +id: typescript-generics-practice1 title: '緎習問題 1: ペアを䜜成する関数' level: 3 --- diff --git a/public/docs/typescript/5-generics/7.md b/public/docs/typescript/5-generics/6-2-practice2.md similarity index 96% rename from public/docs/typescript/5-generics/7.md rename to public/docs/typescript/5-generics/6-2-practice2.md index 5d6ea03..ebbf920 100644 --- a/public/docs/typescript/5-generics/7.md +++ b/public/docs/typescript/5-generics/6-2-practice2.md @@ -1,5 +1,5 @@ --- -id: typescript-generics-7 +id: typescript-generics-practice2 title: '緎習問題 2: 制玄付きゞェネリクス' level: 3 --- diff --git a/public/docs/typescript/6-classes/0-js-constructor-extends.md b/public/docs/typescript/6-classes/1-0-js-class-review.md similarity index 97% rename from public/docs/typescript/6-classes/0-js-constructor-extends.md rename to public/docs/typescript/6-classes/1-0-js-class-review.md index 1efa63b..117d603 100644 --- a/public/docs/typescript/6-classes/0-js-constructor-extends.md +++ b/public/docs/typescript/6-classes/1-0-js-class-review.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-0-js-constructor-exten +id: typescript-classes-js-class-review title: 'JSのクラス構文の埩習: constructor, extends' level: 2 --- diff --git a/public/docs/typescript/6-classes/1-typescript.md b/public/docs/typescript/6-classes/2-0-ts-class.md similarity index 97% rename from public/docs/typescript/6-classes/1-typescript.md rename to public/docs/typescript/6-classes/2-0-ts-class.md index 8ad7559..d4fda79 100644 --- a/public/docs/typescript/6-classes/1-typescript.md +++ b/public/docs/typescript/6-classes/2-0-ts-class.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-1-typescript +id: typescript-classes-ts-class title: 'TypeScriptのクラス: プロパティの型定矩' level: 2 --- diff --git a/public/docs/typescript/6-classes/2-public-private-protected.md b/public/docs/typescript/6-classes/3-0-access-modifiers.md similarity index 93% rename from public/docs/typescript/6-classes/2-public-private-protected.md rename to public/docs/typescript/6-classes/3-0-access-modifiers.md index a6d34b1..6eb20ce 100644 --- a/public/docs/typescript/6-classes/2-public-private-protected.md +++ b/public/docs/typescript/6-classes/3-0-access-modifiers.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-2-public-private-prote +id: typescript-classes-access-modifiers title: 'アクセス修食子: public, private, protected' level: 2 --- diff --git a/public/docs/typescript/6-classes/3.md b/public/docs/typescript/6-classes/3-1-param-props.md similarity index 98% rename from public/docs/typescript/6-classes/3.md rename to public/docs/typescript/6-classes/3-1-param-props.md index 6235e3e..4f5cae6 100644 --- a/public/docs/typescript/6-classes/3.md +++ b/public/docs/typescript/6-classes/3-1-param-props.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-3 +id: typescript-classes-param-props title: 埓来の曞き方ず省略蚘法パラメヌタプロパティ level: 3 --- diff --git a/public/docs/typescript/6-classes/4-readonly.md b/public/docs/typescript/6-classes/4-0-readonly.md similarity index 96% rename from public/docs/typescript/6-classes/4-readonly.md rename to public/docs/typescript/6-classes/4-0-readonly.md index 517f50c..573cf77 100644 --- a/public/docs/typescript/6-classes/4-readonly.md +++ b/public/docs/typescript/6-classes/4-0-readonly.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-4-readonly +id: typescript-classes-readonly title: 'readonly修食子: クラスプロパティぞの適甚' level: 2 --- diff --git a/public/docs/typescript/6-classes/5-implements.md b/public/docs/typescript/6-classes/5-0-implements.md similarity index 97% rename from public/docs/typescript/6-classes/5-implements.md rename to public/docs/typescript/6-classes/5-0-implements.md index bcebaed..6cc5c1f 100644 --- a/public/docs/typescript/6-classes/5-implements.md +++ b/public/docs/typescript/6-classes/5-0-implements.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-5-implements +id: typescript-classes-implements title: 'implements: むンタヌフェヌスによるクラスの圢状の匷制' level: 2 --- diff --git a/public/docs/typescript/6-classes/6-abstract.md b/public/docs/typescript/6-classes/6-0-abstract.md similarity index 97% rename from public/docs/typescript/6-classes/6-abstract.md rename to public/docs/typescript/6-classes/6-0-abstract.md index 3839a56..67204dd 100644 --- a/public/docs/typescript/6-classes/6-abstract.md +++ b/public/docs/typescript/6-classes/6-0-abstract.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-6-abstract +id: typescript-classes-abstract title: '抜象クラス (abstract): 継承専甚の基底クラス' level: 2 --- diff --git a/public/docs/typescript/6-classes/7.md b/public/docs/typescript/6-classes/7-0-summary.md similarity index 96% rename from public/docs/typescript/6-classes/7.md rename to public/docs/typescript/6-classes/7-0-summary.md index 9a08445..89b60d9 100644 --- a/public/docs/typescript/6-classes/7.md +++ b/public/docs/typescript/6-classes/7-0-summary.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-7 +id: typescript-classes-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/typescript/6-classes/8.md b/public/docs/typescript/6-classes/7-1-practice1.md similarity index 96% rename from public/docs/typescript/6-classes/8.md rename to public/docs/typescript/6-classes/7-1-practice1.md index 37f0d4d..6519b3c 100644 --- a/public/docs/typescript/6-classes/8.md +++ b/public/docs/typescript/6-classes/7-1-practice1.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-8 +id: typescript-classes-practice1 title: '緎習問題 1: 埓業員クラスの䜜成' level: 3 --- diff --git a/public/docs/typescript/6-classes/9.md b/public/docs/typescript/6-classes/7-2-practice2.md similarity index 95% rename from public/docs/typescript/6-classes/9.md rename to public/docs/typescript/6-classes/7-2-practice2.md index a0174da..567a06b 100644 --- a/public/docs/typescript/6-classes/9.md +++ b/public/docs/typescript/6-classes/7-2-practice2.md @@ -1,5 +1,5 @@ --- -id: typescript-classes-9 +id: typescript-classes-practice2 title: '緎習問題 2: 図圢クラスの継承' level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/0-promise-asyncawait.md b/public/docs/typescript/7-async-utilities/1-0-async-types.md similarity index 88% rename from public/docs/typescript/7-async-utilities/0-promise-asyncawait.md rename to public/docs/typescript/7-async-utilities/1-0-async-types.md index 51b48bc..3b9bcb0 100644 --- a/public/docs/typescript/7-async-utilities/0-promise-asyncawait.md +++ b/public/docs/typescript/7-async-utilities/1-0-async-types.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-0-promise-asyncawait +id: typescript-async-utilities-async-types title: '非同期凊理の型: Promise ず async/await' level: 2 --- diff --git a/public/docs/typescript/7-async-utilities/1.md b/public/docs/typescript/7-async-utilities/1-1-basic-def.md similarity index 96% rename from public/docs/typescript/7-async-utilities/1.md rename to public/docs/typescript/7-async-utilities/1-1-basic-def.md index 62ff12e..595ab86 100644 --- a/public/docs/typescript/7-async-utilities/1.md +++ b/public/docs/typescript/7-async-utilities/1-1-basic-def.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-1 +id: typescript-async-utilities-basic-def title: 基本的な定矩 level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/2.md b/public/docs/typescript/7-async-utilities/1-2-error-handling.md similarity index 87% rename from public/docs/typescript/7-async-utilities/2.md rename to public/docs/typescript/7-async-utilities/1-2-error-handling.md index e5120c6..7d3ce7f 100644 --- a/public/docs/typescript/7-async-utilities/2.md +++ b/public/docs/typescript/7-async-utilities/1-2-error-handling.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-2 +id: typescript-async-utilities-error-handling title: ゚ラヌハンドリングず型 level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/3-utility-types.md b/public/docs/typescript/7-async-utilities/2-0-utility-types.md similarity index 92% rename from public/docs/typescript/7-async-utilities/3-utility-types.md rename to public/docs/typescript/7-async-utilities/2-0-utility-types.md index cbbed7e..b29f781 100644 --- a/public/docs/typescript/7-async-utilities/3-utility-types.md +++ b/public/docs/typescript/7-async-utilities/2-0-utility-types.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-3-utility-types +id: typescript-async-utilities-utility-types title: ナヌティリティ型 (Utility Types) level: 2 --- diff --git a/public/docs/typescript/7-async-utilities/4.md b/public/docs/typescript/7-async-utilities/2-1-base-types.md similarity index 84% rename from public/docs/typescript/7-async-utilities/4.md rename to public/docs/typescript/7-async-utilities/2-1-base-types.md index 915b8d1..a95face 100644 --- a/public/docs/typescript/7-async-utilities/4.md +++ b/public/docs/typescript/7-async-utilities/2-1-base-types.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-4 +id: typescript-async-utilities-base-types title: ベヌスずなる型 level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/5-partialt.md b/public/docs/typescript/7-async-utilities/2-2-partial.md similarity index 96% rename from public/docs/typescript/7-async-utilities/5-partialt.md rename to public/docs/typescript/7-async-utilities/2-2-partial.md index c6285a6..2a4a965 100644 --- a/public/docs/typescript/7-async-utilities/5-partialt.md +++ b/public/docs/typescript/7-async-utilities/2-2-partial.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-5-partialt +id: typescript-async-utilities-partial title: '1. Partial: 党おをオプショナルにする' level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/6-readonlyt.md b/public/docs/typescript/7-async-utilities/2-3-readonly.md similarity index 95% rename from public/docs/typescript/7-async-utilities/6-readonlyt.md rename to public/docs/typescript/7-async-utilities/2-3-readonly.md index 7a8250a..b618f29 100644 --- a/public/docs/typescript/7-async-utilities/6-readonlyt.md +++ b/public/docs/typescript/7-async-utilities/2-3-readonly.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-6-readonlyt +id: typescript-async-utilities-readonly title: '2. Readonly: 党おを読み取り専甚にする' level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/7-pickt-k.md b/public/docs/typescript/7-async-utilities/2-4-pick.md similarity index 95% rename from public/docs/typescript/7-async-utilities/7-pickt-k.md rename to public/docs/typescript/7-async-utilities/2-4-pick.md index c7a2a99..967f2fa 100644 --- a/public/docs/typescript/7-async-utilities/7-pickt-k.md +++ b/public/docs/typescript/7-async-utilities/2-4-pick.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-7-pickt-k +id: typescript-async-utilities-pick title: '3. Pick: 特定のキヌだけ抜き出す' level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/8-omitt-k.md b/public/docs/typescript/7-async-utilities/2-5-omit.md similarity index 95% rename from public/docs/typescript/7-async-utilities/8-omitt-k.md rename to public/docs/typescript/7-async-utilities/2-5-omit.md index 1d64537..28b8e2a 100644 --- a/public/docs/typescript/7-async-utilities/8-omitt-k.md +++ b/public/docs/typescript/7-async-utilities/2-5-omit.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-8-omitt-k +id: typescript-async-utilities-omit title: '4. Omit: 特定のキヌだけ陀倖する' level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/9.md b/public/docs/typescript/7-async-utilities/3-0-advanced-types.md similarity index 88% rename from public/docs/typescript/7-async-utilities/9.md rename to public/docs/typescript/7-async-utilities/3-0-advanced-types.md index 1860e3e..e099de8 100644 --- a/public/docs/typescript/7-async-utilities/9.md +++ b/public/docs/typescript/7-async-utilities/3-0-advanced-types.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-9 +id: typescript-async-utilities-advanced-types title: 高床な型操䜜抂芁 level: 2 --- diff --git a/public/docs/typescript/7-async-utilities/10-mapped-types.md b/public/docs/typescript/7-async-utilities/3-1-mapped-types.md similarity index 91% rename from public/docs/typescript/7-async-utilities/10-mapped-types.md rename to public/docs/typescript/7-async-utilities/3-1-mapped-types.md index ad3dace..4be2138 100644 --- a/public/docs/typescript/7-async-utilities/10-mapped-types.md +++ b/public/docs/typescript/7-async-utilities/3-1-mapped-types.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-10-mapped-types +id: typescript-async-utilities-mapped-types title: Mapped Types (マップ型) level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/11-conditional-types.md b/public/docs/typescript/7-async-utilities/3-2-conditional-types.md similarity index 91% rename from public/docs/typescript/7-async-utilities/11-conditional-types.md rename to public/docs/typescript/7-async-utilities/3-2-conditional-types.md index fe34763..79d84ce 100644 --- a/public/docs/typescript/7-async-utilities/11-conditional-types.md +++ b/public/docs/typescript/7-async-utilities/3-2-conditional-types.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-11-conditional-types +id: typescript-async-utilities-conditional-types title: Conditional Types (条件付き型) level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/12.md b/public/docs/typescript/7-async-utilities/4-0-summary.md similarity index 95% rename from public/docs/typescript/7-async-utilities/12.md rename to public/docs/typescript/7-async-utilities/4-0-summary.md index 8ec1d8b..7e484cf 100644 --- a/public/docs/typescript/7-async-utilities/12.md +++ b/public/docs/typescript/7-async-utilities/4-0-summary.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-12 +id: typescript-async-utilities-summary title: この章のたずめ level: 2 --- diff --git a/public/docs/typescript/7-async-utilities/13.md b/public/docs/typescript/7-async-utilities/4-1-practice1.md similarity index 94% rename from public/docs/typescript/7-async-utilities/13.md rename to public/docs/typescript/7-async-utilities/4-1-practice1.md index f56808b..a5a5461 100644 --- a/public/docs/typescript/7-async-utilities/13.md +++ b/public/docs/typescript/7-async-utilities/4-1-practice1.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-13 +id: typescript-async-utilities-practice1 title: '緎習問題1: 非同期デヌタの取埗' level: 3 --- diff --git a/public/docs/typescript/7-async-utilities/14.md b/public/docs/typescript/7-async-utilities/4-2-practice2.md similarity index 95% rename from public/docs/typescript/7-async-utilities/14.md rename to public/docs/typescript/7-async-utilities/4-2-practice2.md index 442a13b..eecb1da 100644 --- a/public/docs/typescript/7-async-utilities/14.md +++ b/public/docs/typescript/7-async-utilities/4-2-practice2.md @@ -1,5 +1,5 @@ --- -id: typescript-async-utilities-14 +id: typescript-async-utilities-practice2 title: '緎習問題2: ナヌティリティ型の掻甚' level: 3 --- From 1c39ee803937630e2edbfb372a7e4de255233144 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:47:18 +0900 Subject: [PATCH 11/25] =?UTF-8?q?=E3=82=BB=E3=82=AF=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E5=88=86=E3=81=91=E3=81=AB=E5=A4=B1=E6=95=97=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=82=8B=E3=82=82=E3=81=AE=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rust/10-generics-traits/5-0-std-traits.md | 9 --- .../rust/10-generics-traits/6-0-summary.md | 14 ++++ .../{5-1-practice1.md => 6-1-practice1.md} | 0 .../{5-2-practice2.md => 6-2-practice2.md} | 0 .../rust/2-functions-control/2-2-loops.md | 76 ------------------- .../2-functions-control/2-3-loop-return.md | 31 ++++++++ .../rust/2-functions-control/2-4-while.md | 18 +++++ .../docs/rust/2-functions-control/2-5-for.md | 42 ++++++++++ 8 files changed, 105 insertions(+), 85 deletions(-) create mode 100644 public/docs/rust/10-generics-traits/6-0-summary.md rename public/docs/rust/10-generics-traits/{5-1-practice1.md => 6-1-practice1.md} (100%) rename public/docs/rust/10-generics-traits/{5-2-practice2.md => 6-2-practice2.md} (100%) create mode 100644 public/docs/rust/2-functions-control/2-3-loop-return.md create mode 100644 public/docs/rust/2-functions-control/2-4-while.md create mode 100644 public/docs/rust/2-functions-control/2-5-for.md diff --git a/public/docs/rust/10-generics-traits/5-0-std-traits.md b/public/docs/rust/10-generics-traits/5-0-std-traits.md index 7b69bb5..f05730b 100644 --- a/public/docs/rust/10-generics-traits/5-0-std-traits.md +++ b/public/docs/rust/10-generics-traits/5-0-std-traits.md @@ -46,12 +46,3 @@ p3: Point { x: 10, y: 20 } ``` > **泚意:** `String` や `Vec` などのヒヌプ領域ぞのポむンタを持぀型は、所有暩のルヌル䞊、安易に `Copy` を実装できたせん二重解攟゚ラヌになるため。それらは `Clone` のみを実装したす。 - -# この章のたずめ - - * **ゞェネリクス**: 型をパラメヌタ化し、コヌドの重耇を枛らしたす。コンパむル時に単盞化されるため、実行時コストがかかりたせん。 - * **トレむト**: 共通の振る舞いを定矩したす。むンタヌフェヌスに䌌おいたすが、継承ではなくコンポゞションを促進したす。 - * **トレむト境界**: ゞェネリクス型 `T` に察しお、「特定のトレむトを実装しおいる型のみ」を受け入れるよう制玄を課したす。 - * **暙準トレむト**: `Debug`, `Display`, `Clone`, `Copy` など、Rustの基本動䜜を支える重芁なトレむトが存圚したす。 - -これらを䜿いこなすこずで、Rustコンパむラに安党性を保蚌させ぀぀、再利甚性の高いラむブラリのようなコヌドを曞くこずができるようになりたす。 diff --git a/public/docs/rust/10-generics-traits/6-0-summary.md b/public/docs/rust/10-generics-traits/6-0-summary.md new file mode 100644 index 0000000..9d89061 --- /dev/null +++ b/public/docs/rust/10-generics-traits/6-0-summary.md @@ -0,0 +1,14 @@ +--- +id: rust-generics-traits-summary +title: この章のたずめ +level: 2 +--- + +## この章のたずめ + + * **ゞェネリクス**: 型をパラメヌタ化し、コヌドの重耇を枛らしたす。コンパむル時に単盞化されるため、実行時コストがかかりたせん。 + * **トレむト**: 共通の振る舞いを定矩したす。むンタヌフェヌスに䌌おいたすが、継承ではなくコンポゞションを促進したす。 + * **トレむト境界**: ゞェネリクス型 `T` に察しお、「特定のトレむトを実装しおいる型のみ」を受け入れるよう制玄を課したす。 + * **暙準トレむト**: `Debug`, `Display`, `Clone`, `Copy` など、Rustの基本動䜜を支える重芁なトレむトが存圚したす。 + +これらを䜿いこなすこずで、Rustコンパむラに安党性を保蚌させ぀぀、再利甚性の高いラむブラリのようなコヌドを曞くこずができるようになりたす。 diff --git a/public/docs/rust/10-generics-traits/5-1-practice1.md b/public/docs/rust/10-generics-traits/6-1-practice1.md similarity index 100% rename from public/docs/rust/10-generics-traits/5-1-practice1.md rename to public/docs/rust/10-generics-traits/6-1-practice1.md diff --git a/public/docs/rust/10-generics-traits/5-2-practice2.md b/public/docs/rust/10-generics-traits/6-2-practice2.md similarity index 100% rename from public/docs/rust/10-generics-traits/5-2-practice2.md rename to public/docs/rust/10-generics-traits/6-2-practice2.md diff --git a/public/docs/rust/2-functions-control/2-2-loops.md b/public/docs/rust/2-functions-control/2-2-loops.md index 994aa96..41f8371 100644 --- a/public/docs/rust/2-functions-control/2-2-loops.md +++ b/public/docs/rust/2-functions-control/2-2-loops.md @@ -11,79 +11,3 @@ Rustには3皮類のルヌプがありたす。 1. `loop`: 無限ルヌプ 2. `while`: 条件付きルヌプ 3. `for`: コレクションや範囲に察するルヌプ - -#### loop ず倀の戻り - -`loop` キヌワヌドは、明瀺的に `break` するたで氞遠に繰り返したす。面癜い機胜ずしお、`break` の埌に倀を眮くこずで、ルヌプ党䜓の結果ずしおその倀を返すこずができたす。 - -```rust:loop_return.rs -fn main() { - let mut counter = 0; - - // ルヌプの結果を倉数resultに代入 - let result = loop { - counter += 1; - - if counter == 10 { - // カりンタが10になったら、counter * 2 の倀を返しお終了 - break counter * 2; - } - }; - - println!("ルヌプの結果: {}", result); -} -``` - -```rust-exec:loop_return.rs -ルヌプの結果: 20 -``` - -#### while - -`while` は他の蚀語ずほが同じです。条件が真である限り実行されたす。 - -```rust -// 䟋実行䞍芁 -let mut number = 3; -while number != 0 { - println!("{}!", number); - number -= 1; -} -``` - -#### for ルヌプ - -Rustで最も安党か぀頻繁に䜿甚されるのが `for` ルヌプです。配列の芁玠を走査したり、特定の回数だけ凊理を行ったりする堎合、むンデックス管理が䞍芁な `for` が掚奚されたす。 - -数倀の範囲を指定する堎合は `Range` 型`start..end`を䜿甚したす。 - -```rust:for_loop.rs -fn main() { - let a = [10, 20, 30, 40, 50]; - - // 配列のむテレヌタを䜿ったルヌプ - println!("--- 配列の走査 ---"); - for element in a.iter() { - println!("倀: {}", element); - } - - // Rangeを䜿ったルヌプ (1から3たで。4は含たない) - println!("--- 範囲指定 ---"); - for number in 1..4 { - println!("カりント: {}", number); - } -} -``` - -```rust-exec:for_loop.rs ---- 配列の走査 --- -倀: 10 -倀: 20 -倀: 30 -倀: 40 -倀: 50 ---- 範囲指定 --- -カりント: 1 -カりント: 2 -カりント: 3 -``` diff --git a/public/docs/rust/2-functions-control/2-3-loop-return.md b/public/docs/rust/2-functions-control/2-3-loop-return.md new file mode 100644 index 0000000..4c795e0 --- /dev/null +++ b/public/docs/rust/2-functions-control/2-3-loop-return.md @@ -0,0 +1,31 @@ +--- +id: rust-functions-control-loop-return +title: loop ず倀の戻り +level: 4 +--- + +#### loop ず倀の戻り + +`loop` キヌワヌドは、明瀺的に `break` するたで氞遠に繰り返したす。面癜い機胜ずしお、`break` の埌に倀を眮くこずで、ルヌプ党䜓の結果ずしおその倀を返すこずができたす。 + +```rust:loop_return.rs +fn main() { + let mut counter = 0; + + // ルヌプの結果を倉数resultに代入 + let result = loop { + counter += 1; + + if counter == 10 { + // カりンタが10になったら、counter * 2 の倀を返しお終了 + break counter * 2; + } + }; + + println!("ルヌプの結果: {}", result); +} +``` + +```rust-exec:loop_return.rs +ルヌプの結果: 20 +``` diff --git a/public/docs/rust/2-functions-control/2-4-while.md b/public/docs/rust/2-functions-control/2-4-while.md new file mode 100644 index 0000000..003c1b1 --- /dev/null +++ b/public/docs/rust/2-functions-control/2-4-while.md @@ -0,0 +1,18 @@ +--- +id: rust-functions-control-while +title: while +level: 4 +--- + +#### while + +`while` は他の蚀語ずほが同じです。条件が真である限り実行されたす。 + +```rust +// 䟋実行䞍芁 +let mut number = 3; +while number != 0 { + println!("{}!", number); + number -= 1; +} +``` diff --git a/public/docs/rust/2-functions-control/2-5-for.md b/public/docs/rust/2-functions-control/2-5-for.md new file mode 100644 index 0000000..b8916b2 --- /dev/null +++ b/public/docs/rust/2-functions-control/2-5-for.md @@ -0,0 +1,42 @@ +--- +id: rust-functions-control-for +title: for ルヌプ +level: 4 +--- + +#### for ルヌプ + +Rustで最も安党か぀頻繁に䜿甚されるのが `for` ルヌプです。配列の芁玠を走査したり、特定の回数だけ凊理を行ったりする堎合、むンデックス管理が䞍芁な `for` が掚奚されたす。 + +数倀の範囲を指定する堎合は `Range` 型`start..end`を䜿甚したす。 + +```rust:for_loop.rs +fn main() { + let a = [10, 20, 30, 40, 50]; + + // 配列のむテレヌタを䜿ったルヌプ + println!("--- 配列の走査 ---"); + for element in a.iter() { + println!("倀: {}", element); + } + + // Rangeを䜿ったルヌプ (1から3たで。4は含たない) + println!("--- 範囲指定 ---"); + for number in 1..4 { + println!("カりント: {}", number); + } +} +``` + +```rust-exec:for_loop.rs +--- 配列の走査 --- +倀: 10 +倀: 20 +倀: 30 +倀: 40 +倀: 50 +--- 範囲指定 --- +カりント: 1 +カりント: 2 +カりント: 3 +``` From 0d7ee229e2d0c8c9fc89793e2f6c8ad5145c4b44 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 07:26:54 +0000 Subject: [PATCH 12/25] Add sections.yml script and new [lang]/[pageId] route Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- app/[docs_id]/markdown.tsx | 2 + app/[docs_id]/pageContent.tsx | 4 +- app/[docs_id]/splitMarkdown.ts | 2 + app/[lang]/[pageId]/page.tsx | 166 ++++++++++++++++++ app/navbar.tsx | 7 +- app/pagesList.ts | 127 +++++++------- app/sidebar.tsx | 8 +- package.json | 5 +- public/docs/cpp/0-intro/sections.yml | 14 ++ public/docs/cpp/1-types-control/sections.yml | 14 ++ .../docs/cpp/10-stl-containers/sections.yml | 8 + .../docs/cpp/11-stl-algorithms/sections.yml | 10 ++ .../docs/cpp/12-raii-smart-ptrs/sections.yml | 10 ++ .../docs/cpp/2-data-containers/sections.yml | 8 + public/docs/cpp/3-pointers/sections.yml | 13 ++ public/docs/cpp/4-functions/sections.yml | 15 ++ public/docs/cpp/5-project-build/sections.yml | 12 ++ public/docs/cpp/6-classes-basics/sections.yml | 10 ++ .../docs/cpp/7-classes-advanced/sections.yml | 10 ++ public/docs/cpp/8-inheritance/sections.yml | 8 + public/docs/cpp/9-templates/sections.yml | 8 + public/docs/javascript/0-intro/sections.yml | 8 + public/docs/javascript/1-basics/sections.yml | 11 ++ public/docs/javascript/2-control/sections.yml | 14 ++ .../3-functions-closures/sections.yml | 14 ++ public/docs/javascript/4-this/sections.yml | 9 + .../5-objects-prototype/sections.yml | 13 ++ public/docs/javascript/6-classes/sections.yml | 11 ++ public/docs/javascript/7-arrays/sections.yml | 11 ++ public/docs/javascript/8-promise/sections.yml | 11 ++ .../javascript/9-async-await/sections.yml | 14 ++ public/docs/python/0-intro/sections.yml | 9 + public/docs/python/1-basics/sections.yml | 11 ++ public/docs/python/2-collections/sections.yml | 13 ++ .../python/3-control-functions/sections.yml | 15 ++ public/docs/python/4-modules/sections.yml | 17 ++ public/docs/python/5-oop/sections.yml | 11 ++ public/docs/python/6-file-io/sections.yml | 13 ++ public/docs/python/7-exceptions/sections.yml | 10 ++ .../8-generators-decorators/sections.yml | 9 + public/docs/ruby/0-intro/sections.yml | 8 + public/docs/ruby/1-basics/sections.yml | 9 + public/docs/ruby/10-testing/sections.yml | 19 ++ .../docs/ruby/11-metaprogramming/sections.yml | 9 + .../docs/ruby/2-control-methods/sections.yml | 17 ++ .../ruby/3-everything-object/sections.yml | 10 ++ public/docs/ruby/4-collections/sections.yml | 14 ++ .../docs/ruby/5-blocks-iterators/sections.yml | 15 ++ public/docs/ruby/6-classes/sections.yml | 11 ++ public/docs/ruby/7-modules/sections.yml | 9 + public/docs/ruby/8-proc-lambda/sections.yml | 12 ++ public/docs/ruby/9-stdlib/sections.yml | 12 ++ public/docs/rust/0-intro/sections.yml | 15 ++ public/docs/rust/1-basics/sections.yml | 11 ++ .../docs/rust/10-generics-traits/sections.yml | 15 ++ public/docs/rust/11-lifetimes/sections.yml | 11 ++ .../rust/2-functions-control/sections.yml | 13 ++ public/docs/rust/3-ownership/sections.yml | 15 ++ .../docs/rust/4-borrowing-slices/sections.yml | 16 ++ .../docs/rust/5-structs-methods/sections.yml | 15 ++ public/docs/rust/6-enums-pattern/sections.yml | 14 ++ public/docs/rust/7-modules/sections.yml | 14 ++ .../rust/8-collections-strings/sections.yml | 15 ++ .../docs/rust/9-error-handling/sections.yml | 13 ++ public/docs/typescript/0-intro/sections.yml | 10 ++ public/docs/typescript/1-types/sections.yml | 14 ++ .../2-objects-interfaces/sections.yml | 10 ++ .../typescript/3-function-types/sections.yml | 14 ++ .../typescript/4-combining-types/sections.yml | 13 ++ .../docs/typescript/5-generics/sections.yml | 9 + public/docs/typescript/6-classes/sections.yml | 11 ++ .../typescript/7-async-utilities/sections.yml | 16 ++ scripts/generateSectionsList.ts | 46 +++++ 73 files changed, 1066 insertions(+), 74 deletions(-) create mode 100644 app/[lang]/[pageId]/page.tsx create mode 100644 public/docs/cpp/0-intro/sections.yml create mode 100644 public/docs/cpp/1-types-control/sections.yml create mode 100644 public/docs/cpp/10-stl-containers/sections.yml create mode 100644 public/docs/cpp/11-stl-algorithms/sections.yml create mode 100644 public/docs/cpp/12-raii-smart-ptrs/sections.yml create mode 100644 public/docs/cpp/2-data-containers/sections.yml create mode 100644 public/docs/cpp/3-pointers/sections.yml create mode 100644 public/docs/cpp/4-functions/sections.yml create mode 100644 public/docs/cpp/5-project-build/sections.yml create mode 100644 public/docs/cpp/6-classes-basics/sections.yml create mode 100644 public/docs/cpp/7-classes-advanced/sections.yml create mode 100644 public/docs/cpp/8-inheritance/sections.yml create mode 100644 public/docs/cpp/9-templates/sections.yml create mode 100644 public/docs/javascript/0-intro/sections.yml create mode 100644 public/docs/javascript/1-basics/sections.yml create mode 100644 public/docs/javascript/2-control/sections.yml create mode 100644 public/docs/javascript/3-functions-closures/sections.yml create mode 100644 public/docs/javascript/4-this/sections.yml create mode 100644 public/docs/javascript/5-objects-prototype/sections.yml create mode 100644 public/docs/javascript/6-classes/sections.yml create mode 100644 public/docs/javascript/7-arrays/sections.yml create mode 100644 public/docs/javascript/8-promise/sections.yml create mode 100644 public/docs/javascript/9-async-await/sections.yml create mode 100644 public/docs/python/0-intro/sections.yml create mode 100644 public/docs/python/1-basics/sections.yml create mode 100644 public/docs/python/2-collections/sections.yml create mode 100644 public/docs/python/3-control-functions/sections.yml create mode 100644 public/docs/python/4-modules/sections.yml create mode 100644 public/docs/python/5-oop/sections.yml create mode 100644 public/docs/python/6-file-io/sections.yml create mode 100644 public/docs/python/7-exceptions/sections.yml create mode 100644 public/docs/python/8-generators-decorators/sections.yml create mode 100644 public/docs/ruby/0-intro/sections.yml create mode 100644 public/docs/ruby/1-basics/sections.yml create mode 100644 public/docs/ruby/10-testing/sections.yml create mode 100644 public/docs/ruby/11-metaprogramming/sections.yml create mode 100644 public/docs/ruby/2-control-methods/sections.yml create mode 100644 public/docs/ruby/3-everything-object/sections.yml create mode 100644 public/docs/ruby/4-collections/sections.yml create mode 100644 public/docs/ruby/5-blocks-iterators/sections.yml create mode 100644 public/docs/ruby/6-classes/sections.yml create mode 100644 public/docs/ruby/7-modules/sections.yml create mode 100644 public/docs/ruby/8-proc-lambda/sections.yml create mode 100644 public/docs/ruby/9-stdlib/sections.yml create mode 100644 public/docs/rust/0-intro/sections.yml create mode 100644 public/docs/rust/1-basics/sections.yml create mode 100644 public/docs/rust/10-generics-traits/sections.yml create mode 100644 public/docs/rust/11-lifetimes/sections.yml create mode 100644 public/docs/rust/2-functions-control/sections.yml create mode 100644 public/docs/rust/3-ownership/sections.yml create mode 100644 public/docs/rust/4-borrowing-slices/sections.yml create mode 100644 public/docs/rust/5-structs-methods/sections.yml create mode 100644 public/docs/rust/6-enums-pattern/sections.yml create mode 100644 public/docs/rust/7-modules/sections.yml create mode 100644 public/docs/rust/8-collections-strings/sections.yml create mode 100644 public/docs/rust/9-error-handling/sections.yml create mode 100644 public/docs/typescript/0-intro/sections.yml create mode 100644 public/docs/typescript/1-types/sections.yml create mode 100644 public/docs/typescript/2-objects-interfaces/sections.yml create mode 100644 public/docs/typescript/3-function-types/sections.yml create mode 100644 public/docs/typescript/4-combining-types/sections.yml create mode 100644 public/docs/typescript/5-generics/sections.yml create mode 100644 public/docs/typescript/6-classes/sections.yml create mode 100644 public/docs/typescript/7-async-utilities/sections.yml create mode 100644 scripts/generateSectionsList.ts diff --git a/app/[docs_id]/markdown.tsx b/app/[docs_id]/markdown.tsx index 4cf98e5..58d519e 100644 --- a/app/[docs_id]/markdown.tsx +++ b/app/[docs_id]/markdown.tsx @@ -64,6 +64,8 @@ export function Heading({ children: ReactNode; }) { switch (level) { + case 0: + return null; case 1: return

{children}

; case 2: diff --git a/app/[docs_id]/pageContent.tsx b/app/[docs_id]/pageContent.tsx index f5968db..6c41233 100644 --- a/app/[docs_id]/pageContent.tsx +++ b/app/[docs_id]/pageContent.tsx @@ -29,7 +29,7 @@ export function PageContent(props: PageContentProps) { props.splitMdContent.map((section, i) => ({ ...section, inView: false, - sectionId: `${props.docs_id}-${i}`, + sectionId: section.id || `${props.docs_id}-${i}`, })) ); @@ -38,7 +38,7 @@ export function PageContent(props: PageContentProps) { const newContent = props.splitMdContent.map((section, i) => ({ ...section, inView: false, - sectionId: `${props.docs_id}-${i}`, + sectionId: section.id || `${props.docs_id}-${i}`, })); setDynamicMdContent(newContent); setSidebarMdContent(props.docs_id, newContent); diff --git a/app/[docs_id]/splitMarkdown.ts b/app/[docs_id]/splitMarkdown.ts index 0af31c8..16f1c10 100644 --- a/app/[docs_id]/splitMarkdown.ts +++ b/app/[docs_id]/splitMarkdown.ts @@ -3,6 +3,7 @@ import remarkParse from "remark-parse"; import remarkGfm from "remark-gfm"; export interface MarkdownSection { + id: string; level: number; title: string; content: string; @@ -31,6 +32,7 @@ export function splitMarkdown(content: string): MarkdownSection[] { } } sections.push({ + id: "", title: splitContent[startLine - 1].replace(/#+\s*/, "").trim(), content: splitContent .slice(startLine - 1 + 1, endLine ? endLine - 1 : undefined) diff --git a/app/[lang]/[pageId]/page.tsx b/app/[lang]/[pageId]/page.tsx new file mode 100644 index 0000000..d439497 --- /dev/null +++ b/app/[lang]/[pageId]/page.tsx @@ -0,0 +1,166 @@ +import { Metadata } from "next"; +import { notFound } from "next/navigation"; +import { getCloudflareContext } from "@opennextjs/cloudflare"; +import { readFile } from "node:fs/promises"; +import { join } from "node:path"; +import { MarkdownSection } from "../[docs_id]/splitMarkdown"; +import { PageContent } from "../[docs_id]/pageContent"; +import { ChatHistoryProvider } from "../[docs_id]/chatHistory"; +import { getChatFromCache, initContext } from "@/lib/chatHistory"; +import { pagesList } from "@/pagesList"; +import { isCloudflare } from "@/lib/detectCloudflare"; + +async function readDocFile( + lang: string, + pageId: string, + filename: string +): Promise { + try { + if (isCloudflare()) { + const cfAssets = getCloudflareContext().env.ASSETS; + const res = await cfAssets!.fetch( + `https://assets.local/docs/${lang}/${pageId}/${filename}` + ); + if (!res.ok) notFound(); + return await res.text(); + } else { + return await readFile( + join(process.cwd(), "public", "docs", lang, pageId, filename), + "utf-8" + ); + } + } catch { + notFound(); + } +} + +/** + * YAMLフロントマタヌをパヌスしおid, title, level, bodyを返す。 + * フロントマタヌがない堎合はid/titleを空文字、levelを0で返す。 + */ +function parseFrontmatter(content: string): { + id: string; + title: string; + level: number; + body: string; +} { + if (!content.startsWith("---\n")) { + return { id: "", title: "", level: 0, body: content }; + } + const endIdx = content.indexOf("\n---\n", 4); + if (endIdx === -1) { + return { id: "", title: "", level: 0, body: content }; + } + const fm = content.slice(4, endIdx); + const body = content.slice(endIdx + 5); + + const id = fm.match(/^id:\s*(.+)$/m)?.[1]?.trim() ?? ""; + let title = fm.match(/^title:\s*(.+)$/m)?.[1]?.trim() ?? ""; + // YAMLクォヌトを陀去 + if ( + (title.startsWith("'") && title.endsWith("'")) || + (title.startsWith('"') && title.endsWith('"')) + ) { + title = title.slice(1, -1); + } + const level = parseInt(fm.match(/^level:\s*(\d+)$/m)?.[1] ?? "2"); + return { id, title, level, body }; +} + +/** + * public/docs/{lang}/{pageId}/ 以䞋のmdファむルを結合しお MarkdownSection[] を返す。 + */ +async function getMarkdownSections( + lang: string, + pageId: string, + pageTitle: string +): Promise { + const sectionsYml = await readDocFile(lang, pageId, "sections.yml"); + const files = sectionsYml + .split("\n") + .filter((l) => l.trim().startsWith("- ")) + .map((l) => l.trim().slice(2).trim()) + .filter(Boolean); + + const sections: MarkdownSection[] = []; + for (const file of files) { + const raw = await readDocFile(lang, pageId, file); + if (file === "-intro.md") { + // むントロセクションはフロントマタヌなし・芋出しなし + sections.push({ + id: `${lang}-${pageId}-intro`, + level: 1, + title: pageTitle, + content: raw.trim(), + rawContent: raw.trim(), + }); + } else { + const { id, title, level, body } = parseFrontmatter(raw); + // bodyには芋出し行が含たれるので、contentずしおは芋出しを陀いた本文のみを枡す + const content = body.replace(/^#{1,6} [^\n]*\n?/, "").trim(); + sections.push({ + id, + level, + title, + content, + rawContent: body.trim(), + }); + } + } + return sections; +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ lang: string; pageId: string }>; +}): Promise { + const { lang, pageId } = await params; + const langEntry = pagesList.find((l) => l.id === lang); + const pageEntry = langEntry?.pages.find((p) => p.slug === pageId); + if (!langEntry || !pageEntry) notFound(); + + const pageIndex = langEntry!.pages.findIndex((p) => p.slug === pageId); + // pageIndex will be >= 0 since pageEntry was found via the same pages array + return { + title: `${langEntry!.lang}-${pageIndex + 1}. ${pageEntry!.title}`, + }; +} + +export default async function Page({ + params, +}: { + params: Promise<{ lang: string; pageId: string }>; +}) { + const { lang, pageId } = await params; + + const langEntry = pagesList.find((l) => l.id === lang); + const pageEntry = langEntry?.pages.find((p) => p.slug === pageId); + if (!langEntry || !pageEntry) notFound(); + + const docsId = `${lang}/${pageId}`; + const sections = await getMarkdownSections(lang, pageId, pageEntry!.title); + + // AI甚のドキュメント党文芋出し付きで結合 + const documentContent = sections + .map((s) => + s.level > 0 ? `${"#".repeat(s.level)} ${s.title}\n\n${s.content}` : s.content + ) + .join("\n\n"); + + const context = await initContext(); + const initialChatHistories = await getChatFromCache(docsId, context); + + return ( + + + + ); +} diff --git a/app/navbar.tsx b/app/navbar.tsx index 7a759e0..ed3eac1 100644 --- a/app/navbar.tsx +++ b/app/navbar.tsx @@ -14,11 +14,12 @@ function PageTitle() { } const currentDocsId = pathname.replace(/^\//, ""); - const currentGroup = pagesList.find((group) => currentDocsId.startsWith(group.id)); - const currentPage = currentGroup?.pages.find((page) => `${currentGroup.id}-${page.id}` === currentDocsId); + const currentGroup = pagesList.find((group) => currentDocsId.startsWith(`${group.id}/`)); + const pageIndex = currentGroup?.pages.findIndex((page) => `${currentGroup.id}/${page.slug}` === currentDocsId) ?? -1; + const currentPage = pageIndex >= 0 ? currentGroup?.pages[pageIndex] : undefined; if(currentPage){ return <> - {currentGroup?.lang}-{currentPage.id}. + {currentGroup?.lang}-{pageIndex + 1}. {currentPage.title} } diff --git a/app/pagesList.ts b/app/pagesList.ts index b4cb327..918e058 100644 --- a/app/pagesList.ts +++ b/app/pagesList.ts @@ -6,18 +6,19 @@ export const pagesList = [ // TODO: これをいい感じの文章に倉える↓ description: "Pythonの基瀎から応甚たでを孊べるチュヌトリアル", pages: [ - { id: 1, title: "環境構築ず基本思想" }, - { id: 2, title: "基本構文ずデヌタ型" }, - { id: 3, title: "リスト、タプル、蟞曞、セット" }, - { id: 4, title: "制埡構文ず関数" }, - { id: 5, title: "モゞュヌルずパッケヌゞ" }, - { id: 6, title: "オブゞェクト指向プログラミング" }, + { id: 1, slug: "0-intro", title: "環境構築ず基本思想" }, + { id: 2, slug: "1-basics", title: "基本構文ずデヌタ型" }, + { id: 3, slug: "2-collections", title: "リスト、タプル、蟞曞、セット" }, + { id: 4, slug: "3-control-functions", title: "制埡構文ず関数" }, + { id: 5, slug: "4-modules", title: "モゞュヌルずパッケヌゞ" }, + { id: 6, slug: "5-oop", title: "オブゞェクト指向プログラミング" }, { id: 7, + slug: "6-file-io", title: "ファむルの入出力ずコンテキストマネヌゞャ", }, - { id: 8, title: "䟋倖凊理" }, - { id: 9, title: "ゞェネレヌタずデコレヌタ" }, + { id: 8, slug: "7-exceptions", title: "䟋倖凊理" }, + { id: 9, slug: "8-generators-decorators", title: "ゞェネレヌタずデコレヌタ" }, ], }, { @@ -25,18 +26,18 @@ export const pagesList = [ lang: "Ruby", description: "hoge", pages: [ - { id: 1, title: "rubyの䞖界ぞようこそ" }, - { id: 2, title: "基本構文ずデヌタ型" }, - { id: 3, title: "制埡構造ずメ゜ッド定矩" }, - { id: 4, title: "すべおがオブゞェクト" }, - { id: 5, title: "コレクション (Array, Hash, Range)" }, - { id: 6, title: "ブロックずむテレヌタ" }, - { id: 7, title: "クラスずオブゞェクト" }, - { id: 8, title: "モゞュヌルずMix-in" }, - { id: 9, title: "Proc, Lambda, クロヌゞャ" }, - { id: 10, title: "暙準ラむブラリの掻甚" }, - { id: 11, title: "テスト文化入門" }, - { id: 12, title: "メタプログラミング入門" }, + { id: 1, slug: "0-intro", title: "rubyの䞖界ぞようこそ" }, + { id: 2, slug: "1-basics", title: "基本構文ずデヌタ型" }, + { id: 3, slug: "2-control-methods", title: "制埡構造ずメ゜ッド定矩" }, + { id: 4, slug: "3-everything-object", title: "すべおがオブゞェクト" }, + { id: 5, slug: "4-collections", title: "コレクション (Array, Hash, Range)" }, + { id: 6, slug: "5-blocks-iterators", title: "ブロックずむテレヌタ" }, + { id: 7, slug: "6-classes", title: "クラスずオブゞェクト" }, + { id: 8, slug: "7-modules", title: "モゞュヌルずMix-in" }, + { id: 9, slug: "8-proc-lambda", title: "Proc, Lambda, クロヌゞャ" }, + { id: 10, slug: "9-stdlib", title: "暙準ラむブラリの掻甚" }, + { id: 11, slug: "10-testing", title: "テスト文化入門" }, + { id: 12, slug: "11-metaprogramming", title: "メタプログラミング入門" }, ], }, { @@ -44,16 +45,16 @@ export const pagesList = [ lang: "JavaScript", description: "hoge", pages: [ - { id: 1, title: "JavaScriptぞようこそ" }, - { id: 2, title: "基本構文ずデヌタ型" }, - { id: 3, title: "制埡構文" }, - { id: 4, title: "関数ずクロヌゞャ" }, - { id: 5, title: "'this'の正䜓" }, - { id: 6, title: "オブゞェクトずプロトタむプ" }, - { id: 7, title: "クラス構文" }, - { id: 8, title: "配列ずむテレヌション" }, - { id: 9, title: "非同期凊理①: Promise" }, - { id: 10, title: "非同期凊理②: Async/Await" }, + { id: 1, slug: "0-intro", title: "JavaScriptぞようこそ" }, + { id: 2, slug: "1-basics", title: "基本構文ずデヌタ型" }, + { id: 3, slug: "2-control", title: "制埡構文" }, + { id: 4, slug: "3-functions-closures", title: "関数ずクロヌゞャ" }, + { id: 5, slug: "4-this", title: "'this'の正䜓" }, + { id: 6, slug: "5-objects-prototype", title: "オブゞェクトずプロトタむプ" }, + { id: 7, slug: "6-classes", title: "クラス構文" }, + { id: 8, slug: "7-arrays", title: "配列ずむテレヌション" }, + { id: 9, slug: "8-promise", title: "非同期凊理①: Promise" }, + { id: 10, slug: "9-async-await", title: "非同期凊理②: Async/Await" }, ], }, { @@ -61,14 +62,14 @@ export const pagesList = [ lang: "TypeScript", description: "にゃヌ", pages: [ - { id: 1, title: "TypeScriptぞようこそ" }, - { id: 2, title: "基本的な型ず型掚論" }, - { id: 3, title: "オブゞェクト、むンタヌフェヌス、型゚むリアス" }, - { id: 4, title: "関数の型定矩" }, - { id: 5, title: "型を組み合わせる" }, - { id: 6, title: "ゞェネリクス" }, - { id: 7, title: "クラスずアクセス修食子" }, - { id: 8, title: "非同期凊理ずナヌティリティ型" }, + { id: 1, slug: "0-intro", title: "TypeScriptぞようこそ" }, + { id: 2, slug: "1-types", title: "基本的な型ず型掚論" }, + { id: 3, slug: "2-objects-interfaces", title: "オブゞェクト、むンタヌフェヌス、型゚むリアス" }, + { id: 4, slug: "3-function-types", title: "関数の型定矩" }, + { id: 5, slug: "4-combining-types", title: "型を組み合わせる" }, + { id: 6, slug: "5-generics", title: "ゞェネリクス" }, + { id: 7, slug: "6-classes", title: "クラスずアクセス修食子" }, + { id: 8, slug: "7-async-utilities", title: "非同期凊理ずナヌティリティ型" }, ], }, { @@ -76,19 +77,19 @@ export const pagesList = [ lang: "C++", description: "C++の基本から高床な機胜たでを孊べるチュヌトリアル", pages: [ - { id: 1, title: "C++の䞖界ぞようこそ" }, - { id: 2, title: "型システムず制埡構造" }, - { id: 3, title: "デヌタ集合ずモダンな操䜜" }, - { id: 4, title: "ポむンタずメモリ管理" }, - { id: 5, title: "関数ず参照枡し" }, - { id: 6, title: "プロゞェクトの分割ずビルド" }, - { id: 7, title: "クラスの基瀎" }, - { id: 8, title: "クラスを䜿いこなす" }, - { id: 9, title: "継承ずポリモヌフィズム" }, - { id: 10, title: "テンプレヌト" }, - { id: 11, title: "STL ①:コンテナ" }, - { id: 12, title: "STL ②:アルゎリズムずラムダ匏" }, - { id: 13, title: "RAIIずスマヌトポむンタ" }, + { id: 1, slug: "0-intro", title: "C++の䞖界ぞようこそ" }, + { id: 2, slug: "1-types-control", title: "型システムず制埡構造" }, + { id: 3, slug: "2-data-containers", title: "デヌタ集合ずモダンな操䜜" }, + { id: 4, slug: "3-pointers", title: "ポむンタずメモリ管理" }, + { id: 5, slug: "4-functions", title: "関数ず参照枡し" }, + { id: 6, slug: "5-project-build", title: "プロゞェクトの分割ずビルド" }, + { id: 7, slug: "6-classes-basics", title: "クラスの基瀎" }, + { id: 8, slug: "7-classes-advanced", title: "クラスを䜿いこなす" }, + { id: 9, slug: "8-inheritance", title: "継承ずポリモヌフィズム" }, + { id: 10, slug: "9-templates", title: "テンプレヌト" }, + { id: 11, slug: "10-stl-containers", title: "STL ①:コンテナ" }, + { id: 12, slug: "11-stl-algorithms", title: "STL ②:アルゎリズムずラムダ匏" }, + { id: 13, slug: "12-raii-smart-ptrs", title: "RAIIずスマヌトポむンタ" }, ], }, { @@ -96,18 +97,18 @@ export const pagesList = [ lang: "Rust", description: "a", pages: [ - { id: 1, title: "Rustの䞖界ぞようこそ" }, - { id: 2, title: "基本構文ず「䞍倉性」" }, - { id: 3, title: "関数ず制埡フロヌ" }, - { id: 4, title: "所有暩" }, - { id: 5, title: "借甚ずスラむス" }, - { id: 6, title: "構造䜓ずメ゜ッド構文" }, - { id: 7, title: "列挙型ずパタヌンマッチ" }, - { id: 8, title: "モゞュヌルシステムずパッケヌゞ管理" }, - { id: 9, title: "コレクションず文字列" }, - { id: 10, title: "゚ラヌハンドリング" }, - { id: 11, title: "ゞェネリクスずトレむト" }, - { id: 12, title: "ラむフタむム" }, + { id: 1, slug: "0-intro", title: "Rustの䞖界ぞようこそ" }, + { id: 2, slug: "1-basics", title: "基本構文ず「䞍倉性」" }, + { id: 3, slug: "2-functions-control", title: "関数ず制埡フロヌ" }, + { id: 4, slug: "3-ownership", title: "所有暩" }, + { id: 5, slug: "4-borrowing-slices", title: "借甚ずスラむス" }, + { id: 6, slug: "5-structs-methods", title: "構造䜓ずメ゜ッド構文" }, + { id: 7, slug: "6-enums-pattern", title: "列挙型ずパタヌンマッチ" }, + { id: 8, slug: "7-modules", title: "モゞュヌルシステムずパッケヌゞ管理" }, + { id: 9, slug: "8-collections-strings", title: "コレクションず文字列" }, + { id: 10, slug: "9-error-handling", title: "゚ラヌハンドリング" }, + { id: 11, slug: "10-generics-traits", title: "ゞェネリクスずトレむト" }, + { id: 12, slug: "11-lifetimes", title: "ラむフタむム" }, ], }, ] as const; diff --git a/app/sidebar.tsx b/app/sidebar.tsx index a8d00b3..559cf5a 100644 --- a/app/sidebar.tsx +++ b/app/sidebar.tsx @@ -92,7 +92,7 @@ export function Sidebar() { // 目次の開閉状態 const [detailsOpen, setDetailsOpen] = useState([]); const currentGroupIndex = pagesList.findIndex((group) => - currentDocsId.startsWith(`${group.id}-`) + currentDocsId.startsWith(`${group.id}/`) ); useEffect(() => { // 衚瀺しおいるグルヌプが倉わったずきに珟圚のグルヌプのdetailsを開く @@ -172,10 +172,10 @@ export function Sidebar() { {group.pages.map((page) => (
  • @@ -186,7 +186,7 @@ export function Sidebar() { {page.title} - {`${group.id}-${page.id}` === currentDocsId && + {`${group.id}/${page.slug}` === currentDocsId && sidebarMdContent.length > 0 && (
      {sidebarMdContent.slice(1).map((section, idx) => { diff --git a/package.json b/package.json index 3d63df2..284ceb9 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "private": true, "type": "module", "scripts": { - "dev": "npm run cf-typegen && npm run copyAllDTSFiles && npm run removeHinting && next dev", - "build": "npm run cf-typegen && npm run copyAllDTSFiles && npm run removeHinting && next build", + "dev": "npm run cf-typegen && npm run generateSections && npm run copyAllDTSFiles && npm run removeHinting && next dev", + "build": "npm run cf-typegen && npm run generateSections && npm run copyAllDTSFiles && npm run removeHinting && next build", "start": "next start", "lint": "npm run cf-typegen && next lint", "tsc": "npm run cf-typegen && tsc", "format": "prettier --write app/", + "generateSections": "tsx ./scripts/generateSectionsList.ts", "copyAllDTSFiles": "tsx ./scripts/copyAllDTSFiles.ts", "removeHinting": "tsx ./scripts/removeHinting.ts", "cf-preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview --port 3000", diff --git a/public/docs/cpp/0-intro/sections.yml b/public/docs/cpp/0-intro/sections.yml new file mode 100644 index 0000000..815fad0 --- /dev/null +++ b/public/docs/cpp/0-intro/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-about.md +- 1-1-feature.md +- 1-2-usage.md +- 2-0-env-about.md +- 2-1-ide.md +- 2-2-setup.md +- 3-0-helloworld.md +- 3-1-run.md +- 4-0-basic.md +- 4-1-include.md +- 4-2-main.md +- 4-3-namespace.md +- 5-0-summary.md diff --git a/public/docs/cpp/1-types-control/sections.yml b/public/docs/cpp/1-types-control/sections.yml new file mode 100644 index 0000000..26395ff --- /dev/null +++ b/public/docs/cpp/1-types-control/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-basic-types.md +- 2-0-uniform-init.md +- 3-0-modifier.md +- 3-1-const.md +- 3-2-auto.md +- 4-0-console.md +- 5-0-control.md +- 5-1-if.md +- 5-2-switch.md +- 5-3-loop.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/cpp/10-stl-containers/sections.yml b/public/docs/cpp/10-stl-containers/sections.yml new file mode 100644 index 0000000..97b3e74 --- /dev/null +++ b/public/docs/cpp/10-stl-containers/sections.yml @@ -0,0 +1,8 @@ +- -intro.md +- 1-0-about.md +- 2-0-vector.md +- 3-0-map.md +- 4-0-other.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/cpp/11-stl-algorithms/sections.yml b/public/docs/cpp/11-stl-algorithms/sections.yml new file mode 100644 index 0000000..69bdefa --- /dev/null +++ b/public/docs/cpp/11-stl-algorithms/sections.yml @@ -0,0 +1,10 @@ +- -intro.md +- 1-0-about.md +- 2-0-algo.md +- 2-1-sort.md +- 2-2-find.md +- 2-3-foreach.md +- 3-0-lambda.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/cpp/12-raii-smart-ptrs/sections.yml b/public/docs/cpp/12-raii-smart-ptrs/sections.yml new file mode 100644 index 0000000..12e17e4 --- /dev/null +++ b/public/docs/cpp/12-raii-smart-ptrs/sections.yml @@ -0,0 +1,10 @@ +- -intro.md +- 1-0-trycatch.md +- 1-1-leak.md +- 2-0-raii.md +- 3-0-smartptr.md +- 3-1-uniqueptr.md +- 3-2-sharedptr.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/cpp/2-data-containers/sections.yml b/public/docs/cpp/2-data-containers/sections.yml new file mode 100644 index 0000000..f687aab --- /dev/null +++ b/public/docs/cpp/2-data-containers/sections.yml @@ -0,0 +1,8 @@ +- -intro.md +- 1-0-string.md +- 2-0-vector.md +- 3-0-array.md +- 4-0-range-based-for.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/cpp/3-pointers/sections.yml b/public/docs/cpp/3-pointers/sections.yml new file mode 100644 index 0000000..3e3a95a --- /dev/null +++ b/public/docs/cpp/3-pointers/sections.yml @@ -0,0 +1,13 @@ +- -intro.md +- 1-0-basic.md +- 1-1-address-operator.md +- 1-2-nullptr.md +- 2-0-array.md +- 3-0-legacy-string.md +- 4-0-memory-area.md +- 4-1-stack.md +- 4-2-heap.md +- 4-4-memory-leak.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/cpp/4-functions/sections.yml b/public/docs/cpp/4-functions/sections.yml new file mode 100644 index 0000000..c2b7410 --- /dev/null +++ b/public/docs/cpp/4-functions/sections.yml @@ -0,0 +1,15 @@ +- -intro.md +- 1-0-basic.md +- 1-1-prototype-declaration.md +- 1-2-void.md +- 2-0-argument.md +- 2-1-arg-by-value.md +- 2-2-arg-by-pointer.md +- 2-3-arg-by-reference.md +- 2-4-arg-by-const-reference.md +- 3-0-features.md +- 3-1-overload.md +- 3-2-default-arg.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/cpp/5-project-build/sections.yml b/public/docs/cpp/5-project-build/sections.yml new file mode 100644 index 0000000..a9d12c8 --- /dev/null +++ b/public/docs/cpp/5-project-build/sections.yml @@ -0,0 +1,12 @@ +- -intro.md +- 1-0-header-and-source.md +- 1-2-split-example.md +- 2-0-include-guard.md +- 2-1-include-guard-by-define.md +- 2-2-pragma-once.md +- 3-0-build.md +- 3-1-gcc-manual.md +- 3-2-makefile.md +- 3-3-cmake.md +- 4-0-summary.md +- 4-1-practice1.md diff --git a/public/docs/cpp/6-classes-basics/sections.yml b/public/docs/cpp/6-classes-basics/sections.yml new file mode 100644 index 0000000..ae3adc7 --- /dev/null +++ b/public/docs/cpp/6-classes-basics/sections.yml @@ -0,0 +1,10 @@ +- -intro.md +- 1-0-about.md +- 2-0-instance.md +- 3-0-access-control.md +- 4-0-constructor-destructor.md +- 4-1-constructor.md +- 4-2-destructor.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/cpp/7-classes-advanced/sections.yml b/public/docs/cpp/7-classes-advanced/sections.yml new file mode 100644 index 0000000..1f7a46b --- /dev/null +++ b/public/docs/cpp/7-classes-advanced/sections.yml @@ -0,0 +1,10 @@ +- -intro.md +- 1-0-copy.md +- 1-1-shallow-copy.md +- 1-2-deep-copy.md +- 2-0-operator-overload.md +- 3-0-static-member.md +- 4-0-this.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/cpp/8-inheritance/sections.yml b/public/docs/cpp/8-inheritance/sections.yml new file mode 100644 index 0000000..9ea74f8 --- /dev/null +++ b/public/docs/cpp/8-inheritance/sections.yml @@ -0,0 +1,8 @@ +- -intro.md +- 1-0-inheritance.md +- 2-0-polymorphism.md +- 3-0-override.md +- 4-0-abstract-class.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/cpp/9-templates/sections.yml b/public/docs/cpp/9-templates/sections.yml new file mode 100644 index 0000000..2d2247c --- /dev/null +++ b/public/docs/cpp/9-templates/sections.yml @@ -0,0 +1,8 @@ +- -intro.md +- 1-0-function-template.md +- 1-1-function-template-detail.md +- 2-0-class-template.md +- 2-1-class-template-detail.md +- 3-0-summary.md +- 3-1-practice1.md +- 3-2-practice2.md diff --git a/public/docs/javascript/0-intro/sections.yml b/public/docs/javascript/0-intro/sections.yml new file mode 100644 index 0000000..0e20b2e --- /dev/null +++ b/public/docs/javascript/0-intro/sections.yml @@ -0,0 +1,8 @@ +- -intro.md +- 1-0-about.md +- 2-0-environment.md +- 3-0-comparison.md +- 4-0-helloworld.md +- 4-1-repl.md +- 4-2-run-source.md +- 4-3-browser.md diff --git a/public/docs/javascript/1-basics/sections.yml b/public/docs/javascript/1-basics/sections.yml new file mode 100644 index 0000000..a2b76c5 --- /dev/null +++ b/public/docs/javascript/1-basics/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-variable.md +- 2-0-primitive-type.md +- 2-1-null-undefined.md +- 3-0-object.md +- 3-1-const-object.md +- 4-0-equality.md +- 5-1-add-operator.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/javascript/2-control/sections.yml b/public/docs/javascript/2-control/sections.yml new file mode 100644 index 0000000..ea34912 --- /dev/null +++ b/public/docs/javascript/2-control/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-1-if-truthy.md +- 1-2-switch.md +- 2-0-loop.md +- 2-1-for.md +- 2-2-while.md +- 3-0-iteration.md +- 3-1-for-in.md +- 3-2-for-of.md +- 4-0-try-catch.md +- 4-2-throw.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/javascript/3-functions-closures/sections.yml b/public/docs/javascript/3-functions-closures/sections.yml new file mode 100644 index 0000000..d2f684d --- /dev/null +++ b/public/docs/javascript/3-functions-closures/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-function.md +- 1-1-function-declaration.md +- 1-2-function-expression.md +- 2-0-arrow-function.md +- 2-2-arrow-function-simple.md +- 3-0-argument.md +- 3-1-default-arg.md +- 3-2-rest-arg.md +- 4-0-scope-chain.md +- 5-0-closure.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/javascript/4-this/sections.yml b/public/docs/javascript/4-this/sections.yml new file mode 100644 index 0000000..24bc8a4 --- /dev/null +++ b/public/docs/javascript/4-this/sections.yml @@ -0,0 +1,9 @@ +- -intro.md +- 1-0-this-basic.md +- 2-0-bind-basic.md +- 2-1-call-apply.md +- 2-2-bind.md +- 3-0-arrow-func.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/javascript/5-objects-prototype/sections.yml b/public/docs/javascript/5-objects-prototype/sections.yml new file mode 100644 index 0000000..1e01933 --- /dev/null +++ b/public/docs/javascript/5-objects-prototype/sections.yml @@ -0,0 +1,13 @@ +- -intro.md +- 1-0-obj-literal.md +- 1-1-properties.md +- 2-0-method-this-recall.md +- 3-0-prototype-basic.md +- 3-1-getprototypeof.md +- 4-0-prototype-chain.md +- 5-0-object-create-basic.md +- 5-1-object-create.md +- 5-2-new-constructor.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/javascript/6-classes/sections.yml b/public/docs/javascript/6-classes/sections.yml new file mode 100644 index 0000000..333f6ca --- /dev/null +++ b/public/docs/javascript/6-classes/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-class-constructor.md +- 1-1-class-expr.md +- 2-0-method.md +- 3-0-extends-super.md +- 4-0-static-private.md +- 4-1-static.md +- 4-2-private.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/javascript/7-arrays/sections.yml b/public/docs/javascript/7-arrays/sections.yml new file mode 100644 index 0000000..dc5c7bc --- /dev/null +++ b/public/docs/javascript/7-arrays/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-array-literal.md +- 1-2-array-splice.md +- 2-0-spread-destructure-basic.md +- 2-1-spread.md +- 2-2-destructuring.md +- 3-0-higher-order-func.md +- 4-0-other-method.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/javascript/8-promise/sections.yml b/public/docs/javascript/8-promise/sections.yml new file mode 100644 index 0000000..fe8187a --- /dev/null +++ b/public/docs/javascript/8-promise/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-sync-vs-async.md +- 2-0-event-callback.md +- 3-0-callback-hell.md +- 4-0-promise-basic.md +- 5-0-promise-usage.md +- 5-1-promise-create.md +- 5-2-promise-method.md +- 6-0-summary.md +- 7-1-practice1.md +- 7-2-practice2.md diff --git a/public/docs/javascript/9-async-await/sections.yml b/public/docs/javascript/9-async-await/sections.yml new file mode 100644 index 0000000..9d483d7 --- /dev/null +++ b/public/docs/javascript/9-async-await/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-async-await.md +- 1-1-async.md +- 1-2-await.md +- 2-0-try-catch.md +- 3-0-fetch.md +- 3-1-fetch-post.md +- 4-0-promise-all-race.md +- 4-1-sequential.md +- 4-2-promise-all.md +- 4-3-promise-race.md +- 5-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/python/0-intro/sections.yml b/public/docs/python/0-intro/sections.yml new file mode 100644 index 0000000..31284c3 --- /dev/null +++ b/public/docs/python/0-intro/sections.yml @@ -0,0 +1,9 @@ +- -intro.md +- 1-0-readability.md +- 2-0-install.md +- 2-3-version-management.md +- 3-0-repl.md +- 3-3-repl-usage.md +- 4-0-script-run.md +- 4-1-main-snippet.md +- 5-0-pip-venv.md diff --git a/public/docs/python/1-basics/sections.yml b/public/docs/python/1-basics/sections.yml new file mode 100644 index 0000000..f182bb7 --- /dev/null +++ b/public/docs/python/1-basics/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-variable.md +- 2-0-types.md +- 2-1-int.md +- 2-2-str.md +- 2-3-f-string.md +- 2-4-bool.md +- 3-0-type-hints.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/python/2-collections/sections.yml b/public/docs/python/2-collections/sections.yml new file mode 100644 index 0000000..2742052 --- /dev/null +++ b/public/docs/python/2-collections/sections.yml @@ -0,0 +1,13 @@ +- -intro.md +- 1-0-list.md +- 2-0-tuple.md +- 3-0-dictionary.md +- 4-0-set.md +- 5-0-slicing.md +- 6-0-comprehensions.md +- 6-1-list-comprehension.md +- 6-2-dict-comprehension.md +- 6-3-set-comprehension.md +- 7-0-summary.md +- 7-1-practice1.md +- 7-2-practice2.md diff --git a/public/docs/python/3-control-functions/sections.yml b/public/docs/python/3-control-functions/sections.yml new file mode 100644 index 0000000..cd3e88a --- /dev/null +++ b/public/docs/python/3-control-functions/sections.yml @@ -0,0 +1,15 @@ +- -intro.md +- 1-0-if.md +- 2-0-for.md +- 2-1-range.md +- 2-2-enumerate.md +- 3-0-while.md +- 4-0-def.md +- 5-0-arguments.md +- 6-0-var-arg.md +- 6-1-positional-var-arg.md +- 6-2-keyword-var-arg.md +- 7-0-lambda.md +- 8-0-summary.md +- 8-1-practice1.md +- 8-2-practice2.md diff --git a/public/docs/python/4-modules/sections.yml b/public/docs/python/4-modules/sections.yml new file mode 100644 index 0000000..29b8a9d --- /dev/null +++ b/public/docs/python/4-modules/sections.yml @@ -0,0 +1,17 @@ +- -intro.md +- 1-0-basic.md +- 1-1-import-math.md +- 1-2-import-as.md +- 1-3-from-import.md +- 1-4-custom-module.md +- 2-0-package.md +- 2-1-init-py.md +- 3-0-std-library.md +- 3-1-find-std-library.md +- 3-2-os.md +- 3-3-sys.md +- 3-4-datetime.md +- 3-5-json.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/python/5-oop/sections.yml b/public/docs/python/5-oop/sections.yml new file mode 100644 index 0000000..3c82352 --- /dev/null +++ b/public/docs/python/5-oop/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-class-instance.md +- 2-0-constructor.md +- 3-0-class-vars.md +- 4-0-method.md +- 4-1-class-type-annotation.md +- 5-0-inheritance.md +- 6-0-str-repr.md +- 8-0-summary.md +- 8-1-practice1.md +- 8-2-practice2.md diff --git a/public/docs/python/6-file-io/sections.yml b/public/docs/python/6-file-io/sections.yml new file mode 100644 index 0000000..bc4d0d7 --- /dev/null +++ b/public/docs/python/6-file-io/sections.yml @@ -0,0 +1,13 @@ +- -intro.md +- 1-0-open.md +- 2-0-textfile.md +- 2-1-write.md +- 2-2-read.md +- 3-0-with.md +- 4-0-json-module.md +- 5-0-csv-module.md +- 5-1-csv-write.md +- 5-2-csv-read.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/python/7-exceptions/sections.yml b/public/docs/python/7-exceptions/sections.yml new file mode 100644 index 0000000..3572468 --- /dev/null +++ b/public/docs/python/7-exceptions/sections.yml @@ -0,0 +1,10 @@ +- -intro.md +- 1-0-try-except.md +- 2-0-multiple-error.md +- 2-1-multiple-except.md +- 2-2-tuple-except.md +- 3-0-raise.md +- 4-0-else-finally.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/python/8-generators-decorators/sections.yml b/public/docs/python/8-generators-decorators/sections.yml new file mode 100644 index 0000000..e04994c --- /dev/null +++ b/public/docs/python/8-generators-decorators/sections.yml @@ -0,0 +1,9 @@ +- -intro.md +- 1-0-iterator.md +- 2-0-generator-yield.md +- 3-0-generator-expr.md +- 4-0-decorator.md +- 4-1-at-decorator.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/ruby/0-intro/sections.yml b/public/docs/ruby/0-intro/sections.yml new file mode 100644 index 0000000..1bee6f8 --- /dev/null +++ b/public/docs/ruby/0-intro/sections.yml @@ -0,0 +1,8 @@ +- -intro.md +- 1-0-philosophy.md +- 2-0-comparison.md +- 3-0-rbenv.md +- 4-0-irb.md +- 5-0-helloworld.md +- 5-1-irb-helloworld.md +- 5-2-run.md diff --git a/public/docs/ruby/1-basics/sections.yml b/public/docs/ruby/1-basics/sections.yml new file mode 100644 index 0000000..add69a1 --- /dev/null +++ b/public/docs/ruby/1-basics/sections.yml @@ -0,0 +1,9 @@ +- -intro.md +- 1-0-variable.md +- 2-0-types.md +- 3-0-nil-false.md +- 4-0-symbol.md +- 5-0-method-call.md +- 6-0-string-interpolation.md +- 7-0-summary.md +- 7-1-practice1.md diff --git a/public/docs/ruby/10-testing/sections.yml b/public/docs/ruby/10-testing/sections.yml new file mode 100644 index 0000000..a3aa1d3 --- /dev/null +++ b/public/docs/ruby/10-testing/sections.yml @@ -0,0 +1,19 @@ +- -intro.md +- 1-0-minitest.md +- 2-0-test-basic.md +- 2-1-test-class.md +- 2-2-test-file.md +- 2-3-run.md +- 3-0-assertion.md +- 3-1-assert_equal.md +- 3-2-assert.md +- 3-3-refute.md +- 3-4-assert_nil.md +- 3-5-assert_raises.md +- 4-0-tdd.md +- 4-1-tdd-red.md +- 4-2-tdd-green.md +- 4-3-tdd-refactor.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/ruby/11-metaprogramming/sections.yml b/public/docs/ruby/11-metaprogramming/sections.yml new file mode 100644 index 0000000..1d19a3a --- /dev/null +++ b/public/docs/ruby/11-metaprogramming/sections.yml @@ -0,0 +1,9 @@ +- -intro.md +- 1-0-dynamic.md +- 2-0-send.md +- 3-0-define-method.md +- 4-0-method-missing.md +- 5-0-rails-example.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/ruby/2-control-methods/sections.yml b/public/docs/ruby/2-control-methods/sections.yml new file mode 100644 index 0000000..78dc0d9 --- /dev/null +++ b/public/docs/ruby/2-control-methods/sections.yml @@ -0,0 +1,17 @@ +- -intro.md +- 1-0-conditional.md +- 1-1-if.md +- 1-2-unless.md +- 1-3-case.md +- 2-0-loop.md +- 2-1-while.md +- 2-2-until.md +- 3-0-def.md +- 4-1-default-arg.md +- 4-2-keyword-arg.md +- 4-3-splat-arg.md +- 5-0-exception.md +- 5-2-raise.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/ruby/3-everything-object/sections.yml b/public/docs/ruby/3-everything-object/sections.yml new file mode 100644 index 0000000..8229388 --- /dev/null +++ b/public/docs/ruby/3-everything-object/sections.yml @@ -0,0 +1,10 @@ +- -intro.md +- 1-0-literal.md +- 2-0-nil.md +- 3-0-message-passing.md +- 4-0-basic-method.md +- 4-1-string.md +- 4-2-integer.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/ruby/4-collections/sections.yml b/public/docs/ruby/4-collections/sections.yml new file mode 100644 index 0000000..f24cca5 --- /dev/null +++ b/public/docs/ruby/4-collections/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-array.md +- 1-2-array-push-pop.md +- 1-3-array-method.md +- 2-0-hash.md +- 2-1-hash-rocket.md +- 2-2-hash-json-like.md +- 3-0-range.md +- 3-1-range-2.md +- 3-2-range-3.md +- 3-3-range-case.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/ruby/5-blocks-iterators/sections.yml b/public/docs/ruby/5-blocks-iterators/sections.yml new file mode 100644 index 0000000..d80e68a --- /dev/null +++ b/public/docs/ruby/5-blocks-iterators/sections.yml @@ -0,0 +1,15 @@ +- -intro.md +- 1-0-block.md +- 1-1-block-arg.md +- 1-2-block-return.md +- 2-0-iterator.md +- 2-1-each.md +- 2-2-map.md +- 2-3-select.md +- 2-4-find.md +- 3-0-enumerable.md +- 4-0-for.md +- 6-0-yield.md +- 7-0-summary.md +- 7-1-practice1.md +- 7-2-practice2.md diff --git a/public/docs/ruby/6-classes/sections.yml b/public/docs/ruby/6-classes/sections.yml new file mode 100644 index 0000000..0ba67f6 --- /dev/null +++ b/public/docs/ruby/6-classes/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-initialize.md +- 2-0-instance-var-method.md +- 3-0-accessor.md +- 3-1-accessor-manual.md +- 3-2-accessor-attr.md +- 4-0-class-var-method.md +- 5-0-inheritance.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/ruby/7-modules/sections.yml b/public/docs/ruby/7-modules/sections.yml new file mode 100644 index 0000000..b7cdaa5 --- /dev/null +++ b/public/docs/ruby/7-modules/sections.yml @@ -0,0 +1,9 @@ +- -intro.md +- 1-0-basic.md +- 2-0-namespace.md +- 3-0-include.md +- 4-0-include-extend.md +- 5-0-access-control.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/ruby/8-proc-lambda/sections.yml b/public/docs/ruby/8-proc-lambda/sections.yml new file mode 100644 index 0000000..855b007 --- /dev/null +++ b/public/docs/ruby/8-proc-lambda/sections.yml @@ -0,0 +1,12 @@ +- -intro.md +- 1-0-proc.md +- 2-0-proc-new-lambda.md +- 2-1-lambda-return.md +- 2-2-args.md +- 3-0-amp-operator.md +- 3-1-block-as-proc.md +- 3-2-proc-as-block.md +- 4-0-closure.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/ruby/9-stdlib/sections.yml b/public/docs/ruby/9-stdlib/sections.yml new file mode 100644 index 0000000..57b9626 --- /dev/null +++ b/public/docs/ruby/9-stdlib/sections.yml @@ -0,0 +1,12 @@ +- -intro.md +- 1-0-filesystem.md +- 1-1-file-read-write.md +- 1-2-dir-pathname.md +- 2-0-time-date.md +- 3-0-json.md +- 4-0-regexp.md +- 4-1-match.md +- 4-2-scan-gsub.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/rust/0-intro/sections.yml b/public/docs/rust/0-intro/sections.yml new file mode 100644 index 0000000..6715921 --- /dev/null +++ b/public/docs/rust/0-intro/sections.yml @@ -0,0 +1,15 @@ +- -intro.md +- 1-0-features.md +- 1-1-memory-safety.md +- 1-2-zero-cost.md +- 1-3-concurrency.md +- 2-0-setup.md +- 2-1-rustup.md +- 3-0-hello-world.md +- 3-1-points.md +- 4-0-cargo.md +- 4-1-cargo-new.md +- 4-2-cargo-commands.md +- 5-0-fmt-lint.md +- 5-1-rustfmt.md +- 5-2-clippy.md diff --git a/public/docs/rust/1-basics/sections.yml b/public/docs/rust/1-basics/sections.yml new file mode 100644 index 0000000..8a5a4c8 --- /dev/null +++ b/public/docs/rust/1-basics/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-let-mut.md +- 1-1-immutable.md +- 1-2-mutable.md +- 2-0-shadowing.md +- 3-0-data-types.md +- 3-1-scalar.md +- 3-2-compound.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/rust/10-generics-traits/sections.yml b/public/docs/rust/10-generics-traits/sections.yml new file mode 100644 index 0000000..45fbe1f --- /dev/null +++ b/public/docs/rust/10-generics-traits/sections.yml @@ -0,0 +1,15 @@ +- -intro.md +- 1-0-rust-approach.md +- 2-0-generics.md +- 2-1-generic-func.md +- 2-2-generic-struct.md +- 3-0-traits.md +- 3-1-trait-def.md +- 3-2-trait-impl.md +- 4-0-trait-bounds.md +- 4-1-basic-syntax.md +- 4-2-where-clause.md +- 5-0-std-traits.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/rust/11-lifetimes/sections.yml b/public/docs/rust/11-lifetimes/sections.yml new file mode 100644 index 0000000..36297a9 --- /dev/null +++ b/public/docs/rust/11-lifetimes/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-what-is-lifetime.md +- 1-1-dangling-ref.md +- 2-0-func-lifetime.md +- 2-1-lifetime-syntax.md +- 3-0-elision.md +- 4-0-struct-lifetime.md +- 5-0-static-lifetime.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/rust/2-functions-control/sections.yml b/public/docs/rust/2-functions-control/sections.yml new file mode 100644 index 0000000..dad8952 --- /dev/null +++ b/public/docs/rust/2-functions-control/sections.yml @@ -0,0 +1,13 @@ +- -intro.md +- 1-0-functions-expr.md +- 1-1-params-return.md +- 1-2-stmt-expr.md +- 2-0-control-flow.md +- 2-1-if.md +- 2-2-loops.md +- 2-3-loop-return.md +- 2-4-while.md +- 2-5-for.md +- 3-0-summary.md +- 4-0-practice1.md +- 4-1-practice2.md diff --git a/public/docs/rust/3-ownership/sections.yml b/public/docs/rust/3-ownership/sections.yml new file mode 100644 index 0000000..ffa857b --- /dev/null +++ b/public/docs/rust/3-ownership/sections.yml @@ -0,0 +1,15 @@ +- -intro.md +- 1-0-stack-heap.md +- 1-1-stack.md +- 1-2-heap.md +- 2-0-ownership-rules.md +- 2-1-scope.md +- 3-0-move-copy.md +- 3-1-copy.md +- 3-2-move.md +- 3-3-clone.md +- 4-0-ownership-func.md +- 4-1-return-ownership.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/rust/4-borrowing-slices/sections.yml b/public/docs/rust/4-borrowing-slices/sections.yml new file mode 100644 index 0000000..0d04ca4 --- /dev/null +++ b/public/docs/rust/4-borrowing-slices/sections.yml @@ -0,0 +1,16 @@ +- -intro.md +- 1-0-ref-borrow.md +- 1-1-immutable-ref.md +- 1-2-mutable-ref.md +- 2-0-borrow-rules.md +- 2-1-single-mut-ref.md +- 2-2-no-mixed-refs.md +- 3-0-dangling-ptr.md +- 4-0-slice.md +- 4-1-str-slice.md +- 4-2-str-literal.md +- 4-3-str-param.md +- 5-0-other-slices.md +- 6-0-summary.md +- 7-0-practice1.md +- 7-1-practice2.md diff --git a/public/docs/rust/5-structs-methods/sections.yml b/public/docs/rust/5-structs-methods/sections.yml new file mode 100644 index 0000000..3e877f7 --- /dev/null +++ b/public/docs/rust/5-structs-methods/sections.yml @@ -0,0 +1,15 @@ +- -intro.md +- 1-0-struct-def.md +- 1-1-basic-def.md +- 1-2-field-shorthand.md +- 1-3-struct-update.md +- 2-0-tuple-unit-structs.md +- 2-1-tuple-structs.md +- 2-2-unit-structs.md +- 3-0-ownership-structs.md +- 4-0-impl.md +- 4-1-methods.md +- 4-2-assoc-funcs.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/rust/6-enums-pattern/sections.yml b/public/docs/rust/6-enums-pattern/sections.yml new file mode 100644 index 0000000..d993d86 --- /dev/null +++ b/public/docs/rust/6-enums-pattern/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-enum-def.md +- 1-1-enum-vs-struct.md +- 1-2-enum-data.md +- 2-0-option.md +- 2-1-why-safe.md +- 3-0-match.md +- 3-1-exhaustive.md +- 3-2-option-match.md +- 3-3-placeholder.md +- 4-0-if-let.md +- 5-0-summary.md +- 5-1-practice1.md +- 5-2-practice2.md diff --git a/public/docs/rust/7-modules/sections.yml b/public/docs/rust/7-modules/sections.yml new file mode 100644 index 0000000..94a1dc9 --- /dev/null +++ b/public/docs/rust/7-modules/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-pkg-crate-module.md +- 1-1-mod-def.md +- 2-0-visibility.md +- 2-1-struct-visibility.md +- 3-0-use-paths.md +- 3-1-abs-rel-paths.md +- 4-0-file-split.md +- 5-0-external-crates.md +- 5-1-cargotoml.md +- 5-2-usage.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/rust/8-collections-strings/sections.yml b/public/docs/rust/8-collections-strings/sections.yml new file mode 100644 index 0000000..42fce4d --- /dev/null +++ b/public/docs/rust/8-collections-strings/sections.yml @@ -0,0 +1,15 @@ +- -intro.md +- 1-0-vec.md +- 1-1-vec-create.md +- 1-2-vec-access.md +- 2-0-string-utf8.md +- 2-1-string-str.md +- 2-2-string-ops.md +- 2-3-no-indexing.md +- 3-0-hashmap.md +- 3-1-hashmap-basic.md +- 3-2-ownership.md +- 3-3-entry-api.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/public/docs/rust/9-error-handling/sections.yml b/public/docs/rust/9-error-handling/sections.yml new file mode 100644 index 0000000..2936f26 --- /dev/null +++ b/public/docs/rust/9-error-handling/sections.yml @@ -0,0 +1,13 @@ +- -intro.md +- 1-0-error-types.md +- 2-0-panic.md +- 3-0-result.md +- 3-1-result-basic.md +- 4-0-unwrap-expect.md +- 4-1-unwrap.md +- 4-2-expect.md +- 5-0-propagation.md +- 6-0-custom-error.md +- 7-0-summary.md +- 7-1-practice1.md +- 7-2-practice2.md diff --git a/public/docs/typescript/0-intro/sections.yml b/public/docs/typescript/0-intro/sections.yml new file mode 100644 index 0000000..77eb3ed --- /dev/null +++ b/public/docs/typescript/0-intro/sections.yml @@ -0,0 +1,10 @@ +- -intro.md +- 1-0-about.md +- 2-0-why.md +- 3-0-setup.md +- 3-1-create-install.md +- 4-0-first-ts.md +- 4-1-code.md +- 4-2-compile-run.md +- 5-0-tsconfig.md +- 5-1-compile-config.md diff --git a/public/docs/typescript/1-types/sections.yml b/public/docs/typescript/1-types/sections.yml new file mode 100644 index 0000000..fbbfea5 --- /dev/null +++ b/public/docs/typescript/1-types/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-type-annotations.md +- 2-0-primitive-types.md +- 3-0-type-inference.md +- 4-0-special-types.md +- 4-1-any.md +- 4-2-unknown.md +- 4-3-never.md +- 5-0-array-tuple.md +- 5-1-array.md +- 5-2-tuple.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/typescript/2-objects-interfaces/sections.yml b/public/docs/typescript/2-objects-interfaces/sections.yml new file mode 100644 index 0000000..d9efd79 --- /dev/null +++ b/public/docs/typescript/2-objects-interfaces/sections.yml @@ -0,0 +1,10 @@ +- -intro.md +- 1-0-object-types.md +- 2-0-type-alias.md +- 3-0-interface.md +- 4-0-type-vs-interface.md +- 5-0-optional-props.md +- 6-0-readonly.md +- 7-0-summary.md +- 7-1-practice1.md +- 7-2-practice2.md diff --git a/public/docs/typescript/3-function-types/sections.yml b/public/docs/typescript/3-function-types/sections.yml new file mode 100644 index 0000000..d356caf --- /dev/null +++ b/public/docs/typescript/3-function-types/sections.yml @@ -0,0 +1,14 @@ +- -intro.md +- 1-0-params-return.md +- 2-0-optional-default.md +- 2-1-optional.md +- 2-2-default.md +- 3-0-arrow-this.md +- 3-1-arrow-type.md +- 3-2-this-type.md +- 4-0-overload.md +- 5-0-rest-params.md +- 6-0-type-alias.md +- 7-0-summary.md +- 7-1-practice1.md +- 7-2-practice2.md diff --git a/public/docs/typescript/4-combining-types/sections.yml b/public/docs/typescript/4-combining-types/sections.yml new file mode 100644 index 0000000..0a50be2 --- /dev/null +++ b/public/docs/typescript/4-combining-types/sections.yml @@ -0,0 +1,13 @@ +- -intro.md +- 1-0-union.md +- 2-0-literal.md +- 3-0-intersection.md +- 4-0-null-undefined.md +- 5-0-type-guards.md +- 5-1-typeof.md +- 5-2-in.md +- 5-3-instanceof.md +- 6-0-type-assertions.md +- 7-0-summary.md +- 7-1-practice1.md +- 7-2-practice2.md diff --git a/public/docs/typescript/5-generics/sections.yml b/public/docs/typescript/5-generics/sections.yml new file mode 100644 index 0000000..80c6333 --- /dev/null +++ b/public/docs/typescript/5-generics/sections.yml @@ -0,0 +1,9 @@ +- -intro.md +- 1-0-generics-intro.md +- 2-0-generics-func.md +- 3-0-generics-interface.md +- 4-0-generics-class.md +- 5-0-type-constraint.md +- 6-0-summary.md +- 6-1-practice1.md +- 6-2-practice2.md diff --git a/public/docs/typescript/6-classes/sections.yml b/public/docs/typescript/6-classes/sections.yml new file mode 100644 index 0000000..812f0dd --- /dev/null +++ b/public/docs/typescript/6-classes/sections.yml @@ -0,0 +1,11 @@ +- -intro.md +- 1-0-js-class-review.md +- 2-0-ts-class.md +- 3-0-access-modifiers.md +- 3-1-param-props.md +- 4-0-readonly.md +- 5-0-implements.md +- 6-0-abstract.md +- 7-0-summary.md +- 7-1-practice1.md +- 7-2-practice2.md diff --git a/public/docs/typescript/7-async-utilities/sections.yml b/public/docs/typescript/7-async-utilities/sections.yml new file mode 100644 index 0000000..79af05f --- /dev/null +++ b/public/docs/typescript/7-async-utilities/sections.yml @@ -0,0 +1,16 @@ +- -intro.md +- 1-0-async-types.md +- 1-1-basic-def.md +- 1-2-error-handling.md +- 2-0-utility-types.md +- 2-1-base-types.md +- 2-2-partial.md +- 2-3-readonly.md +- 2-4-pick.md +- 2-5-omit.md +- 3-0-advanced-types.md +- 3-1-mapped-types.md +- 3-2-conditional-types.md +- 4-0-summary.md +- 4-1-practice1.md +- 4-2-practice2.md diff --git a/scripts/generateSectionsList.ts b/scripts/generateSectionsList.ts new file mode 100644 index 0000000..e2933bd --- /dev/null +++ b/scripts/generateSectionsList.ts @@ -0,0 +1,46 @@ +// Generates public/docs/{lang}/{pageId}/sections.yml for each page directory. +// Each sections.yml lists the .md files in that directory in display order. + +import { readdir, writeFile, stat } from "node:fs/promises"; +import { join } from "node:path"; + +const docsDir = join(process.cwd(), "public", "docs"); + +function naturalSortMdFiles(a: string, b: string): number { + // -intro.md always comes first + if (a === "-intro.md") return -1; + if (b === "-intro.md") return 1; + // Sort numerically by leading N1-N2 prefix + const aMatch = a.match(/^(\d+)-(\d+)/); + const bMatch = b.match(/^(\d+)-(\d+)/); + if (aMatch && bMatch) { + const n1Diff = parseInt(aMatch[1]) - parseInt(bMatch[1]); + if (n1Diff !== 0) return n1Diff; + return parseInt(aMatch[2]) - parseInt(bMatch[2]); + } + return a.localeCompare(b); +} + +const langEntries = await readdir(docsDir); +for (const langId of langEntries) { + const langDir = join(docsDir, langId); + if (!(await stat(langDir)).isDirectory()) continue; + + const pageEntries = await readdir(langDir); + for (const pageId of pageEntries) { + // Only process page directories (start with a digit to skip index.yml and other metadata files) + if (!/^\d/.test(pageId)) continue; + const pageDir = join(langDir, pageId); + if (!(await stat(pageDir)).isDirectory()) continue; + + const files = (await readdir(pageDir)) + .filter((f) => f.endsWith(".md")) + .sort(naturalSortMdFiles); + + const yamlContent = files.map((f) => `- ${f}`).join("\n") + "\n"; + await writeFile(join(pageDir, "sections.yml"), yamlContent, "utf-8"); + console.log( + `Generated ${langId}/${pageId}/sections.yml (${files.length} files)` + ); + } +} From d16e95f1a7ca497e929bae8cfbd5e5149e260fdb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:06:07 +0000 Subject: [PATCH 13/25] Use js-yaml for YAML parsing in page route and generateSections script Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- app/[lang]/[pageId]/page.tsx | 31 +++++++++++++------------------ package.json | 2 ++ scripts/generateSectionsList.ts | 3 ++- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/app/[lang]/[pageId]/page.tsx b/app/[lang]/[pageId]/page.tsx index d439497..605e0c8 100644 --- a/app/[lang]/[pageId]/page.tsx +++ b/app/[lang]/[pageId]/page.tsx @@ -3,6 +3,7 @@ import { notFound } from "next/navigation"; import { getCloudflareContext } from "@opennextjs/cloudflare"; import { readFile } from "node:fs/promises"; import { join } from "node:path"; +import yaml from "js-yaml"; import { MarkdownSection } from "../[docs_id]/splitMarkdown"; import { PageContent } from "../[docs_id]/pageContent"; import { ChatHistoryProvider } from "../[docs_id]/chatHistory"; @@ -51,20 +52,18 @@ function parseFrontmatter(content: string): { if (endIdx === -1) { return { id: "", title: "", level: 0, body: content }; } - const fm = content.slice(4, endIdx); + const fm = yaml.load(content.slice(4, endIdx)) as { + id?: string; + title?: string; + level?: number; + }; const body = content.slice(endIdx + 5); - - const id = fm.match(/^id:\s*(.+)$/m)?.[1]?.trim() ?? ""; - let title = fm.match(/^title:\s*(.+)$/m)?.[1]?.trim() ?? ""; - // YAMLクォヌトを陀去 - if ( - (title.startsWith("'") && title.endsWith("'")) || - (title.startsWith('"') && title.endsWith('"')) - ) { - title = title.slice(1, -1); - } - const level = parseInt(fm.match(/^level:\s*(\d+)$/m)?.[1] ?? "2"); - return { id, title, level, body }; + return { + id: fm?.id ?? "", + title: fm?.title ?? "", + level: fm?.level ?? 2, + body, + }; } /** @@ -76,11 +75,7 @@ async function getMarkdownSections( pageTitle: string ): Promise { const sectionsYml = await readDocFile(lang, pageId, "sections.yml"); - const files = sectionsYml - .split("\n") - .filter((l) => l.trim().startsWith("- ")) - .map((l) => l.trim().slice(2).trim()) - .filter(Boolean); + const files = yaml.load(sectionsYml) as string[]; const sections: MarkdownSection[] = []; for (const file of files) { diff --git a/package.json b/package.json index 284ceb9..d90005c 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "comlink": "^4.4.2", "dotenv": "^17.2.3", "drizzle-orm": "^0.44.7", + "js-yaml": "^4.1.1", "mocha": "^11.7.4", "next": "^15.5.11", "object-inspect": "^1.13.4", @@ -56,6 +57,7 @@ "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", + "@types/js-yaml": "^4.0.9", "@types/chai": "^5.2.3", "@types/mocha": "^10.0.10", "@types/node": "^20", diff --git a/scripts/generateSectionsList.ts b/scripts/generateSectionsList.ts index e2933bd..6b294b3 100644 --- a/scripts/generateSectionsList.ts +++ b/scripts/generateSectionsList.ts @@ -3,6 +3,7 @@ import { readdir, writeFile, stat } from "node:fs/promises"; import { join } from "node:path"; +import yaml from "js-yaml"; const docsDir = join(process.cwd(), "public", "docs"); @@ -37,7 +38,7 @@ for (const langId of langEntries) { .filter((f) => f.endsWith(".md")) .sort(naturalSortMdFiles); - const yamlContent = files.map((f) => `- ${f}`).join("\n") + "\n"; + const yamlContent = yaml.dump(files); await writeFile(join(pageDir, "sections.yml"), yamlContent, "utf-8"); console.log( `Generated ${langId}/${pageId}/sections.yml (${files.length} files)` From cf428cd6dbf6976b9c62dc92354f015eba8f0ade Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:06:27 +0000 Subject: [PATCH 14/25] Add sections.yml to .gitignore and remove committed files Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- .gitignore | 3 +++ public/docs/cpp/0-intro/sections.yml | 14 -------------- public/docs/cpp/1-types-control/sections.yml | 14 -------------- .../docs/cpp/10-stl-containers/sections.yml | 8 -------- .../docs/cpp/11-stl-algorithms/sections.yml | 10 ---------- .../docs/cpp/12-raii-smart-ptrs/sections.yml | 10 ---------- .../docs/cpp/2-data-containers/sections.yml | 8 -------- public/docs/cpp/3-pointers/sections.yml | 13 ------------- public/docs/cpp/4-functions/sections.yml | 15 --------------- public/docs/cpp/5-project-build/sections.yml | 12 ------------ public/docs/cpp/6-classes-basics/sections.yml | 10 ---------- .../docs/cpp/7-classes-advanced/sections.yml | 10 ---------- public/docs/cpp/8-inheritance/sections.yml | 8 -------- public/docs/cpp/9-templates/sections.yml | 8 -------- public/docs/javascript/0-intro/sections.yml | 8 -------- public/docs/javascript/1-basics/sections.yml | 11 ----------- public/docs/javascript/2-control/sections.yml | 14 -------------- .../3-functions-closures/sections.yml | 14 -------------- public/docs/javascript/4-this/sections.yml | 9 --------- .../5-objects-prototype/sections.yml | 13 ------------- public/docs/javascript/6-classes/sections.yml | 11 ----------- public/docs/javascript/7-arrays/sections.yml | 11 ----------- public/docs/javascript/8-promise/sections.yml | 11 ----------- .../javascript/9-async-await/sections.yml | 14 -------------- public/docs/python/0-intro/sections.yml | 9 --------- public/docs/python/1-basics/sections.yml | 11 ----------- public/docs/python/2-collections/sections.yml | 13 ------------- .../python/3-control-functions/sections.yml | 15 --------------- public/docs/python/4-modules/sections.yml | 17 ----------------- public/docs/python/5-oop/sections.yml | 11 ----------- public/docs/python/6-file-io/sections.yml | 13 ------------- public/docs/python/7-exceptions/sections.yml | 10 ---------- .../8-generators-decorators/sections.yml | 9 --------- public/docs/ruby/0-intro/sections.yml | 8 -------- public/docs/ruby/1-basics/sections.yml | 9 --------- public/docs/ruby/10-testing/sections.yml | 19 ------------------- .../docs/ruby/11-metaprogramming/sections.yml | 9 --------- .../docs/ruby/2-control-methods/sections.yml | 17 ----------------- .../ruby/3-everything-object/sections.yml | 10 ---------- public/docs/ruby/4-collections/sections.yml | 14 -------------- .../docs/ruby/5-blocks-iterators/sections.yml | 15 --------------- public/docs/ruby/6-classes/sections.yml | 11 ----------- public/docs/ruby/7-modules/sections.yml | 9 --------- public/docs/ruby/8-proc-lambda/sections.yml | 12 ------------ public/docs/ruby/9-stdlib/sections.yml | 12 ------------ public/docs/rust/0-intro/sections.yml | 15 --------------- public/docs/rust/1-basics/sections.yml | 11 ----------- .../docs/rust/10-generics-traits/sections.yml | 15 --------------- public/docs/rust/11-lifetimes/sections.yml | 11 ----------- .../rust/2-functions-control/sections.yml | 13 ------------- public/docs/rust/3-ownership/sections.yml | 15 --------------- .../docs/rust/4-borrowing-slices/sections.yml | 16 ---------------- .../docs/rust/5-structs-methods/sections.yml | 15 --------------- public/docs/rust/6-enums-pattern/sections.yml | 14 -------------- public/docs/rust/7-modules/sections.yml | 14 -------------- .../rust/8-collections-strings/sections.yml | 15 --------------- .../docs/rust/9-error-handling/sections.yml | 13 ------------- public/docs/typescript/0-intro/sections.yml | 10 ---------- public/docs/typescript/1-types/sections.yml | 14 -------------- .../2-objects-interfaces/sections.yml | 10 ---------- .../typescript/3-function-types/sections.yml | 14 -------------- .../typescript/4-combining-types/sections.yml | 13 ------------- .../docs/typescript/5-generics/sections.yml | 9 --------- public/docs/typescript/6-classes/sections.yml | 11 ----------- .../typescript/7-async-utilities/sections.yml | 16 ---------------- 65 files changed, 3 insertions(+), 773 deletions(-) delete mode 100644 public/docs/cpp/0-intro/sections.yml delete mode 100644 public/docs/cpp/1-types-control/sections.yml delete mode 100644 public/docs/cpp/10-stl-containers/sections.yml delete mode 100644 public/docs/cpp/11-stl-algorithms/sections.yml delete mode 100644 public/docs/cpp/12-raii-smart-ptrs/sections.yml delete mode 100644 public/docs/cpp/2-data-containers/sections.yml delete mode 100644 public/docs/cpp/3-pointers/sections.yml delete mode 100644 public/docs/cpp/4-functions/sections.yml delete mode 100644 public/docs/cpp/5-project-build/sections.yml delete mode 100644 public/docs/cpp/6-classes-basics/sections.yml delete mode 100644 public/docs/cpp/7-classes-advanced/sections.yml delete mode 100644 public/docs/cpp/8-inheritance/sections.yml delete mode 100644 public/docs/cpp/9-templates/sections.yml delete mode 100644 public/docs/javascript/0-intro/sections.yml delete mode 100644 public/docs/javascript/1-basics/sections.yml delete mode 100644 public/docs/javascript/2-control/sections.yml delete mode 100644 public/docs/javascript/3-functions-closures/sections.yml delete mode 100644 public/docs/javascript/4-this/sections.yml delete mode 100644 public/docs/javascript/5-objects-prototype/sections.yml delete mode 100644 public/docs/javascript/6-classes/sections.yml delete mode 100644 public/docs/javascript/7-arrays/sections.yml delete mode 100644 public/docs/javascript/8-promise/sections.yml delete mode 100644 public/docs/javascript/9-async-await/sections.yml delete mode 100644 public/docs/python/0-intro/sections.yml delete mode 100644 public/docs/python/1-basics/sections.yml delete mode 100644 public/docs/python/2-collections/sections.yml delete mode 100644 public/docs/python/3-control-functions/sections.yml delete mode 100644 public/docs/python/4-modules/sections.yml delete mode 100644 public/docs/python/5-oop/sections.yml delete mode 100644 public/docs/python/6-file-io/sections.yml delete mode 100644 public/docs/python/7-exceptions/sections.yml delete mode 100644 public/docs/python/8-generators-decorators/sections.yml delete mode 100644 public/docs/ruby/0-intro/sections.yml delete mode 100644 public/docs/ruby/1-basics/sections.yml delete mode 100644 public/docs/ruby/10-testing/sections.yml delete mode 100644 public/docs/ruby/11-metaprogramming/sections.yml delete mode 100644 public/docs/ruby/2-control-methods/sections.yml delete mode 100644 public/docs/ruby/3-everything-object/sections.yml delete mode 100644 public/docs/ruby/4-collections/sections.yml delete mode 100644 public/docs/ruby/5-blocks-iterators/sections.yml delete mode 100644 public/docs/ruby/6-classes/sections.yml delete mode 100644 public/docs/ruby/7-modules/sections.yml delete mode 100644 public/docs/ruby/8-proc-lambda/sections.yml delete mode 100644 public/docs/ruby/9-stdlib/sections.yml delete mode 100644 public/docs/rust/0-intro/sections.yml delete mode 100644 public/docs/rust/1-basics/sections.yml delete mode 100644 public/docs/rust/10-generics-traits/sections.yml delete mode 100644 public/docs/rust/11-lifetimes/sections.yml delete mode 100644 public/docs/rust/2-functions-control/sections.yml delete mode 100644 public/docs/rust/3-ownership/sections.yml delete mode 100644 public/docs/rust/4-borrowing-slices/sections.yml delete mode 100644 public/docs/rust/5-structs-methods/sections.yml delete mode 100644 public/docs/rust/6-enums-pattern/sections.yml delete mode 100644 public/docs/rust/7-modules/sections.yml delete mode 100644 public/docs/rust/8-collections-strings/sections.yml delete mode 100644 public/docs/rust/9-error-handling/sections.yml delete mode 100644 public/docs/typescript/0-intro/sections.yml delete mode 100644 public/docs/typescript/1-types/sections.yml delete mode 100644 public/docs/typescript/2-objects-interfaces/sections.yml delete mode 100644 public/docs/typescript/3-function-types/sections.yml delete mode 100644 public/docs/typescript/4-combining-types/sections.yml delete mode 100644 public/docs/typescript/5-generics/sections.yml delete mode 100644 public/docs/typescript/6-classes/sections.yml delete mode 100644 public/docs/typescript/7-async-utilities/sections.yml diff --git a/.gitignore b/.gitignore index 7eaedd6..8f7af8a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ /.open-next /cloudflare-env.d.ts +# generated docs section file lists (regenerated by npm run generateSections) +/public/docs/**/sections.yml + # dependencies /node_modules /.pnp diff --git a/public/docs/cpp/0-intro/sections.yml b/public/docs/cpp/0-intro/sections.yml deleted file mode 100644 index 815fad0..0000000 --- a/public/docs/cpp/0-intro/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-about.md -- 1-1-feature.md -- 1-2-usage.md -- 2-0-env-about.md -- 2-1-ide.md -- 2-2-setup.md -- 3-0-helloworld.md -- 3-1-run.md -- 4-0-basic.md -- 4-1-include.md -- 4-2-main.md -- 4-3-namespace.md -- 5-0-summary.md diff --git a/public/docs/cpp/1-types-control/sections.yml b/public/docs/cpp/1-types-control/sections.yml deleted file mode 100644 index 26395ff..0000000 --- a/public/docs/cpp/1-types-control/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-basic-types.md -- 2-0-uniform-init.md -- 3-0-modifier.md -- 3-1-const.md -- 3-2-auto.md -- 4-0-console.md -- 5-0-control.md -- 5-1-if.md -- 5-2-switch.md -- 5-3-loop.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/cpp/10-stl-containers/sections.yml b/public/docs/cpp/10-stl-containers/sections.yml deleted file mode 100644 index 97b3e74..0000000 --- a/public/docs/cpp/10-stl-containers/sections.yml +++ /dev/null @@ -1,8 +0,0 @@ -- -intro.md -- 1-0-about.md -- 2-0-vector.md -- 3-0-map.md -- 4-0-other.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/cpp/11-stl-algorithms/sections.yml b/public/docs/cpp/11-stl-algorithms/sections.yml deleted file mode 100644 index 69bdefa..0000000 --- a/public/docs/cpp/11-stl-algorithms/sections.yml +++ /dev/null @@ -1,10 +0,0 @@ -- -intro.md -- 1-0-about.md -- 2-0-algo.md -- 2-1-sort.md -- 2-2-find.md -- 2-3-foreach.md -- 3-0-lambda.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/cpp/12-raii-smart-ptrs/sections.yml b/public/docs/cpp/12-raii-smart-ptrs/sections.yml deleted file mode 100644 index 12e17e4..0000000 --- a/public/docs/cpp/12-raii-smart-ptrs/sections.yml +++ /dev/null @@ -1,10 +0,0 @@ -- -intro.md -- 1-0-trycatch.md -- 1-1-leak.md -- 2-0-raii.md -- 3-0-smartptr.md -- 3-1-uniqueptr.md -- 3-2-sharedptr.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/cpp/2-data-containers/sections.yml b/public/docs/cpp/2-data-containers/sections.yml deleted file mode 100644 index f687aab..0000000 --- a/public/docs/cpp/2-data-containers/sections.yml +++ /dev/null @@ -1,8 +0,0 @@ -- -intro.md -- 1-0-string.md -- 2-0-vector.md -- 3-0-array.md -- 4-0-range-based-for.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/cpp/3-pointers/sections.yml b/public/docs/cpp/3-pointers/sections.yml deleted file mode 100644 index 3e3a95a..0000000 --- a/public/docs/cpp/3-pointers/sections.yml +++ /dev/null @@ -1,13 +0,0 @@ -- -intro.md -- 1-0-basic.md -- 1-1-address-operator.md -- 1-2-nullptr.md -- 2-0-array.md -- 3-0-legacy-string.md -- 4-0-memory-area.md -- 4-1-stack.md -- 4-2-heap.md -- 4-4-memory-leak.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/cpp/4-functions/sections.yml b/public/docs/cpp/4-functions/sections.yml deleted file mode 100644 index c2b7410..0000000 --- a/public/docs/cpp/4-functions/sections.yml +++ /dev/null @@ -1,15 +0,0 @@ -- -intro.md -- 1-0-basic.md -- 1-1-prototype-declaration.md -- 1-2-void.md -- 2-0-argument.md -- 2-1-arg-by-value.md -- 2-2-arg-by-pointer.md -- 2-3-arg-by-reference.md -- 2-4-arg-by-const-reference.md -- 3-0-features.md -- 3-1-overload.md -- 3-2-default-arg.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/cpp/5-project-build/sections.yml b/public/docs/cpp/5-project-build/sections.yml deleted file mode 100644 index a9d12c8..0000000 --- a/public/docs/cpp/5-project-build/sections.yml +++ /dev/null @@ -1,12 +0,0 @@ -- -intro.md -- 1-0-header-and-source.md -- 1-2-split-example.md -- 2-0-include-guard.md -- 2-1-include-guard-by-define.md -- 2-2-pragma-once.md -- 3-0-build.md -- 3-1-gcc-manual.md -- 3-2-makefile.md -- 3-3-cmake.md -- 4-0-summary.md -- 4-1-practice1.md diff --git a/public/docs/cpp/6-classes-basics/sections.yml b/public/docs/cpp/6-classes-basics/sections.yml deleted file mode 100644 index ae3adc7..0000000 --- a/public/docs/cpp/6-classes-basics/sections.yml +++ /dev/null @@ -1,10 +0,0 @@ -- -intro.md -- 1-0-about.md -- 2-0-instance.md -- 3-0-access-control.md -- 4-0-constructor-destructor.md -- 4-1-constructor.md -- 4-2-destructor.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/cpp/7-classes-advanced/sections.yml b/public/docs/cpp/7-classes-advanced/sections.yml deleted file mode 100644 index 1f7a46b..0000000 --- a/public/docs/cpp/7-classes-advanced/sections.yml +++ /dev/null @@ -1,10 +0,0 @@ -- -intro.md -- 1-0-copy.md -- 1-1-shallow-copy.md -- 1-2-deep-copy.md -- 2-0-operator-overload.md -- 3-0-static-member.md -- 4-0-this.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/cpp/8-inheritance/sections.yml b/public/docs/cpp/8-inheritance/sections.yml deleted file mode 100644 index 9ea74f8..0000000 --- a/public/docs/cpp/8-inheritance/sections.yml +++ /dev/null @@ -1,8 +0,0 @@ -- -intro.md -- 1-0-inheritance.md -- 2-0-polymorphism.md -- 3-0-override.md -- 4-0-abstract-class.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/cpp/9-templates/sections.yml b/public/docs/cpp/9-templates/sections.yml deleted file mode 100644 index 2d2247c..0000000 --- a/public/docs/cpp/9-templates/sections.yml +++ /dev/null @@ -1,8 +0,0 @@ -- -intro.md -- 1-0-function-template.md -- 1-1-function-template-detail.md -- 2-0-class-template.md -- 2-1-class-template-detail.md -- 3-0-summary.md -- 3-1-practice1.md -- 3-2-practice2.md diff --git a/public/docs/javascript/0-intro/sections.yml b/public/docs/javascript/0-intro/sections.yml deleted file mode 100644 index 0e20b2e..0000000 --- a/public/docs/javascript/0-intro/sections.yml +++ /dev/null @@ -1,8 +0,0 @@ -- -intro.md -- 1-0-about.md -- 2-0-environment.md -- 3-0-comparison.md -- 4-0-helloworld.md -- 4-1-repl.md -- 4-2-run-source.md -- 4-3-browser.md diff --git a/public/docs/javascript/1-basics/sections.yml b/public/docs/javascript/1-basics/sections.yml deleted file mode 100644 index a2b76c5..0000000 --- a/public/docs/javascript/1-basics/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-variable.md -- 2-0-primitive-type.md -- 2-1-null-undefined.md -- 3-0-object.md -- 3-1-const-object.md -- 4-0-equality.md -- 5-1-add-operator.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/javascript/2-control/sections.yml b/public/docs/javascript/2-control/sections.yml deleted file mode 100644 index ea34912..0000000 --- a/public/docs/javascript/2-control/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-1-if-truthy.md -- 1-2-switch.md -- 2-0-loop.md -- 2-1-for.md -- 2-2-while.md -- 3-0-iteration.md -- 3-1-for-in.md -- 3-2-for-of.md -- 4-0-try-catch.md -- 4-2-throw.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/javascript/3-functions-closures/sections.yml b/public/docs/javascript/3-functions-closures/sections.yml deleted file mode 100644 index d2f684d..0000000 --- a/public/docs/javascript/3-functions-closures/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-function.md -- 1-1-function-declaration.md -- 1-2-function-expression.md -- 2-0-arrow-function.md -- 2-2-arrow-function-simple.md -- 3-0-argument.md -- 3-1-default-arg.md -- 3-2-rest-arg.md -- 4-0-scope-chain.md -- 5-0-closure.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/javascript/4-this/sections.yml b/public/docs/javascript/4-this/sections.yml deleted file mode 100644 index 24bc8a4..0000000 --- a/public/docs/javascript/4-this/sections.yml +++ /dev/null @@ -1,9 +0,0 @@ -- -intro.md -- 1-0-this-basic.md -- 2-0-bind-basic.md -- 2-1-call-apply.md -- 2-2-bind.md -- 3-0-arrow-func.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/javascript/5-objects-prototype/sections.yml b/public/docs/javascript/5-objects-prototype/sections.yml deleted file mode 100644 index 1e01933..0000000 --- a/public/docs/javascript/5-objects-prototype/sections.yml +++ /dev/null @@ -1,13 +0,0 @@ -- -intro.md -- 1-0-obj-literal.md -- 1-1-properties.md -- 2-0-method-this-recall.md -- 3-0-prototype-basic.md -- 3-1-getprototypeof.md -- 4-0-prototype-chain.md -- 5-0-object-create-basic.md -- 5-1-object-create.md -- 5-2-new-constructor.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/javascript/6-classes/sections.yml b/public/docs/javascript/6-classes/sections.yml deleted file mode 100644 index 333f6ca..0000000 --- a/public/docs/javascript/6-classes/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-class-constructor.md -- 1-1-class-expr.md -- 2-0-method.md -- 3-0-extends-super.md -- 4-0-static-private.md -- 4-1-static.md -- 4-2-private.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/javascript/7-arrays/sections.yml b/public/docs/javascript/7-arrays/sections.yml deleted file mode 100644 index dc5c7bc..0000000 --- a/public/docs/javascript/7-arrays/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-array-literal.md -- 1-2-array-splice.md -- 2-0-spread-destructure-basic.md -- 2-1-spread.md -- 2-2-destructuring.md -- 3-0-higher-order-func.md -- 4-0-other-method.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/javascript/8-promise/sections.yml b/public/docs/javascript/8-promise/sections.yml deleted file mode 100644 index fe8187a..0000000 --- a/public/docs/javascript/8-promise/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-sync-vs-async.md -- 2-0-event-callback.md -- 3-0-callback-hell.md -- 4-0-promise-basic.md -- 5-0-promise-usage.md -- 5-1-promise-create.md -- 5-2-promise-method.md -- 6-0-summary.md -- 7-1-practice1.md -- 7-2-practice2.md diff --git a/public/docs/javascript/9-async-await/sections.yml b/public/docs/javascript/9-async-await/sections.yml deleted file mode 100644 index 9d483d7..0000000 --- a/public/docs/javascript/9-async-await/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-async-await.md -- 1-1-async.md -- 1-2-await.md -- 2-0-try-catch.md -- 3-0-fetch.md -- 3-1-fetch-post.md -- 4-0-promise-all-race.md -- 4-1-sequential.md -- 4-2-promise-all.md -- 4-3-promise-race.md -- 5-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/python/0-intro/sections.yml b/public/docs/python/0-intro/sections.yml deleted file mode 100644 index 31284c3..0000000 --- a/public/docs/python/0-intro/sections.yml +++ /dev/null @@ -1,9 +0,0 @@ -- -intro.md -- 1-0-readability.md -- 2-0-install.md -- 2-3-version-management.md -- 3-0-repl.md -- 3-3-repl-usage.md -- 4-0-script-run.md -- 4-1-main-snippet.md -- 5-0-pip-venv.md diff --git a/public/docs/python/1-basics/sections.yml b/public/docs/python/1-basics/sections.yml deleted file mode 100644 index f182bb7..0000000 --- a/public/docs/python/1-basics/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-variable.md -- 2-0-types.md -- 2-1-int.md -- 2-2-str.md -- 2-3-f-string.md -- 2-4-bool.md -- 3-0-type-hints.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/python/2-collections/sections.yml b/public/docs/python/2-collections/sections.yml deleted file mode 100644 index 2742052..0000000 --- a/public/docs/python/2-collections/sections.yml +++ /dev/null @@ -1,13 +0,0 @@ -- -intro.md -- 1-0-list.md -- 2-0-tuple.md -- 3-0-dictionary.md -- 4-0-set.md -- 5-0-slicing.md -- 6-0-comprehensions.md -- 6-1-list-comprehension.md -- 6-2-dict-comprehension.md -- 6-3-set-comprehension.md -- 7-0-summary.md -- 7-1-practice1.md -- 7-2-practice2.md diff --git a/public/docs/python/3-control-functions/sections.yml b/public/docs/python/3-control-functions/sections.yml deleted file mode 100644 index cd3e88a..0000000 --- a/public/docs/python/3-control-functions/sections.yml +++ /dev/null @@ -1,15 +0,0 @@ -- -intro.md -- 1-0-if.md -- 2-0-for.md -- 2-1-range.md -- 2-2-enumerate.md -- 3-0-while.md -- 4-0-def.md -- 5-0-arguments.md -- 6-0-var-arg.md -- 6-1-positional-var-arg.md -- 6-2-keyword-var-arg.md -- 7-0-lambda.md -- 8-0-summary.md -- 8-1-practice1.md -- 8-2-practice2.md diff --git a/public/docs/python/4-modules/sections.yml b/public/docs/python/4-modules/sections.yml deleted file mode 100644 index 29b8a9d..0000000 --- a/public/docs/python/4-modules/sections.yml +++ /dev/null @@ -1,17 +0,0 @@ -- -intro.md -- 1-0-basic.md -- 1-1-import-math.md -- 1-2-import-as.md -- 1-3-from-import.md -- 1-4-custom-module.md -- 2-0-package.md -- 2-1-init-py.md -- 3-0-std-library.md -- 3-1-find-std-library.md -- 3-2-os.md -- 3-3-sys.md -- 3-4-datetime.md -- 3-5-json.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/python/5-oop/sections.yml b/public/docs/python/5-oop/sections.yml deleted file mode 100644 index 3c82352..0000000 --- a/public/docs/python/5-oop/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-class-instance.md -- 2-0-constructor.md -- 3-0-class-vars.md -- 4-0-method.md -- 4-1-class-type-annotation.md -- 5-0-inheritance.md -- 6-0-str-repr.md -- 8-0-summary.md -- 8-1-practice1.md -- 8-2-practice2.md diff --git a/public/docs/python/6-file-io/sections.yml b/public/docs/python/6-file-io/sections.yml deleted file mode 100644 index bc4d0d7..0000000 --- a/public/docs/python/6-file-io/sections.yml +++ /dev/null @@ -1,13 +0,0 @@ -- -intro.md -- 1-0-open.md -- 2-0-textfile.md -- 2-1-write.md -- 2-2-read.md -- 3-0-with.md -- 4-0-json-module.md -- 5-0-csv-module.md -- 5-1-csv-write.md -- 5-2-csv-read.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/python/7-exceptions/sections.yml b/public/docs/python/7-exceptions/sections.yml deleted file mode 100644 index 3572468..0000000 --- a/public/docs/python/7-exceptions/sections.yml +++ /dev/null @@ -1,10 +0,0 @@ -- -intro.md -- 1-0-try-except.md -- 2-0-multiple-error.md -- 2-1-multiple-except.md -- 2-2-tuple-except.md -- 3-0-raise.md -- 4-0-else-finally.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/python/8-generators-decorators/sections.yml b/public/docs/python/8-generators-decorators/sections.yml deleted file mode 100644 index e04994c..0000000 --- a/public/docs/python/8-generators-decorators/sections.yml +++ /dev/null @@ -1,9 +0,0 @@ -- -intro.md -- 1-0-iterator.md -- 2-0-generator-yield.md -- 3-0-generator-expr.md -- 4-0-decorator.md -- 4-1-at-decorator.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/ruby/0-intro/sections.yml b/public/docs/ruby/0-intro/sections.yml deleted file mode 100644 index 1bee6f8..0000000 --- a/public/docs/ruby/0-intro/sections.yml +++ /dev/null @@ -1,8 +0,0 @@ -- -intro.md -- 1-0-philosophy.md -- 2-0-comparison.md -- 3-0-rbenv.md -- 4-0-irb.md -- 5-0-helloworld.md -- 5-1-irb-helloworld.md -- 5-2-run.md diff --git a/public/docs/ruby/1-basics/sections.yml b/public/docs/ruby/1-basics/sections.yml deleted file mode 100644 index add69a1..0000000 --- a/public/docs/ruby/1-basics/sections.yml +++ /dev/null @@ -1,9 +0,0 @@ -- -intro.md -- 1-0-variable.md -- 2-0-types.md -- 3-0-nil-false.md -- 4-0-symbol.md -- 5-0-method-call.md -- 6-0-string-interpolation.md -- 7-0-summary.md -- 7-1-practice1.md diff --git a/public/docs/ruby/10-testing/sections.yml b/public/docs/ruby/10-testing/sections.yml deleted file mode 100644 index a3aa1d3..0000000 --- a/public/docs/ruby/10-testing/sections.yml +++ /dev/null @@ -1,19 +0,0 @@ -- -intro.md -- 1-0-minitest.md -- 2-0-test-basic.md -- 2-1-test-class.md -- 2-2-test-file.md -- 2-3-run.md -- 3-0-assertion.md -- 3-1-assert_equal.md -- 3-2-assert.md -- 3-3-refute.md -- 3-4-assert_nil.md -- 3-5-assert_raises.md -- 4-0-tdd.md -- 4-1-tdd-red.md -- 4-2-tdd-green.md -- 4-3-tdd-refactor.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/ruby/11-metaprogramming/sections.yml b/public/docs/ruby/11-metaprogramming/sections.yml deleted file mode 100644 index 1d19a3a..0000000 --- a/public/docs/ruby/11-metaprogramming/sections.yml +++ /dev/null @@ -1,9 +0,0 @@ -- -intro.md -- 1-0-dynamic.md -- 2-0-send.md -- 3-0-define-method.md -- 4-0-method-missing.md -- 5-0-rails-example.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/ruby/2-control-methods/sections.yml b/public/docs/ruby/2-control-methods/sections.yml deleted file mode 100644 index 78dc0d9..0000000 --- a/public/docs/ruby/2-control-methods/sections.yml +++ /dev/null @@ -1,17 +0,0 @@ -- -intro.md -- 1-0-conditional.md -- 1-1-if.md -- 1-2-unless.md -- 1-3-case.md -- 2-0-loop.md -- 2-1-while.md -- 2-2-until.md -- 3-0-def.md -- 4-1-default-arg.md -- 4-2-keyword-arg.md -- 4-3-splat-arg.md -- 5-0-exception.md -- 5-2-raise.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/ruby/3-everything-object/sections.yml b/public/docs/ruby/3-everything-object/sections.yml deleted file mode 100644 index 8229388..0000000 --- a/public/docs/ruby/3-everything-object/sections.yml +++ /dev/null @@ -1,10 +0,0 @@ -- -intro.md -- 1-0-literal.md -- 2-0-nil.md -- 3-0-message-passing.md -- 4-0-basic-method.md -- 4-1-string.md -- 4-2-integer.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/ruby/4-collections/sections.yml b/public/docs/ruby/4-collections/sections.yml deleted file mode 100644 index f24cca5..0000000 --- a/public/docs/ruby/4-collections/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-array.md -- 1-2-array-push-pop.md -- 1-3-array-method.md -- 2-0-hash.md -- 2-1-hash-rocket.md -- 2-2-hash-json-like.md -- 3-0-range.md -- 3-1-range-2.md -- 3-2-range-3.md -- 3-3-range-case.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/ruby/5-blocks-iterators/sections.yml b/public/docs/ruby/5-blocks-iterators/sections.yml deleted file mode 100644 index d80e68a..0000000 --- a/public/docs/ruby/5-blocks-iterators/sections.yml +++ /dev/null @@ -1,15 +0,0 @@ -- -intro.md -- 1-0-block.md -- 1-1-block-arg.md -- 1-2-block-return.md -- 2-0-iterator.md -- 2-1-each.md -- 2-2-map.md -- 2-3-select.md -- 2-4-find.md -- 3-0-enumerable.md -- 4-0-for.md -- 6-0-yield.md -- 7-0-summary.md -- 7-1-practice1.md -- 7-2-practice2.md diff --git a/public/docs/ruby/6-classes/sections.yml b/public/docs/ruby/6-classes/sections.yml deleted file mode 100644 index 0ba67f6..0000000 --- a/public/docs/ruby/6-classes/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-initialize.md -- 2-0-instance-var-method.md -- 3-0-accessor.md -- 3-1-accessor-manual.md -- 3-2-accessor-attr.md -- 4-0-class-var-method.md -- 5-0-inheritance.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/ruby/7-modules/sections.yml b/public/docs/ruby/7-modules/sections.yml deleted file mode 100644 index b7cdaa5..0000000 --- a/public/docs/ruby/7-modules/sections.yml +++ /dev/null @@ -1,9 +0,0 @@ -- -intro.md -- 1-0-basic.md -- 2-0-namespace.md -- 3-0-include.md -- 4-0-include-extend.md -- 5-0-access-control.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/ruby/8-proc-lambda/sections.yml b/public/docs/ruby/8-proc-lambda/sections.yml deleted file mode 100644 index 855b007..0000000 --- a/public/docs/ruby/8-proc-lambda/sections.yml +++ /dev/null @@ -1,12 +0,0 @@ -- -intro.md -- 1-0-proc.md -- 2-0-proc-new-lambda.md -- 2-1-lambda-return.md -- 2-2-args.md -- 3-0-amp-operator.md -- 3-1-block-as-proc.md -- 3-2-proc-as-block.md -- 4-0-closure.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/ruby/9-stdlib/sections.yml b/public/docs/ruby/9-stdlib/sections.yml deleted file mode 100644 index 57b9626..0000000 --- a/public/docs/ruby/9-stdlib/sections.yml +++ /dev/null @@ -1,12 +0,0 @@ -- -intro.md -- 1-0-filesystem.md -- 1-1-file-read-write.md -- 1-2-dir-pathname.md -- 2-0-time-date.md -- 3-0-json.md -- 4-0-regexp.md -- 4-1-match.md -- 4-2-scan-gsub.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/rust/0-intro/sections.yml b/public/docs/rust/0-intro/sections.yml deleted file mode 100644 index 6715921..0000000 --- a/public/docs/rust/0-intro/sections.yml +++ /dev/null @@ -1,15 +0,0 @@ -- -intro.md -- 1-0-features.md -- 1-1-memory-safety.md -- 1-2-zero-cost.md -- 1-3-concurrency.md -- 2-0-setup.md -- 2-1-rustup.md -- 3-0-hello-world.md -- 3-1-points.md -- 4-0-cargo.md -- 4-1-cargo-new.md -- 4-2-cargo-commands.md -- 5-0-fmt-lint.md -- 5-1-rustfmt.md -- 5-2-clippy.md diff --git a/public/docs/rust/1-basics/sections.yml b/public/docs/rust/1-basics/sections.yml deleted file mode 100644 index 8a5a4c8..0000000 --- a/public/docs/rust/1-basics/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-let-mut.md -- 1-1-immutable.md -- 1-2-mutable.md -- 2-0-shadowing.md -- 3-0-data-types.md -- 3-1-scalar.md -- 3-2-compound.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/rust/10-generics-traits/sections.yml b/public/docs/rust/10-generics-traits/sections.yml deleted file mode 100644 index 45fbe1f..0000000 --- a/public/docs/rust/10-generics-traits/sections.yml +++ /dev/null @@ -1,15 +0,0 @@ -- -intro.md -- 1-0-rust-approach.md -- 2-0-generics.md -- 2-1-generic-func.md -- 2-2-generic-struct.md -- 3-0-traits.md -- 3-1-trait-def.md -- 3-2-trait-impl.md -- 4-0-trait-bounds.md -- 4-1-basic-syntax.md -- 4-2-where-clause.md -- 5-0-std-traits.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/rust/11-lifetimes/sections.yml b/public/docs/rust/11-lifetimes/sections.yml deleted file mode 100644 index 36297a9..0000000 --- a/public/docs/rust/11-lifetimes/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-what-is-lifetime.md -- 1-1-dangling-ref.md -- 2-0-func-lifetime.md -- 2-1-lifetime-syntax.md -- 3-0-elision.md -- 4-0-struct-lifetime.md -- 5-0-static-lifetime.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/rust/2-functions-control/sections.yml b/public/docs/rust/2-functions-control/sections.yml deleted file mode 100644 index dad8952..0000000 --- a/public/docs/rust/2-functions-control/sections.yml +++ /dev/null @@ -1,13 +0,0 @@ -- -intro.md -- 1-0-functions-expr.md -- 1-1-params-return.md -- 1-2-stmt-expr.md -- 2-0-control-flow.md -- 2-1-if.md -- 2-2-loops.md -- 2-3-loop-return.md -- 2-4-while.md -- 2-5-for.md -- 3-0-summary.md -- 4-0-practice1.md -- 4-1-practice2.md diff --git a/public/docs/rust/3-ownership/sections.yml b/public/docs/rust/3-ownership/sections.yml deleted file mode 100644 index ffa857b..0000000 --- a/public/docs/rust/3-ownership/sections.yml +++ /dev/null @@ -1,15 +0,0 @@ -- -intro.md -- 1-0-stack-heap.md -- 1-1-stack.md -- 1-2-heap.md -- 2-0-ownership-rules.md -- 2-1-scope.md -- 3-0-move-copy.md -- 3-1-copy.md -- 3-2-move.md -- 3-3-clone.md -- 4-0-ownership-func.md -- 4-1-return-ownership.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/rust/4-borrowing-slices/sections.yml b/public/docs/rust/4-borrowing-slices/sections.yml deleted file mode 100644 index 0d04ca4..0000000 --- a/public/docs/rust/4-borrowing-slices/sections.yml +++ /dev/null @@ -1,16 +0,0 @@ -- -intro.md -- 1-0-ref-borrow.md -- 1-1-immutable-ref.md -- 1-2-mutable-ref.md -- 2-0-borrow-rules.md -- 2-1-single-mut-ref.md -- 2-2-no-mixed-refs.md -- 3-0-dangling-ptr.md -- 4-0-slice.md -- 4-1-str-slice.md -- 4-2-str-literal.md -- 4-3-str-param.md -- 5-0-other-slices.md -- 6-0-summary.md -- 7-0-practice1.md -- 7-1-practice2.md diff --git a/public/docs/rust/5-structs-methods/sections.yml b/public/docs/rust/5-structs-methods/sections.yml deleted file mode 100644 index 3e877f7..0000000 --- a/public/docs/rust/5-structs-methods/sections.yml +++ /dev/null @@ -1,15 +0,0 @@ -- -intro.md -- 1-0-struct-def.md -- 1-1-basic-def.md -- 1-2-field-shorthand.md -- 1-3-struct-update.md -- 2-0-tuple-unit-structs.md -- 2-1-tuple-structs.md -- 2-2-unit-structs.md -- 3-0-ownership-structs.md -- 4-0-impl.md -- 4-1-methods.md -- 4-2-assoc-funcs.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/rust/6-enums-pattern/sections.yml b/public/docs/rust/6-enums-pattern/sections.yml deleted file mode 100644 index d993d86..0000000 --- a/public/docs/rust/6-enums-pattern/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-enum-def.md -- 1-1-enum-vs-struct.md -- 1-2-enum-data.md -- 2-0-option.md -- 2-1-why-safe.md -- 3-0-match.md -- 3-1-exhaustive.md -- 3-2-option-match.md -- 3-3-placeholder.md -- 4-0-if-let.md -- 5-0-summary.md -- 5-1-practice1.md -- 5-2-practice2.md diff --git a/public/docs/rust/7-modules/sections.yml b/public/docs/rust/7-modules/sections.yml deleted file mode 100644 index 94a1dc9..0000000 --- a/public/docs/rust/7-modules/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-pkg-crate-module.md -- 1-1-mod-def.md -- 2-0-visibility.md -- 2-1-struct-visibility.md -- 3-0-use-paths.md -- 3-1-abs-rel-paths.md -- 4-0-file-split.md -- 5-0-external-crates.md -- 5-1-cargotoml.md -- 5-2-usage.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/rust/8-collections-strings/sections.yml b/public/docs/rust/8-collections-strings/sections.yml deleted file mode 100644 index 42fce4d..0000000 --- a/public/docs/rust/8-collections-strings/sections.yml +++ /dev/null @@ -1,15 +0,0 @@ -- -intro.md -- 1-0-vec.md -- 1-1-vec-create.md -- 1-2-vec-access.md -- 2-0-string-utf8.md -- 2-1-string-str.md -- 2-2-string-ops.md -- 2-3-no-indexing.md -- 3-0-hashmap.md -- 3-1-hashmap-basic.md -- 3-2-ownership.md -- 3-3-entry-api.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md diff --git a/public/docs/rust/9-error-handling/sections.yml b/public/docs/rust/9-error-handling/sections.yml deleted file mode 100644 index 2936f26..0000000 --- a/public/docs/rust/9-error-handling/sections.yml +++ /dev/null @@ -1,13 +0,0 @@ -- -intro.md -- 1-0-error-types.md -- 2-0-panic.md -- 3-0-result.md -- 3-1-result-basic.md -- 4-0-unwrap-expect.md -- 4-1-unwrap.md -- 4-2-expect.md -- 5-0-propagation.md -- 6-0-custom-error.md -- 7-0-summary.md -- 7-1-practice1.md -- 7-2-practice2.md diff --git a/public/docs/typescript/0-intro/sections.yml b/public/docs/typescript/0-intro/sections.yml deleted file mode 100644 index 77eb3ed..0000000 --- a/public/docs/typescript/0-intro/sections.yml +++ /dev/null @@ -1,10 +0,0 @@ -- -intro.md -- 1-0-about.md -- 2-0-why.md -- 3-0-setup.md -- 3-1-create-install.md -- 4-0-first-ts.md -- 4-1-code.md -- 4-2-compile-run.md -- 5-0-tsconfig.md -- 5-1-compile-config.md diff --git a/public/docs/typescript/1-types/sections.yml b/public/docs/typescript/1-types/sections.yml deleted file mode 100644 index fbbfea5..0000000 --- a/public/docs/typescript/1-types/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-type-annotations.md -- 2-0-primitive-types.md -- 3-0-type-inference.md -- 4-0-special-types.md -- 4-1-any.md -- 4-2-unknown.md -- 4-3-never.md -- 5-0-array-tuple.md -- 5-1-array.md -- 5-2-tuple.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/typescript/2-objects-interfaces/sections.yml b/public/docs/typescript/2-objects-interfaces/sections.yml deleted file mode 100644 index d9efd79..0000000 --- a/public/docs/typescript/2-objects-interfaces/sections.yml +++ /dev/null @@ -1,10 +0,0 @@ -- -intro.md -- 1-0-object-types.md -- 2-0-type-alias.md -- 3-0-interface.md -- 4-0-type-vs-interface.md -- 5-0-optional-props.md -- 6-0-readonly.md -- 7-0-summary.md -- 7-1-practice1.md -- 7-2-practice2.md diff --git a/public/docs/typescript/3-function-types/sections.yml b/public/docs/typescript/3-function-types/sections.yml deleted file mode 100644 index d356caf..0000000 --- a/public/docs/typescript/3-function-types/sections.yml +++ /dev/null @@ -1,14 +0,0 @@ -- -intro.md -- 1-0-params-return.md -- 2-0-optional-default.md -- 2-1-optional.md -- 2-2-default.md -- 3-0-arrow-this.md -- 3-1-arrow-type.md -- 3-2-this-type.md -- 4-0-overload.md -- 5-0-rest-params.md -- 6-0-type-alias.md -- 7-0-summary.md -- 7-1-practice1.md -- 7-2-practice2.md diff --git a/public/docs/typescript/4-combining-types/sections.yml b/public/docs/typescript/4-combining-types/sections.yml deleted file mode 100644 index 0a50be2..0000000 --- a/public/docs/typescript/4-combining-types/sections.yml +++ /dev/null @@ -1,13 +0,0 @@ -- -intro.md -- 1-0-union.md -- 2-0-literal.md -- 3-0-intersection.md -- 4-0-null-undefined.md -- 5-0-type-guards.md -- 5-1-typeof.md -- 5-2-in.md -- 5-3-instanceof.md -- 6-0-type-assertions.md -- 7-0-summary.md -- 7-1-practice1.md -- 7-2-practice2.md diff --git a/public/docs/typescript/5-generics/sections.yml b/public/docs/typescript/5-generics/sections.yml deleted file mode 100644 index 80c6333..0000000 --- a/public/docs/typescript/5-generics/sections.yml +++ /dev/null @@ -1,9 +0,0 @@ -- -intro.md -- 1-0-generics-intro.md -- 2-0-generics-func.md -- 3-0-generics-interface.md -- 4-0-generics-class.md -- 5-0-type-constraint.md -- 6-0-summary.md -- 6-1-practice1.md -- 6-2-practice2.md diff --git a/public/docs/typescript/6-classes/sections.yml b/public/docs/typescript/6-classes/sections.yml deleted file mode 100644 index 812f0dd..0000000 --- a/public/docs/typescript/6-classes/sections.yml +++ /dev/null @@ -1,11 +0,0 @@ -- -intro.md -- 1-0-js-class-review.md -- 2-0-ts-class.md -- 3-0-access-modifiers.md -- 3-1-param-props.md -- 4-0-readonly.md -- 5-0-implements.md -- 6-0-abstract.md -- 7-0-summary.md -- 7-1-practice1.md -- 7-2-practice2.md diff --git a/public/docs/typescript/7-async-utilities/sections.yml b/public/docs/typescript/7-async-utilities/sections.yml deleted file mode 100644 index 79af05f..0000000 --- a/public/docs/typescript/7-async-utilities/sections.yml +++ /dev/null @@ -1,16 +0,0 @@ -- -intro.md -- 1-0-async-types.md -- 1-1-basic-def.md -- 1-2-error-handling.md -- 2-0-utility-types.md -- 2-1-base-types.md -- 2-2-partial.md -- 2-3-readonly.md -- 2-4-pick.md -- 2-5-omit.md -- 3-0-advanced-types.md -- 3-1-mapped-types.md -- 3-2-conditional-types.md -- 4-0-summary.md -- 4-1-practice1.md -- 4-2-practice2.md From e50a9f95a3f5de28fa7e18bcbcee65ad6e31cbe8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:09:53 +0000 Subject: [PATCH 15/25] Replace pagesList.ts with reading from public/docs/{lang}/index.yml Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- app/[docs_id]/page.tsx | 15 +++-- app/[lang]/[pageId]/page.tsx | 14 ++-- app/layout.tsx | 8 ++- app/lib/getPagesList.ts | 64 ++++++++++++++++++ app/navbar.tsx | 12 ++-- app/page.tsx | 9 +-- app/pagesList.ts | 124 ----------------------------------- app/sidebar.tsx | 14 ++-- 8 files changed, 104 insertions(+), 156 deletions(-) create mode 100644 app/lib/getPagesList.ts delete mode 100644 app/pagesList.ts diff --git a/app/[docs_id]/page.tsx b/app/[docs_id]/page.tsx index 87470a0..14e3a42 100644 --- a/app/[docs_id]/page.tsx +++ b/app/[docs_id]/page.tsx @@ -7,7 +7,7 @@ import { splitMarkdown } from "./splitMarkdown"; import { PageContent } from "./pageContent"; import { ChatHistoryProvider } from "./chatHistory"; import { getChatFromCache, initContext } from "@/lib/chatHistory"; -import { getLanguageName, pagesList } from "@/pagesList"; +import { getPagesList } from "@/lib/getPagesList"; import { isCloudflare } from "@/lib/detectCloudflare"; async function getMarkdownContent(docs_id: string): Promise { @@ -47,10 +47,13 @@ export async function generateMetadata({ const description = splitMdContent[0].content; + const lang_id = docs_id.split("-")[0]; const chapter = docs_id.split("-")[1]; + const pagesList = await getPagesList(); + const langName = pagesList.find((l) => l.id === lang_id)?.name ?? lang_id; return { - title: `${getLanguageName(docs_id)}-${chapter}. ${title}`, + title: `${langName}-${chapter}. ${title}`, description, }; } @@ -61,11 +64,13 @@ export default async function Page({ params: Promise<{ docs_id: string }>; }) { const { docs_id } = await params; - + const lang_id = docs_id.split("-")[0]; + const page_num = parseInt(docs_id.split("-")[1]); + const pagesList = await getPagesList(); if ( !pagesList - .find((lang) => docs_id.startsWith(`${lang.id}-`)) - ?.pages.find((page) => docs_id.endsWith(`-${page.id}`)) + .find((lang) => lang.id === lang_id) + ?.pages.find((_, idx) => idx + 1 === page_num) ) { notFound(); } diff --git a/app/[lang]/[pageId]/page.tsx b/app/[lang]/[pageId]/page.tsx index 605e0c8..b3cd98c 100644 --- a/app/[lang]/[pageId]/page.tsx +++ b/app/[lang]/[pageId]/page.tsx @@ -8,7 +8,7 @@ import { MarkdownSection } from "../[docs_id]/splitMarkdown"; import { PageContent } from "../[docs_id]/pageContent"; import { ChatHistoryProvider } from "../[docs_id]/chatHistory"; import { getChatFromCache, initContext } from "@/lib/chatHistory"; -import { pagesList } from "@/pagesList"; +import { getPagesList } from "@/lib/getPagesList"; import { isCloudflare } from "@/lib/detectCloudflare"; async function readDocFile( @@ -111,14 +111,14 @@ export async function generateMetadata({ params: Promise<{ lang: string; pageId: string }>; }): Promise { const { lang, pageId } = await params; + const pagesList = await getPagesList(); const langEntry = pagesList.find((l) => l.id === lang); - const pageEntry = langEntry?.pages.find((p) => p.slug === pageId); + const pageIndex = langEntry?.pages.findIndex((p) => p.slug === pageId) ?? -1; + const pageEntry = pageIndex >= 0 ? langEntry?.pages[pageIndex] : undefined; if (!langEntry || !pageEntry) notFound(); - const pageIndex = langEntry!.pages.findIndex((p) => p.slug === pageId); - // pageIndex will be >= 0 since pageEntry was found via the same pages array return { - title: `${langEntry!.lang}-${pageIndex + 1}. ${pageEntry!.title}`, + title: `${langEntry!.name}-${pageIndex + 1}. ${pageEntry!.name}`, }; } @@ -128,13 +128,13 @@ export default async function Page({ params: Promise<{ lang: string; pageId: string }>; }) { const { lang, pageId } = await params; - + const pagesList = await getPagesList(); const langEntry = pagesList.find((l) => l.id === lang); const pageEntry = langEntry?.pages.find((p) => p.slug === pageId); if (!langEntry || !pageEntry) notFound(); const docsId = `${lang}/${pageId}`; - const sections = await getMarkdownSections(lang, pageId, pageEntry!.title); + const sections = await getMarkdownSections(lang, pageId, pageEntry!.name); // AI甚のドキュメント党文芋出し付きで結合 const documentContent = sections diff --git a/app/layout.tsx b/app/layout.tsx index bd0f049..54dff31 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -12,6 +12,7 @@ import { EmbedContextProvider } from "./terminal/embedContext"; import { AutoAnonymousLogin } from "./accountMenu"; import { SidebarMdProvider } from "./sidebar"; import { RuntimeProvider } from "./terminal/runtime"; +import { getPagesList } from "@/lib/getPagesList"; export const metadata: Metadata = { title: { @@ -20,9 +21,10 @@ export const metadata: Metadata = { }, }; -export default function RootLayout({ +export default async function RootLayout({ children, }: Readonly<{ children: ReactNode }>) { + const pagesList = await getPagesList(); return ( @@ -36,7 +38,7 @@ export default function RootLayout({ className="drawer-toggle" />
      - + {children} @@ -47,7 +49,7 @@ export default function RootLayout({ aria-label="close sidebar" className="drawer-overlay" /> - +
      diff --git a/app/lib/getPagesList.ts b/app/lib/getPagesList.ts new file mode 100644 index 0000000..d98a69e --- /dev/null +++ b/app/lib/getPagesList.ts @@ -0,0 +1,64 @@ +import { getCloudflareContext } from "@opennextjs/cloudflare"; +import { readFile } from "node:fs/promises"; +import { join } from "node:path"; +import yaml from "js-yaml"; +import { isCloudflare } from "./detectCloudflare"; + +export interface PageEntry { + slug: string; + name: string; + title: string; +} + +export interface LanguageEntry { + id: string; + name: string; + description: string; + pages: PageEntry[]; +} + +interface IndexYml { + name: string; + description: string; + pages: PageEntry[]; +} + +const LANGUAGE_IDS = [ + "python", + "ruby", + "javascript", + "typescript", + "cpp", + "rust", +] as const; + +async function readIndexYml(langId: string): Promise { + if (isCloudflare()) { + const cfAssets = getCloudflareContext().env.ASSETS; + const res = await cfAssets!.fetch( + `https://assets.local/docs/${langId}/index.yml` + ); + if (!res.ok) throw new Error(`Failed to fetch index.yml for ${langId}`); + return await res.text(); + } else { + return await readFile( + join(process.cwd(), "public", "docs", langId, "index.yml"), + "utf-8" + ); + } +} + +export async function getPagesList(): Promise { + return await Promise.all( + LANGUAGE_IDS.map(async (langId) => { + const raw = await readIndexYml(langId); + const data = yaml.load(raw) as IndexYml; + return { + id: langId, + name: data.name, + description: data.description, + pages: data.pages, + }; + }) + ); +} diff --git a/app/navbar.tsx b/app/navbar.tsx index ed3eac1..bbdd86f 100644 --- a/app/navbar.tsx +++ b/app/navbar.tsx @@ -4,9 +4,9 @@ import Link from "next/link"; import { AccountMenu } from "./accountMenu"; import { ThemeToggle } from "./[docs_id]/themeToggle"; import { usePathname } from "next/navigation"; -import { pagesList } from "./pagesList"; +import { LanguageEntry } from "@/lib/getPagesList"; -function PageTitle() { +function PageTitle({ pagesList }: { pagesList: LanguageEntry[] }) { const pathname = usePathname(); if(pathname === "/"){ @@ -19,15 +19,15 @@ function PageTitle() { const currentPage = pageIndex >= 0 ? currentGroup?.pages[pageIndex] : undefined; if(currentPage){ return <> - {currentGroup?.lang}-{pageIndex + 1}. - {currentPage.title} + {currentGroup?.name}-{pageIndex + 1}. + {currentPage.name} } console.warn(`navbar page name is not defined for pathname ${pathname}`); return null; } -export function Navbar() { +export function Navbar({ pagesList }: { pagesList: LanguageEntry[] }) { return ( <> @@ -67,7 +67,7 @@ export function Navbar() { my.code();
      - +
      diff --git a/app/page.tsx b/app/page.tsx index c9788d1..72472d1 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,6 +1,6 @@ import { Metadata } from "next"; import Link from "next/link"; -import { pagesList } from "./pagesList"; +import { getPagesList } from "@/lib/getPagesList"; import clsx from "clsx"; export const metadata: Metadata = { @@ -9,7 +9,8 @@ export const metadata: Metadata = { "環境構築䞍芁、その堎で実践。AIアシスタントずの察話履歎があなただけの教材ぞず進化する、新しいプログラミング孊習サむトです。", }; -export default function Home() { +export default async function Home() { + const pagesList = await getPagesList(); return (
      @@ -41,14 +42,14 @@ export default function Home() { return (
      -

      {group.lang}

      +

      {group.name}

      {group.description}

      はじめる
      diff --git a/app/pagesList.ts b/app/pagesList.ts deleted file mode 100644 index 918e058..0000000 --- a/app/pagesList.ts +++ /dev/null @@ -1,124 +0,0 @@ -// docs_id = `${group.id}-${page.id}` -export const pagesList = [ - { - id: "python", - lang: "Python", - // TODO: これをいい感じの文章に倉える↓ - description: "Pythonの基瀎から応甚たでを孊べるチュヌトリアル", - pages: [ - { id: 1, slug: "0-intro", title: "環境構築ず基本思想" }, - { id: 2, slug: "1-basics", title: "基本構文ずデヌタ型" }, - { id: 3, slug: "2-collections", title: "リスト、タプル、蟞曞、セット" }, - { id: 4, slug: "3-control-functions", title: "制埡構文ず関数" }, - { id: 5, slug: "4-modules", title: "モゞュヌルずパッケヌゞ" }, - { id: 6, slug: "5-oop", title: "オブゞェクト指向プログラミング" }, - { - id: 7, - slug: "6-file-io", - title: "ファむルの入出力ずコンテキストマネヌゞャ", - }, - { id: 8, slug: "7-exceptions", title: "䟋倖凊理" }, - { id: 9, slug: "8-generators-decorators", title: "ゞェネレヌタずデコレヌタ" }, - ], - }, - { - id: "ruby", - lang: "Ruby", - description: "hoge", - pages: [ - { id: 1, slug: "0-intro", title: "rubyの䞖界ぞようこそ" }, - { id: 2, slug: "1-basics", title: "基本構文ずデヌタ型" }, - { id: 3, slug: "2-control-methods", title: "制埡構造ずメ゜ッド定矩" }, - { id: 4, slug: "3-everything-object", title: "すべおがオブゞェクト" }, - { id: 5, slug: "4-collections", title: "コレクション (Array, Hash, Range)" }, - { id: 6, slug: "5-blocks-iterators", title: "ブロックずむテレヌタ" }, - { id: 7, slug: "6-classes", title: "クラスずオブゞェクト" }, - { id: 8, slug: "7-modules", title: "モゞュヌルずMix-in" }, - { id: 9, slug: "8-proc-lambda", title: "Proc, Lambda, クロヌゞャ" }, - { id: 10, slug: "9-stdlib", title: "暙準ラむブラリの掻甚" }, - { id: 11, slug: "10-testing", title: "テスト文化入門" }, - { id: 12, slug: "11-metaprogramming", title: "メタプログラミング入門" }, - ], - }, - { - id: "javascript", - lang: "JavaScript", - description: "hoge", - pages: [ - { id: 1, slug: "0-intro", title: "JavaScriptぞようこそ" }, - { id: 2, slug: "1-basics", title: "基本構文ずデヌタ型" }, - { id: 3, slug: "2-control", title: "制埡構文" }, - { id: 4, slug: "3-functions-closures", title: "関数ずクロヌゞャ" }, - { id: 5, slug: "4-this", title: "'this'の正䜓" }, - { id: 6, slug: "5-objects-prototype", title: "オブゞェクトずプロトタむプ" }, - { id: 7, slug: "6-classes", title: "クラス構文" }, - { id: 8, slug: "7-arrays", title: "配列ずむテレヌション" }, - { id: 9, slug: "8-promise", title: "非同期凊理①: Promise" }, - { id: 10, slug: "9-async-await", title: "非同期凊理②: Async/Await" }, - ], - }, - { - id: "typescript", - lang: "TypeScript", - description: "にゃヌ", - pages: [ - { id: 1, slug: "0-intro", title: "TypeScriptぞようこそ" }, - { id: 2, slug: "1-types", title: "基本的な型ず型掚論" }, - { id: 3, slug: "2-objects-interfaces", title: "オブゞェクト、むンタヌフェヌス、型゚むリアス" }, - { id: 4, slug: "3-function-types", title: "関数の型定矩" }, - { id: 5, slug: "4-combining-types", title: "型を組み合わせる" }, - { id: 6, slug: "5-generics", title: "ゞェネリクス" }, - { id: 7, slug: "6-classes", title: "クラスずアクセス修食子" }, - { id: 8, slug: "7-async-utilities", title: "非同期凊理ずナヌティリティ型" }, - ], - }, - { - id: "cpp", - lang: "C++", - description: "C++の基本から高床な機胜たでを孊べるチュヌトリアル", - pages: [ - { id: 1, slug: "0-intro", title: "C++の䞖界ぞようこそ" }, - { id: 2, slug: "1-types-control", title: "型システムず制埡構造" }, - { id: 3, slug: "2-data-containers", title: "デヌタ集合ずモダンな操䜜" }, - { id: 4, slug: "3-pointers", title: "ポむンタずメモリ管理" }, - { id: 5, slug: "4-functions", title: "関数ず参照枡し" }, - { id: 6, slug: "5-project-build", title: "プロゞェクトの分割ずビルド" }, - { id: 7, slug: "6-classes-basics", title: "クラスの基瀎" }, - { id: 8, slug: "7-classes-advanced", title: "クラスを䜿いこなす" }, - { id: 9, slug: "8-inheritance", title: "継承ずポリモヌフィズム" }, - { id: 10, slug: "9-templates", title: "テンプレヌト" }, - { id: 11, slug: "10-stl-containers", title: "STL ①:コンテナ" }, - { id: 12, slug: "11-stl-algorithms", title: "STL ②:アルゎリズムずラムダ匏" }, - { id: 13, slug: "12-raii-smart-ptrs", title: "RAIIずスマヌトポむンタ" }, - ], - }, - { - id: "rust", - lang: "Rust", - description: "a", - pages: [ - { id: 1, slug: "0-intro", title: "Rustの䞖界ぞようこそ" }, - { id: 2, slug: "1-basics", title: "基本構文ず「䞍倉性」" }, - { id: 3, slug: "2-functions-control", title: "関数ず制埡フロヌ" }, - { id: 4, slug: "3-ownership", title: "所有暩" }, - { id: 5, slug: "4-borrowing-slices", title: "借甚ずスラむス" }, - { id: 6, slug: "5-structs-methods", title: "構造䜓ずメ゜ッド構文" }, - { id: 7, slug: "6-enums-pattern", title: "列挙型ずパタヌンマッチ" }, - { id: 8, slug: "7-modules", title: "モゞュヌルシステムずパッケヌゞ管理" }, - { id: 9, slug: "8-collections-strings", title: "コレクションず文字列" }, - { id: 10, slug: "9-error-handling", title: "゚ラヌハンドリング" }, - { id: 11, slug: "10-generics-traits", title: "ゞェネリクスずトレむト" }, - { id: 12, slug: "11-lifetimes", title: "ラむフタむム" }, - ], - }, -] as const; - -// ${lang_id}-${page_id} から蚀語名を取埗 -export function getLanguageName(docs_id: string) { - const lang_id = docs_id.split("-")[0]; - const lang = pagesList.find((lang) => lang.id === lang_id)?.lang; - if (!lang) { - throw new Error(`Unknown language id: ${lang_id}`); - } - return lang; -} diff --git a/app/sidebar.tsx b/app/sidebar.tsx index 559cf5a..b1c904e 100644 --- a/app/sidebar.tsx +++ b/app/sidebar.tsx @@ -1,7 +1,7 @@ "use client"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import { pagesList } from "./pagesList"; +import { LanguageEntry } from "@/lib/getPagesList"; import { AccountMenu } from "./accountMenu"; import { ThemeToggle } from "./[docs_id]/themeToggle"; import { @@ -74,7 +74,7 @@ export function SidebarMdProvider({ children }: { children: ReactNode }) { ); } -export function Sidebar() { +export function Sidebar({ pagesList }: { pagesList: LanguageEntry[] }) { const pathname = usePathname(); const currentDocsId = pathname.replace(/^\//, ""); // ちょっず遅延がある const sidebarContext = useSidebarMdContext(); @@ -166,11 +166,11 @@ export function Sidebar() { className="w-4 h-4" lang={group.id as RuntimeLang} /> - {group.lang} + {group.name}
        - {group.pages.map((page) => ( -
      • + {group.pages.map((page, pageIndex) => ( +
      • - {page.id}. + {pageIndex + 1}. - {page.title} + {page.name} {`${group.id}/${page.slug}` === currentDocsId && sidebarMdContent.length > 0 && ( From dd34b4b0c8efbad587ae7cb9c1e39f7567f7ae0b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:13:15 +0000 Subject: [PATCH 16/25] Remove content from MarkdownSection, use rawContent directly in pageContent Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- app/[docs_id]/page.tsx | 9 ++++----- app/[docs_id]/pageContent.tsx | 5 ++--- app/[docs_id]/splitMarkdown.ts | 5 ----- app/[lang]/[pageId]/page.tsx | 14 +++----------- 4 files changed, 9 insertions(+), 24 deletions(-) diff --git a/app/[docs_id]/page.tsx b/app/[docs_id]/page.tsx index 14e3a42..b3fe129 100644 --- a/app/[docs_id]/page.tsx +++ b/app/[docs_id]/page.tsx @@ -45,10 +45,9 @@ export async function generateMetadata({ // 先頭の 第nç« : を陀いたものをタむトルずする const title = splitMdContent[0]?.title?.split(" ").slice(1).join(" "); - const description = splitMdContent[0].content; + const description = splitMdContent[0].rawContent; - const lang_id = docs_id.split("-")[0]; - const chapter = docs_id.split("-")[1]; + const [lang_id, chapter] = docs_id.split("-"); const pagesList = await getPagesList(); const langName = pagesList.find((l) => l.id === lang_id)?.name ?? lang_id; @@ -64,8 +63,8 @@ export default async function Page({ params: Promise<{ docs_id: string }>; }) { const { docs_id } = await params; - const lang_id = docs_id.split("-")[0]; - const page_num = parseInt(docs_id.split("-")[1]); + const [lang_id, page_num_str] = docs_id.split("-"); + const page_num = parseInt(page_num_str); const pagesList = await getPagesList(); if ( !pagesList diff --git a/app/[docs_id]/pageContent.tsx b/app/[docs_id]/pageContent.tsx index 6c41233..68c3dda 100644 --- a/app/[docs_id]/pageContent.tsx +++ b/app/[docs_id]/pageContent.tsx @@ -3,7 +3,7 @@ import { Fragment, useEffect, useRef, useState } from "react"; import { MarkdownSection } from "./splitMarkdown"; import { ChatForm } from "./chatForm"; -import { Heading, StyledMarkdown } from "./markdown"; +import { StyledMarkdown } from "./markdown"; import { useChatHistoryContext } from "./chatHistory"; import { useSidebarMdContext } from "../sidebar"; import clsx from "clsx"; @@ -99,8 +99,7 @@ export function PageContent(props: PageContentProps) { }} > {/* ドキュメントのコンテンツ */} - {section.title} - +
      {/* 右偎に衚瀺するチャット履歎欄 */} diff --git a/app/[docs_id]/splitMarkdown.ts b/app/[docs_id]/splitMarkdown.ts index 16f1c10..a6c1f76 100644 --- a/app/[docs_id]/splitMarkdown.ts +++ b/app/[docs_id]/splitMarkdown.ts @@ -6,7 +6,6 @@ export interface MarkdownSection { id: string; level: number; title: string; - content: string; rawContent: string; // 芋出しも含めたもずのmarkdownの内容 } /** @@ -34,10 +33,6 @@ export function splitMarkdown(content: string): MarkdownSection[] { sections.push({ id: "", title: splitContent[startLine - 1].replace(/#+\s*/, "").trim(), - content: splitContent - .slice(startLine - 1 + 1, endLine ? endLine - 1 : undefined) - .join("\n") - .trim(), level: headingNodes.at(i)!.depth, rawContent: splitContent .slice(startLine - 1, endLine ? endLine - 1 : undefined) diff --git a/app/[lang]/[pageId]/page.tsx b/app/[lang]/[pageId]/page.tsx index b3cd98c..bdd3c5f 100644 --- a/app/[lang]/[pageId]/page.tsx +++ b/app/[lang]/[pageId]/page.tsx @@ -86,18 +86,14 @@ async function getMarkdownSections( id: `${lang}-${pageId}-intro`, level: 1, title: pageTitle, - content: raw.trim(), rawContent: raw.trim(), }); } else { const { id, title, level, body } = parseFrontmatter(raw); - // bodyには芋出し行が含たれるので、contentずしおは芋出しを陀いた本文のみを枡す - const content = body.replace(/^#{1,6} [^\n]*\n?/, "").trim(); sections.push({ id, level, title, - content, rawContent: body.trim(), }); } @@ -114,7 +110,7 @@ export async function generateMetadata({ const pagesList = await getPagesList(); const langEntry = pagesList.find((l) => l.id === lang); const pageIndex = langEntry?.pages.findIndex((p) => p.slug === pageId) ?? -1; - const pageEntry = pageIndex >= 0 ? langEntry?.pages[pageIndex] : undefined; + const pageEntry = pageIndex >= 0 ? langEntry!.pages[pageIndex] : undefined; if (!langEntry || !pageEntry) notFound(); return { @@ -136,12 +132,8 @@ export default async function Page({ const docsId = `${lang}/${pageId}`; const sections = await getMarkdownSections(lang, pageId, pageEntry!.name); - // AI甚のドキュメント党文芋出し付きで結合 - const documentContent = sections - .map((s) => - s.level > 0 ? `${"#".repeat(s.level)} ${s.title}\n\n${s.content}` : s.content - ) - .join("\n\n"); + // AI甚のドキュメント党文rawContentを結合 + const documentContent = sections.map((s) => s.rawContent).join("\n\n"); const context = await initContext(); const initialChatHistories = await getChatFromCache(docsId, context); From 2270cd1c985fd5c35c5d380b98451e1689e2d7c3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:30:24 +0000 Subject: [PATCH 17/25] Generate languages.yml at build time, remove hardcoded LANGUAGE_IDS from getPagesList Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- .gitignore | 3 +++ app/lib/getPagesList.ts | 40 ++++++++++++++++++-------------- package-lock.json | 9 +++++++ package.json | 5 ++-- scripts/generateLanguagesList.ts | 21 +++++++++++++++++ 5 files changed, 58 insertions(+), 20 deletions(-) create mode 100644 scripts/generateLanguagesList.ts diff --git a/.gitignore b/.gitignore index 8f7af8a..11f8e33 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ # generated docs section file lists (regenerated by npm run generateSections) /public/docs/**/sections.yml +# generated languages list (regenerated by npm run generateLanguages) +/public/docs/languages.yml + # dependencies /node_modules /.pnp diff --git a/app/lib/getPagesList.ts b/app/lib/getPagesList.ts index d98a69e..54a25d3 100644 --- a/app/lib/getPagesList.ts +++ b/app/lib/getPagesList.ts @@ -1,5 +1,5 @@ import { getCloudflareContext } from "@opennextjs/cloudflare"; -import { readFile } from "node:fs/promises"; +import { readFile, readdir } from "node:fs/promises"; import { join } from "node:path"; import yaml from "js-yaml"; import { isCloudflare } from "./detectCloudflare"; @@ -23,35 +23,39 @@ interface IndexYml { pages: PageEntry[]; } -const LANGUAGE_IDS = [ - "python", - "ruby", - "javascript", - "typescript", - "cpp", - "rust", -] as const; - -async function readIndexYml(langId: string): Promise { +async function readPublicFile(path: string): Promise { if (isCloudflare()) { const cfAssets = getCloudflareContext().env.ASSETS; - const res = await cfAssets!.fetch( - `https://assets.local/docs/${langId}/index.yml` - ); - if (!res.ok) throw new Error(`Failed to fetch index.yml for ${langId}`); + const res = await cfAssets!.fetch(`https://assets.local/${path}`); + if (!res.ok) throw new Error(`Failed to fetch ${path}`); return await res.text(); } else { return await readFile( - join(process.cwd(), "public", "docs", langId, "index.yml"), + join(process.cwd(), "public", path), "utf-8" ); } } +async function getLanguageIds(): Promise { + if (isCloudflare()) { + const raw = await readPublicFile("docs/languages.yml"); + return yaml.load(raw) as string[]; + } else { + const docsDir = join(process.cwd(), "public", "docs"); + const entries = await readdir(docsDir, { withFileTypes: true }); + return entries + .filter((e) => e.isDirectory()) + .map((e) => e.name) + .sort(); + } +} + export async function getPagesList(): Promise { + const langIds = await getLanguageIds(); return await Promise.all( - LANGUAGE_IDS.map(async (langId) => { - const raw = await readIndexYml(langId); + langIds.map(async (langId) => { + const raw = await readPublicFile(`docs/${langId}/index.yml`); const data = yaml.load(raw) as IndexYml; return { id: langId, diff --git a/package-lock.json b/package-lock.json index a3097bb..f4252e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "comlink": "^4.4.2", "dotenv": "^17.2.3", "drizzle-orm": "^0.44.7", + "js-yaml": "^4.1.1", "mocha": "^11.7.4", "next": "^15.5.11", "object-inspect": "^1.13.4", @@ -47,6 +48,7 @@ "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", "@types/chai": "^5.2.3", + "@types/js-yaml": "^4.0.9", "@types/mocha": "^10.0.10", "@types/node": "^20", "@types/object-inspect": "^1.13.0", @@ -12548,6 +12550,13 @@ "@types/unist": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", diff --git a/package.json b/package.json index d90005c..29e0826 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "private": true, "type": "module", "scripts": { - "dev": "npm run cf-typegen && npm run generateSections && npm run copyAllDTSFiles && npm run removeHinting && next dev", - "build": "npm run cf-typegen && npm run generateSections && npm run copyAllDTSFiles && npm run removeHinting && next build", + "dev": "npm run cf-typegen && npm run generateLanguages && npm run generateSections && npm run copyAllDTSFiles && npm run removeHinting && next dev", + "build": "npm run cf-typegen && npm run generateLanguages && npm run generateSections && npm run copyAllDTSFiles && npm run removeHinting && next build", "start": "next start", "lint": "npm run cf-typegen && next lint", "tsc": "npm run cf-typegen && tsc", "format": "prettier --write app/", + "generateLanguages": "tsx ./scripts/generateLanguagesList.ts", "generateSections": "tsx ./scripts/generateSectionsList.ts", "copyAllDTSFiles": "tsx ./scripts/copyAllDTSFiles.ts", "removeHinting": "tsx ./scripts/removeHinting.ts", diff --git a/scripts/generateLanguagesList.ts b/scripts/generateLanguagesList.ts new file mode 100644 index 0000000..7359ef7 --- /dev/null +++ b/scripts/generateLanguagesList.ts @@ -0,0 +1,21 @@ +// Generates public/docs/languages.yml listing all language directories. + +import { readdir, writeFile, stat } from "node:fs/promises"; +import { join } from "node:path"; +import yaml from "js-yaml"; + +const docsDir = join(process.cwd(), "public", "docs"); + +const entries = await readdir(docsDir); +const langIds: string[] = []; +for (const entry of entries) { + const entryPath = join(docsDir, entry); + if ((await stat(entryPath)).isDirectory()) { + langIds.push(entry); + } +} +langIds.sort(); + +const yamlContent = yaml.dump(langIds); +await writeFile(join(docsDir, "languages.yml"), yamlContent, "utf-8"); +console.log(`Generated languages.yml (${langIds.length} languages: ${langIds.join(", ")})`); From 4dc38c31c29b65379d6bc857b55ff6c7c89384cb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:31:02 +0000 Subject: [PATCH 18/25] Remove sectionId from DynamicMarkdownSection, use section.id directly Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- app/[docs_id]/pageContent.tsx | 9 +++------ app/actions/chatActions.ts | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/[docs_id]/pageContent.tsx b/app/[docs_id]/pageContent.tsx index 68c3dda..d7cd741 100644 --- a/app/[docs_id]/pageContent.tsx +++ b/app/[docs_id]/pageContent.tsx @@ -11,7 +11,6 @@ import clsx from "clsx"; // MarkdownSectionに远加で、ナヌザヌが今そのセクションを読んでいるかどうか、などの動的な情報を持たせる export type DynamicMarkdownSection = MarkdownSection & { inView: boolean; - sectionId: string; }; interface PageContentProps { @@ -26,19 +25,17 @@ export function PageContent(props: PageContentProps) { const [dynamicMdContent, setDynamicMdContent] = useState< DynamicMarkdownSection[] >( - props.splitMdContent.map((section, i) => ({ + props.splitMdContent.map((section) => ({ ...section, inView: false, - sectionId: section.id || `${props.docs_id}-${i}`, })) ); useEffect(() => { // props.splitMdContentが倉わったずきにロヌカルstateずcontextの䞡方を曎新 - const newContent = props.splitMdContent.map((section, i) => ({ + const newContent = props.splitMdContent.map((section) => ({ ...section, inView: false, - sectionId: section.id || `${props.docs_id}-${i}`, })); setDynamicMdContent(newContent); setSidebarMdContent(props.docs_id, newContent); @@ -104,7 +101,7 @@ export function PageContent(props: PageContentProps) {
      {/* 右偎に衚瀺するチャット履歎欄 */} {chatHistories - .filter((c) => c.sectionId === section.sectionId) + .filter((c) => c.sectionId === section.id) .map(({ chatId, messages }) => (
      { } // TODO: どのセクションぞの回答にするかをAIに決めさせる const targetSectionId = - sectionContent.find((s) => s.inView)?.sectionId || ""; + sectionContent.find((s) => s.inView)?.id || ""; const newChat = await addChat(params.docsId, targetSectionId, [ { role: "user", content: userQuestion }, { role: "ai", content: text }, From cdac6cb666474f2e50cc4dafa13c4f73121bfe4f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:31:40 +0000 Subject: [PATCH 19/25] Use section id instead of array index for element id and sidebar link href Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- app/[docs_id]/pageContent.tsx | 4 ++-- app/sidebar.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/[docs_id]/pageContent.tsx b/app/[docs_id]/pageContent.tsx index d7cd741..e3219de 100644 --- a/app/[docs_id]/pageContent.tsx +++ b/app/[docs_id]/pageContent.tsx @@ -87,10 +87,10 @@ export function PageContent(props: PageContentProps) { }} > {dynamicMdContent.map((section, index) => ( - +
      { sectionRefs.current[index] = el; }} diff --git a/app/sidebar.tsx b/app/sidebar.tsx index b1c904e..7276920 100644 --- a/app/sidebar.tsx +++ b/app/sidebar.tsx @@ -195,11 +195,11 @@ export function Sidebar({ pagesList }: { pagesList: LanguageEntry[] }) { idx + 1 === currentSectionIndex; return (
    • Date: Tue, 24 Feb 2026 08:34:51 +0000 Subject: [PATCH 20/25] Fix build: correct import paths in app/[lang]/[pageId]/page.tsx Co-authored-by: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> --- app/[lang]/[pageId]/page.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/[lang]/[pageId]/page.tsx b/app/[lang]/[pageId]/page.tsx index bdd3c5f..0b46d51 100644 --- a/app/[lang]/[pageId]/page.tsx +++ b/app/[lang]/[pageId]/page.tsx @@ -4,9 +4,9 @@ import { getCloudflareContext } from "@opennextjs/cloudflare"; import { readFile } from "node:fs/promises"; import { join } from "node:path"; import yaml from "js-yaml"; -import { MarkdownSection } from "../[docs_id]/splitMarkdown"; -import { PageContent } from "../[docs_id]/pageContent"; -import { ChatHistoryProvider } from "../[docs_id]/chatHistory"; +import { MarkdownSection } from "../../[docs_id]/splitMarkdown"; +import { PageContent } from "../../[docs_id]/pageContent"; +import { ChatHistoryProvider } from "../../[docs_id]/chatHistory"; import { getChatFromCache, initContext } from "@/lib/chatHistory"; import { getPagesList } from "@/lib/getPagesList"; import { isCloudflare } from "@/lib/detectCloudflare"; From c3b0b341665832108216d4ce3b913fc0f9911ec3 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Tue, 24 Feb 2026 17:55:03 +0900 Subject: [PATCH 21/25] =?UTF-8?q?=E5=8F=A4=E3=81=84md=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/docs/1.md | 3 - public/docs/cpp-1.md | 129 --------- public/docs/cpp-10.md | 224 ---------------- public/docs/cpp-11.md | 252 ------------------ public/docs/cpp-12.md | 301 --------------------- public/docs/cpp-13.md | 396 --------------------------- public/docs/cpp-2.md | 253 ------------------ public/docs/cpp-3.md | 267 ------------------- public/docs/cpp-4.md | 305 --------------------- public/docs/cpp-5.md | 349 ------------------------ public/docs/cpp-6.md | 293 -------------------- public/docs/cpp-7.md | 340 ----------------------- public/docs/cpp-8.md | 503 ----------------------------------- public/docs/cpp-9.md | 281 ------------------- public/docs/javascript-1.md | 108 -------- public/docs/javascript-10.md | 247 ----------------- public/docs/javascript-2.md | 250 ----------------- public/docs/javascript-3.md | 264 ------------------ public/docs/javascript-4.md | 245 ----------------- public/docs/javascript-5.md | 229 ---------------- public/docs/javascript-6.md | 250 ----------------- public/docs/javascript-7.md | 235 ---------------- public/docs/javascript-8.md | 251 ----------------- public/docs/javascript-9.md | 216 --------------- public/docs/python-1.md | 230 ---------------- public/docs/python-2.md | 169 ------------ public/docs/python-3.md | 299 --------------------- public/docs/python-4.md | 284 -------------------- public/docs/python-5.md | 333 ----------------------- public/docs/python-6.md | 312 ---------------------- public/docs/python-7.md | 277 ------------------- public/docs/python-8.md | 219 --------------- public/docs/python-9.md | 231 ---------------- public/docs/ruby-1.md | 147 ---------- public/docs/ruby-10.md | 292 -------------------- public/docs/ruby-11.md | 358 ------------------------- public/docs/ruby-12.md | 212 --------------- public/docs/ruby-2.md | 212 --------------- public/docs/ruby-3.md | 354 ------------------------ public/docs/ruby-4.md | 181 ------------- public/docs/ruby-5.md | 206 -------------- public/docs/ruby-6.md | 307 --------------------- public/docs/ruby-7.md | 381 -------------------------- public/docs/ruby-8.md | 306 --------------------- public/docs/ruby-9.md | 311 ---------------------- public/docs/rust-1.md | 148 ----------- public/docs/rust-10.md | 337 ----------------------- public/docs/rust-11.md | 327 ----------------------- public/docs/rust-12.md | 252 ------------------ public/docs/rust-2.md | 209 --------------- public/docs/rust-3.md | 219 --------------- public/docs/rust-4.md | 242 ----------------- public/docs/rust-5.md | 288 -------------------- public/docs/rust-6.md | 288 -------------------- public/docs/rust-7.md | 326 ----------------------- public/docs/rust-8.md | 312 ---------------------- public/docs/rust-9.md | 323 ---------------------- public/docs/typescript-1.md | 136 ---------- public/docs/typescript-2.md | 231 ---------------- public/docs/typescript-3.md | 221 --------------- public/docs/typescript-4.md | 279 ------------------- public/docs/typescript-5.md | 299 --------------------- public/docs/typescript-6.md | 272 ------------------- public/docs/typescript-7.md | 306 --------------------- public/docs/typescript-8.md | 285 -------------------- sluginput.js | 35 --- 66 files changed, 17147 deletions(-) delete mode 100644 public/docs/1.md delete mode 100644 public/docs/cpp-1.md delete mode 100644 public/docs/cpp-10.md delete mode 100644 public/docs/cpp-11.md delete mode 100644 public/docs/cpp-12.md delete mode 100644 public/docs/cpp-13.md delete mode 100644 public/docs/cpp-2.md delete mode 100644 public/docs/cpp-3.md delete mode 100644 public/docs/cpp-4.md delete mode 100644 public/docs/cpp-5.md delete mode 100644 public/docs/cpp-6.md delete mode 100644 public/docs/cpp-7.md delete mode 100644 public/docs/cpp-8.md delete mode 100644 public/docs/cpp-9.md delete mode 100644 public/docs/javascript-1.md delete mode 100644 public/docs/javascript-10.md delete mode 100644 public/docs/javascript-2.md delete mode 100644 public/docs/javascript-3.md delete mode 100644 public/docs/javascript-4.md delete mode 100644 public/docs/javascript-5.md delete mode 100644 public/docs/javascript-6.md delete mode 100644 public/docs/javascript-7.md delete mode 100644 public/docs/javascript-8.md delete mode 100644 public/docs/javascript-9.md delete mode 100644 public/docs/python-1.md delete mode 100644 public/docs/python-2.md delete mode 100644 public/docs/python-3.md delete mode 100644 public/docs/python-4.md delete mode 100644 public/docs/python-5.md delete mode 100644 public/docs/python-6.md delete mode 100644 public/docs/python-7.md delete mode 100644 public/docs/python-8.md delete mode 100644 public/docs/python-9.md delete mode 100644 public/docs/ruby-1.md delete mode 100644 public/docs/ruby-10.md delete mode 100644 public/docs/ruby-11.md delete mode 100644 public/docs/ruby-12.md delete mode 100644 public/docs/ruby-2.md delete mode 100644 public/docs/ruby-3.md delete mode 100644 public/docs/ruby-4.md delete mode 100644 public/docs/ruby-5.md delete mode 100644 public/docs/ruby-6.md delete mode 100644 public/docs/ruby-7.md delete mode 100644 public/docs/ruby-8.md delete mode 100644 public/docs/ruby-9.md delete mode 100644 public/docs/rust-1.md delete mode 100644 public/docs/rust-10.md delete mode 100644 public/docs/rust-11.md delete mode 100644 public/docs/rust-12.md delete mode 100644 public/docs/rust-2.md delete mode 100644 public/docs/rust-3.md delete mode 100644 public/docs/rust-4.md delete mode 100644 public/docs/rust-5.md delete mode 100644 public/docs/rust-6.md delete mode 100644 public/docs/rust-7.md delete mode 100644 public/docs/rust-8.md delete mode 100644 public/docs/rust-9.md delete mode 100644 public/docs/typescript-1.md delete mode 100644 public/docs/typescript-2.md delete mode 100644 public/docs/typescript-3.md delete mode 100644 public/docs/typescript-4.md delete mode 100644 public/docs/typescript-5.md delete mode 100644 public/docs/typescript-6.md delete mode 100644 public/docs/typescript-7.md delete mode 100644 public/docs/typescript-8.md delete mode 100644 sluginput.js diff --git a/public/docs/1.md b/public/docs/1.md deleted file mode 100644 index 3cd2797..0000000 --- a/public/docs/1.md +++ /dev/null @@ -1,3 +0,0 @@ -## sample markdown file - -hello, world! diff --git a/public/docs/cpp-1.md b/public/docs/cpp-1.md deleted file mode 100644 index 4bc6e9a..0000000 --- a/public/docs/cpp-1.md +++ /dev/null @@ -1,129 +0,0 @@ -# 第1ç« : C++の䞖界ぞようこそ - -C++プログラミングの党䜓像を掎む章ぞようこそ 🎉 この章では、あなたがこれたでに培っおきたプログラミングの知識を土台に、C++ならではの特城や文化に觊れおいきたす。他の蚀語ずの違いを意識しながら、たずは「**゜ヌスコヌドを曞き、コンパむルしお実行する**」ずいうC++の基本的な開発フロヌを䜓隓したしょう。 - -## C++ずは - -C++は、C蚀語を拡匵しお䜜られた、非垞にパワフルで汎甚性の高いプログラミング蚀語です。その歎史は叀く、1983幎にBjarne Stroustrupによっお開発が始たりたした。 - -### 特城 - -他の蚀語ず比范したC++の特城は以䞋の通りです。 - - * **パフォヌマンス 🚀:** C++は、OSやハヌドりェアに近い䜎レベルな操䜜が可胜で、実行速床が非垞に高速です。このため、パフォヌマンスが最重芁芖される堎面で絶倧な信頌を埗おいたす。 - * **静的型付け:** 倉数の型はコンパむル時に決定されたす。これにより、実行前に倚くの゚ラヌを発芋でき、倧芏暡な開発でもコヌドの安党性を保ちやすくなりたす。 - * **マルチパラダむム:** 手続き型プログラミング、オブゞェクト指向プログラミング、ゞェネリックプログラミングなど、様々なプログラミングスタむルをサポヌトしおいたす。これにより、問題の性質に合わせお最適なアプロヌチを遞択できたす。 - * **C蚀語ずの互換性:** C蚀語のコヌドの倚くは、ほずんどそのたたC++のコヌドずしおコンパむルできたす。C蚀語で曞かれた膚倧な゜フトりェア資産を掻甚できるのは倧きな利点です。 - -### C++が䜿われる分野 - -その高いパフォヌマンスず柔軟性から、C++は以䞋のような幅広い分野の第䞀線で掻躍しおいたす。 - - * **ゲヌム開発:** Unreal EngineやUnity䞀郚など、倚くの有名ゲヌム゚ンゞンがC++で開発されおいたす。キャラクタヌの物理挔算やリアルタむムグラフィックス描画など、速床が求められる凊理に䞍可欠です。 - * **OS開発:** Windows, macOS, Linuxずいった䞻芁なオペレヌティングシステムのカヌネルやシステムコンポヌネントの倚くがC++で蚘述されおいたす。 - * **金融システム:** 1ミリ秒を争う高頻床取匕HFTシステムなど、超䜎遅延が求められる金融アプリケヌションで䜿甚されおいたす。 - * **組み蟌みシステム・IoT:** 自動車の゚ンゞン制埡ナニットECUや家電、産業甚ロボットなど、リ゜ヌスが限られた環境でも高速に動䜜する必芁がありたす。 - -## 開発環境のセットアップ - -C++プログラムを実行するには、**コンパむラ**が必芁です。コンパむラは、人間が曞いたC++の゜ヌスコヌドを、コンピュヌタが理解できる機械語に翻蚳するツヌルです。 - -このりェブサむト䞊ではブラりザ䞊でコヌドを線集し実行できる環境を提䟛しおおり、特別なセットアップは䞍芁です。しかし、ロヌカル環境でC++を孊びたい堎合は、以䞋のようなコンパむラずIDE統合開発環境をむンストヌルするこずをお勧めしたす。 - -### コンパむラずIDE - -* **コンパむラ:** - * **GCC (GNU Compiler Collection):** Linuxで暙準的に䜿われるコンパむラ。Windows (MinGW/MSYS2) やmacOSでも利甚可胜です。 - * **Clang:** AppleのXcodeで暙準的に䜿われおいるコンパむラ。゚ラヌメッセヌゞが分かりやすいず評刀です。 - * **MSVC (Microsoft Visual C++):** MicrosoftのVisual Studioに付属するコンパむラ。Windows開発の暙準です。 -* **IDE (統合開発環境) / ゚ディタ:** - * **Visual Studio (Windows):** コンパむラ、゚ディタ、デバッガなど、C++開発に必芁な党おが詰たった匷力なIDEです。初心者には特におすすめです。 - * **Visual Studio Code (Windows/macOS/Linux):** 軜量な゚ディタですが、拡匵機胜を入れるこずで匷力なC++開発環境を構築できたす。 - -### おすすめのセットアップ - - * **Windows:** **Visual Studio Community** をむンストヌルするのが最も簡単です。むンストヌラヌで「C++によるデスクトップ開発」ワヌクロヌドを遞択すれば、必芁なものがすべお揃いたす。 - * **macOS:** タヌミナルで `xcode-select --install` を実行し、**Xcode Command Line Tools** をむンストヌルしたす。これにはClangコンパむラが含たれたす。゚ディタは **Visual Studio Code** がおすすめです。 - * **Linux (Ubuntu/Debianç³»):** タヌミナルで `sudo apt update && sudo apt install build-essential g++` を実行しおGCCコンパむラをむンストヌルしたす。゚ディタは **Visual Studio Code** がおすすめです。 - - -## 最初のプログラム - -環境が敎ったら、さっそく定番の "Hello, World\!" プログラムを䜜成し、C++開発の流れを掎みたしょう。 - -`main.cpp` ずいう名前でファむルを䜜成し、以䞋のコヌドを蚘述しおください。 - -```cpp:main.cpp -// 画面に "Hello, World!" ず衚瀺するプログラム - -#include - -int main() { - std::cout << "Hello, World!" << std::endl; - return 0; -} -``` - -### コンパむルず実行 - -このコヌドを実行するには、たず**コンパむル**しお実行可胜ファむルを生成する必芁がありたす。タヌミナルWindowsの堎合はコマンドプロンプトやPowerShellで以䞋のコマンドを実行したす。 - -```bash -# g++ (GCC) たたは clang++ (Clang) を䜿っおコンパむル -# -o main は出力ファむル名を main にするずいう意味 -g++ main.cpp -o main - -# 生成された実行可胜ファむルを実行 -./main -``` - -```powershell -# Visual C++ (MSVC) を䜿う堎合 -cl main.cpp /Fe:main.exe - -# 生成された実行可胜ファむルを実行 -main.exe -``` - -このりェブサむト䞊の実行環境で動かす堎合は、以䞋の実行ボタンをクリックしおください。 -実行するず、タヌミナルに以䞋のように衚瀺されるはずです。 - -```cpp-exec:main.cpp -Hello, World! -``` - -PythonやJavaScriptのようなむンタプリタ蚀語ずは異なり、C++では「コンパむル」ずいう䞀手間が必芁です。このステップにより、実行前にコヌド党䜓がチェックされ、高速なネむティブコヌドが生成されたす。 - -## C++の基本構造 - -先ほどの "Hello, World\!" プログラムには、C++の基本的な芁玠が詰たっおいたす。䞀぀ず぀芋おいきたしょう。 - -### `#include ` - ヘッダファむルのむンクルヌド - -`#include` は、他のファむルに曞かれた機胜を利甚するための**プリプロセッサ呜什**です。ここでは、コン゜ヌルぞの入出力機胜を提䟛する `iostream` ずいう暙準ラむブラリのヘッダファむルを読み蟌んでいたす。これにより、`std::cout` などが䜿えるようになりたす。 - - * `< >` で囲む: 暙準ラむブラリのヘッダファむルをむンクルヌドする堎合 - * `" "` で囲む: 自分で䜜成したヘッダファむルをむンクルヌドする堎合 (埌の章で孊びたす) - -### `int main()` - main関数 - -`main`関数は、C++プログラムの゚ントリヌポむント**実行開始点**です。OSはプログラムを実行するずき、たずこの`main`関数を呌び出したす。 - - * `int`: `main`関数が敎数 (integer) の倀を返すこずを瀺したす。この戻り倀はプログラムの終了ステヌタスずしおOSに枡され、`0` は**正垞終了**を意味するのが慣䟋です。 - * `()`: 関数が匕数を取らないこずを瀺しおいたす。匕数を取るこずも可胜です - -### `std::cout` ず `std::endl` - 名前空間 (namespace) - - * `std::cout`: "character output stream" の略で、コン゜ヌルぞの暙準出力を担圓したす。 - * `<<`: **ストリヌム挿入挔算子**ず呌ばれ、右偎のデヌタを巊偎のストリヌムここでは `std::cout`に流し蟌むむメヌゞです。 - * `std::endl`: "end line" の略で、改行を出力し、出力バッファをフラッシュ匷制的に出力したす。 - * `std::`: `cout` や `endl` が `std` ずいう**名前空間 (namespace)** に属しおいるこずを瀺したす。名前空間は、倧芏暡なプログラムで関数や倉数の名前が衝突するのを防ぐための仕組みです。`std` はC++の暙準ラむブラリが定矩されおいる名前空間です。 - -## この章のたずめ - - * C++は、**パフォヌマンス**ず**倚機胜性**を䞡立した匷力なプログラミング蚀語です。 - * C++の開発フロヌは、「**゜ヌスコヌド䜜成 → コンパむル → 実行**」が基本です。 - * すべおのC++プログラムは `main` 関数から実行が始たりたす。 - * `#include` で倖郚ラむブラリの機胜を読み蟌み、`namespace` で名前の衝突を避けたす。 - -これであなたもC++プログラマの仲間入りです次の章では、C++の根幹をなす型システムずメモリの仕組みに぀いお孊んでいきたしょう。 diff --git a/public/docs/cpp-10.md b/public/docs/cpp-10.md deleted file mode 100644 index 8e4fa58..0000000 --- a/public/docs/cpp-10.md +++ /dev/null @@ -1,224 +0,0 @@ -# 第10ç« : テンプレヌトによる汎甚プログラミング - -これたでの章では、`int`や`double`、あるいは自䜜の`Car`クラスのように、特定の型に察しお凊理を行う関数やクラスを䜜成しおきたした。しかし、プログラムが耇雑になるに぀れお、「型は違うけれど、行いたい凊理は党く同じ」ずいう状況が頻繁に発生したす。䟋えば、2぀の倀の倧きい方を返す`max`ずいう関数を考えおみたしょう。 - -```cpp -int max_int(int a, int b) { - return (a > b) ? a : b; -} - -double max_double(double a, double b) { - return (a > b) ? a : b; -} -``` - -このように、型ごずに同じロゞックの関数をいく぀も甚意するのは非効率的ですし、バグの枩床にもなりたす。 - -この問題を解決するのが**テンプレヌト**です。テンプレヌトを䜿うず、具䜓的な型を "仮匕数" のように扱い、様々な型に察応できる関数やクラスの「蚭蚈図」を䜜るこずができたす。このような、型に䟝存しないプログラミングスタむルを**ゞェネリックプログラミング汎甚プログラミング**ず呌びたす。 - -## 関数テンプレヌト: intでもdoubleでもstringでも動く関数を䜜る - -関数テンプレヌトを䜿うず、先ほどの`max`関数の問題を゚レガントに解決できたす。 - -```cpp:function_template_intro.cpp -#include -#include - -// Tずいう名前で型を仮匕数ずしお受け取るテンプレヌトを宣蚀 -template -T max_value(T a, T b) { - return (a > b) ? a : b; -} - -int main() { - // int型でmax_valueを呌び出す - std::cout << "max(10, 20) = " << max_value(10, 20) << std::endl; - - // double型でmax_valueを呌び出す - std::cout << "max(3.14, 1.41) = " << max_value(3.14, 1.41) << std::endl; - - // std::string型でも動䜜する - std::string s1 = "world"; - std::string s2 = "hello"; - std::cout << "max(\"world\", \"hello\") = " << max_value(s1, s2) << std::endl; - - return 0; -} -``` - -```cpp-exec:function_template_intro.cpp -max(10, 20) = 20 -max(3.14, 1.41) = 3.14 -max("world", "hello") = world -``` - -### テンプレヌトの仕組み - -`template `ずいう郚分が、この関数がテンプレヌトであるこずを瀺しおいたす。 - - * **`template <...>`**: テンプレヌトの宣蚀を開始したす。 - * **`typename T`**: `T`ずいう名前の「型匕数」を定矩しおいたす。`typename`の代わりに`class`ず曞くこずもできたすが、意味は同じです。`T`は、このテンプレヌトが実際に䜿われるずきに具䜓的な型`int`や`double`などに眮き換えられたす。 - -`main`関数で`max_value(10, 20)`のように呌び出すず、コンパむラは匕数の型が`int`であるこずから、`T`を`int`だず自動的に刀断したすこれを**テンプレヌト匕数掚論**ず呌びたす。そしお、内郚的に以䞋のような`int`版の関数を生成しおくれるのです。 - -```cpp -// コンパむラが内郚的に生成するコヌドのむメヌゞ -int max_value(int a, int b) { - return (a > b) ? a : b; -} -``` - -同様に、`double`や`std::string`で呌び出されれば、それぞれの型に察応したバヌゞョンの関数が自動的に生成されたす。これにより、私たちは䞀぀の「蚭蚈図」を曞くだけで、様々な型に察応できるのです。 - -## クラステンプレヌト: 様々な型のデヌタを栌玍できるクラスを䜜る - -テンプレヌトの力は、クラスにも適甚できたす。これにより、様々な型のデヌタを栌玍できる汎甚的なクラスコンテナなどを䜜成できたす。䟋えば、「2぀の倀をペアで保持する」クラスを考えおみたしょう。 - -```cpp:class_template_intro.cpp -#include -#include - -// 2぀の型 T1, T2 を匕数に取るクラステンプレヌト -template -class Pair { -public: - T1 first; - T2 second; - - // コンストラクタ - Pair(T1 f, T2 s) : first(f), second(s) {} - - void print() { - std::cout << "(" << first << ", " << second << ")" << std::endl; - } -}; - -int main() { - // T1=int, T2=std::string ずしおPairクラスのオブゞェクトを生成 - Pair p1(1, "apple"); - p1.print(); - - // T1=std::string, T2=double ずしおPairクラスのオブゞェクトを生成 - Pair p2("pi", 3.14159); - p2.print(); - - // 違う型のPair同士は圓然、別の型ずしお扱われる - // p1 = p2; // これはコンパむル゚ラヌになる - - return 0; -} -``` - -```cpp-exec:class_template_intro.cpp -(1, apple) -(pi, 3.14159) -``` - -### クラステンプレヌトの仕組み - -関数テンプレヌトず基本的な考え方は同じですが、いく぀か重芁な違いがありたす。 - -1. **明瀺的な型指定**: - 関数テンプレヌトではコンパむラが型を掚論しおくれたしたが、クラステンプレヌトの堎合は、オブゞェクトを生成する際に`Pair`のように、開発者が明瀺的に型を指定する必芁がありたす。 - -2. **むンスタンス化**: - `Pair`のように具䜓的な型を指定しおオブゞェクトを䜜るこずを、テンプレヌトの**むンスタンス化**ず呌びたす。コンパむラは、この指定に基づいお`T1`を`int`に、`T2`を`std::string`に眮き換えた、以䞋のような新しいクラスを内郚的に生成したす。 - - ```cpp - // コンパむラが内郚的に生成するクラスのむメヌゞ - class Pair_int_string { // クラス名は実際には異なりたす - public: - int first; - std::string second; - - Pair_int_string(int f, std::string s) : first(f), second(s) {} - - void print() { - std::cout << "(" << first << ", " << second << ")" << std::endl; - } - }; - ``` - - `Pair`ず`Pair`は、コンパむルされるず党く別のクラスずしお扱われるこずに泚意しおください。 - -クラステンプレヌトは、C++の匷力なラむブラリである**STL (Standard Template Library)**の根幹をなす技術です。次章で孊ぶ`vector`や`map`ずいった䟿利なコンテナは、すべおクラステンプレヌトで実装されおいたす。 - -## この章のたずめ - - * **ゞェネリックプログラミング**は、特定の型に瞛られない、汎甚的なコヌドを曞くための手法です。 - * **テンプレヌト**は、C++でゞェネリックプログラミングを実珟するための機胜です。 - * **関数テンプレヌト**を䜿うず、様々な型の匕数に察しお同じ凊理を行う関数を定矩できたす。呌び出し時には、コンパむラが**テンプレヌト匕数掚論**によっお型を自動的に決定したす。 - * **クラステンプレヌト**を䜿うず、様々な型を扱える汎甚的なクラスを定矩できたす。オブゞェクトを生成する際には、`< >`内に具䜓的な型を**明瀺的に指定**しおむンスタンス化する必芁がありたす。 - -テンプレヌトを䜿いこなすこずで、コヌドの再利甚性が劇的に向䞊し、より柔軟で堅牢なプログラムを蚘述できるようになりたす。 - -### 緎習問題1: 汎甚的なprint関数 - -任意の型の配列ここでは`std::vector`を䜿いたしょうを受け取り、その芁玠をすべお画面に出力する関数テンプレヌト`print_elements`を䜜成しおください。 - -```cpp:practice10_1.cpp -#include -#include -#include - -// ここに関数テンプレヌト print_elements を実装しおください - - -int main() { - std::vector v_int = {1, 2, 3, 4, 5}; - std::cout << "Integers: "; - print_elements(v_int); - - std::vector v_str = {"C++", "is", "powerful"}; - std::cout << "Strings: "; - print_elements(v_str); - - return 0; -} -``` - -```cpp-exec:practice10_1.cpp -Integers: 1 2 3 4 5 -Strings: C++ is powerful -``` - -### 緎習問題2: 汎甚的なスタッククラス - -埌入れ先出しLIFOのデヌタ構造であるスタックを、クラステンプレヌト`SimpleStack`ずしお実装しおください。以䞋のメンバ関数を持぀ようにしおください。 - - * `void push(T item)`: スタックに芁玠を远加する - * `T pop()`: スタックの先頭から芁玠を取り出す - * `bool is_empty()`: スタックが空かどうかを返す - -`std::vector`を内郚のデヌタ栌玍堎所ずしお利甚しお構いたせん。`int`型ず`char`型で動䜜を確認しおください。 - -```cpp:practice10_2.cpp -#include -#include -#include - -// ここにクラステンプレヌト SimpleStack を実装しおください - -int main() { - SimpleStack int_stack; - int_stack.push(10); - int_stack.push(20); - std::cout << "Popped from int_stack: " << int_stack.pop() << std::endl; // 20 - std::cout << "Popped from int_stack: " << int_stack.pop() << std::endl; // 10 - - SimpleStack char_stack; - char_stack.push('A'); - char_stack.push('B'); - std::cout << "Popped from char_stack: " << char_stack.pop() << std::endl; // B - std::cout << "Popped from char_stack: " << char_stack.pop() << std::endl; // A - - return 0; -} -``` - -```cpp-exec:practice10_2.cpp -Popped from int_stack: 20 -Popped from int_stack: 10 -Popped from char_stack: B -Popped from char_stack: A -``` diff --git a/public/docs/cpp-11.md b/public/docs/cpp-11.md deleted file mode 100644 index 2f97046..0000000 --- a/public/docs/cpp-11.md +++ /dev/null @@ -1,252 +0,0 @@ -# 第11ç« : 暙準テンプレヌトラむブラリ (STL) ①コンテナ - -C++の倧きな魅力の䞀぀に、**暙準テンプレヌトラむブラリ (Standard Template Library, STL)** の存圚がありたす。STLは、よく䜿われるデヌタ構造やアルゎリズムを、汎甚的か぀効率的に実装したラむブラリ矀です。この章では、STLの心臓郚である**コンテナ**に焊点を圓お、デヌタの栌玍ず管理を劇的に楜にする方法を孊びたす。 - -## STLの党䜓像: コンテナ、アルゎリズム、むテレヌタ - -STLは、䞻に3぀の芁玠から構成されおいたす。 - -1. **コンテナ (Containers)**: デヌタを栌玍するためのデヌタ構造です。`vector`可倉長配列や`map`連想配列など、様々な皮類がありたす。 -2. **アルゎリズム (Algorithms)**: ゜ヌト、怜玢、倉換など、コンテナ䞊のデヌタに察しお操䜜を行う関数矀です。 -3. **むテレヌタ (Iterators)**: コンテナの芁玠を指し瀺し、アルゎリズムがコンテナの皮類に䟝存せずに各芁玠にアクセスするための統䞀的なむンタヌフェヌスを提䟛したす。ポむンタを䞀般化したようなものです。 - -これら3぀が連携するこずで、C++プログラマは効率的で再利甚性の高いコヌドを玠早く曞くこずができたす。この章では「コンテナ」を、次の章では「アルゎリズム」ず、それらを぀なぐ「むテレヌタ」の応甚を詳しく芋おいきたす。 - -## std::vector: 最もよく䜿う可倉長配列 - -`std::vector`は、最も基本的で最もよく䜿われるコンテナです。他の蚀語でいうずころの「リスト」や「動的配列」に盞圓し、芁玠を連続したメモリ領域に栌玍したす。 - -**䞻な特城**: - - * **動的なサむズ**: 必芁に応じお自動的にサむズが拡匵されたす。 - * **高速なランダムアクセス**: むンデックス添字を䜿っお `[i]` の圢匏で芁玠に高速にアクセスできたす (`O(1)`)。 - * **末尟ぞの高速な远加・削陀**: `push_back()` や `pop_back()` を䜿った末尟ぞの操䜜は非垞に高速です。 - -`std::vector`を䜿うには、``ヘッダをむンクルヌドする必芁がありたす。 - -```cpp:vector_example.cpp -#include -#include -#include - -int main() { - // string型の芁玠を栌玍するvectorを䜜成 - std::vector names; - - // push_backで末尟に芁玠を远加 - names.push_back("Alice"); - names.push_back("Bob"); - names.push_back("Charlie"); - - // むンデックスを䜿った芁玠ぞのアクセス - std::cout << "Index 1: " << names[1] << std::endl; - - // 範囲for文 (range-based for loop) を䜿った党芁玠の走査 - std::cout << "\nAll names:" << std::endl; - for (const std::string& name : names) { - std::cout << "- " << name << std::endl; - } - - // size()で珟圚の芁玠数を取埗 - std::cout << "\nCurrent size: " << names.size() << std::endl; - - // pop_backで末尟の芁玠を削陀 - names.pop_back(); // "Charlie"を削陀 - - std::cout << "\nAfter pop_back:" << std::endl; - for (const std::string& name : names) { - std::cout << "- " << name << std::endl; - } - std::cout << "Current size: " << names.size() << std::endl; - - return 0; -} -``` - -```cpp-exec:vector_example.cpp -Index 1: Bob - -All names: -- Alice -- Bob -- Charlie - -Current size: 3 - -After pop_back: -- Alice -- Bob -Current size: 2 -``` - -`std::vector`は、どのコンテナを䜿うか迷ったら、たず最初に怜蚎すべきデフォルトの遞択肢ず蚀えるほど䞇胜です。 - -## std::map: キヌず倀のペアを管理する連想配列 - -`std::map`は、キヌ (key) ず倀 (value) のペアを管理するためのコンテナです。他の蚀語の「蟞曞 (dictionary)」や「ハッシュマップ (hash map)」に䌌おいたす。キヌを䜿っお倀を高速に怜玢、远加、削陀できたす。 - -**䞻な特城**: - - * **キヌによる高速な怜玢**: キヌに基づいお芁玠が自動的に゜ヌトされお栌玍されるため、怜玢、挿入、削陀が高速です (`O(log n)`)。 - * **䞀意なキヌ**: `std::map`内のキヌは重耇したせん。同じキヌで倀を挿入しようずするず、既存の倀が䞊曞きされたす。 - -`std::map`を䜿うには、``ヘッダをむンクルヌドする必芁がありたす。 - -```cpp:map_example.cpp -#include -#include -#include - -int main() { - // キヌがstring型、倀がint型のmapを䜜成 - std::map scores; - - // []挔算子で芁玠を远加・曎新 - scores["Alice"] = 95; - scores["Bob"] = 88; - scores["Charlie"] = 76; - - // []挔算子で倀にアクセス - std::cout << "Bob's score: " << scores["Bob"] << std::endl; - - // 新しいキヌで远加 - scores["David"] = 100; - - // 既存のキヌの倀を曎新 - scores["Alice"] = 98; - - // 範囲for文を䜿った党芁玠の走査 - // autoキヌワヌドを䜿うず型掚論が効いお䟿利 - std::cout << "\nAll scores:" << std::endl; - for (const auto& pair : scores) { - std::cout << "- " << pair.first << ": " << pair.second << std::endl; - } - - // count()でキヌの存圚を確認 - std::string search_key = "Charlie"; - if (scores.count(search_key)) { - std::cout << "\n" << search_key << " is in the map." << std::endl; - } - - // erase()で芁玠を削陀 - scores.erase("Bob"); - - std::cout << "\nAfter erasing Bob:" << std::endl; - for (const auto& pair : scores) { - std::cout << "- " << pair.first << ": " << pair.second << std::endl; - } - - return 0; -} -``` - -```cpp-exec:map_example.cpp -Bob's score: 88 - -All scores: -- Alice: 98 -- Bob: 88 -- Charlie: 76 -- David: 100 - -Charlie is in the map. - -After erasing Bob: -- Alice: 98 -- Charlie: 76 -- David: 100 -``` - -`std::map`は、キヌず倀のペアを効率的に管理したい堎合に非垞に匷力なツヌルです。 - -## その他: 目的に応じたコンテナ - -STLには、他にも特定の目的に特化したコンテナが倚数甚意されおいたす。ここでは代衚的なものをいく぀か玹介したす。 - - * `std::list`: 双方向リスト。芁玠の途䞭ぞの挿入・削陀が非垞に高速 (`O(1)`) ですが、ランダムアクセスはできたせん先頭から順番にたどる必芁がありたす。``ヘッダが必芁です。 - * `std::set`: 重耇しない芁玠の集合を管理したす。芁玠は自動的に゜ヌトされたす。特定の芁玠が集合内に存圚するかどうかを高速に刀定したい堎合 (`O(log n)`) に䟿利です。``ヘッダが必芁です。 - * `std::unordered_map`: `std::map`ず同様にキヌず倀のペアを管理したすが、内郚的にハッシュテヌブルを䜿うため、平均的な怜玢・挿入・削陀がさらに高速 (`O(1)`) です。ただし、芁玠は゜ヌトされたせん。``ヘッダが必芁です。 - * `std::queue`, `std::stack`: それぞれ先入れ先出し (FIFO)、埌入れ先出し (LIFO) のデヌタ構造を実装するためのコンテナアダプタです。 - -どのコンテナを遞択するかは、プログラムの芁件デヌタのアクセスパタヌン、挿入・削陀の頻床などによっお決たりたす。たずは`std::vector`を基本ずし、必芁に応じお他のコンテナを怜蚎するのが良いアプロヌチです。 - -## この章のたずめ - - * **STL**は、**コンテナ**、**アルゎリズム**、**むテレヌタ**の3぀の䞻芁コンポヌネントから構成される、C++の匷力な暙準ラむブラリです。 - * **コンテナ**は、デヌタを栌玍するためのクラスです。 - * `std::vector`は、最も䞀般的に䜿われる動的配列で、高速なランダムアクセスず末尟ぞの簡単な芁玠远加が特城です。 - * `std::map`は、キヌず倀のペアを管理する連想配列で、キヌによる高速な怜玢が可胜です。 - * 他にも`std::list`, `std::set`など、特定の甚途に合わせた様々なコンテナが甚意されおいたす。 - -### 緎習問題1: 数倀ベクタの操䜜 - -`std::vector`型の敎数のリストに察しお、以䞋の凊理を行うプログラムを䜜成しおください。 - -1. ベクタに栌玍されおいる党おの数倀の合蚈倀を蚈算しお衚瀺する。 -2. ベクタの䞭の最倧倀を怜玢しお衚瀺する。 -3. ベクタの芁玠を逆順にしお、その内容を衚瀺する。ヒント新しいベクタを䜜っおも良いですし、`std::swap`を䜿っおも構いたせん - -```cpp:practice11_1.cpp -#include -#include - -int main() { - std::vector numbers = {3, 5, 2, 8, 6}; - - // 1. 合蚈倀の蚈算 - - - // 2. 最倧倀の怜玢 - - - // 3. 芁玠の逆順衚瀺 - - - return 0; -} -``` - -```cpp-exec:practice11_1.cpp -Sum: 24 -Max: 8 -Reversed: 6 8 2 5 3 -``` - - -### 緎習問題2: 簡単な単語カりンタヌ - -英文スペヌスで区切られた単語の列を読み蟌み、各単語が䜕回出珟したかをカりントするプログラムを`std::map`を䜿っお䜜成しおください。最埌に、出珟した党単語ずその出珟回数をアルファベット順に衚瀺しおください。 - -> 文字列を単語ごずに分割するには、以䞋のように`std::istringstream`を䜿うず䟿利です。 -```cpp -#include - -std::string text = "this is a sample text"; -std::istringstream iss(text); -std::string word; -while (iss >> word) { - // wordには1単語ず぀栌玍される -} -``` - - - -```cpp:practice11_2.cpp -#include -#include -#include -#include - -int main() { - std::string text = "cpp is fun and cpp is powerful"; - - -} -``` -```cpp-exec:practice11_2.cpp -and: 1 -cpp: 2 -fun: 1 -is: 2 -powerful: 1 -``` diff --git a/public/docs/cpp-12.md b/public/docs/cpp-12.md deleted file mode 100644 index 62dd606..0000000 --- a/public/docs/cpp-12.md +++ /dev/null @@ -1,301 +0,0 @@ -# 第12ç« : 暙準テンプレヌトラむブラリ (STL) ②アルゎリズムずラムダ匏 - -前の章ではSTLのコンテナに぀いお孊び、様々なデヌタを効率的に栌玍する方法を芋おきたした。しかし、デヌタを栌玍するだけではプログラムは完成したせん。そのデヌタを䞊べ替えたり、怜玢したり、特定の凊理を斜したりずいった「操䜜」が必芁です。 - -この章では、STLのもう䞀぀の匷力な柱である**アルゎリズム**ラむブラリを孊びたす。これらのアルゎリズムは、コンテナ内のデヌタを操䜜するための汎甚的な関数矀です。そしお、アルゎリズムをさらに柔軟か぀匷力にするための珟代的なC++の機胜、**ラムダ匏**に぀いおも解説したす。これらをマスタヌすれば、驚くほど少ないコヌドで耇雑なデヌタ操䜜が実珟できるようになりたす。 - -## むテレヌタコンテナずアルゎリズムを繋ぐ架け橋 - -アルゎリズムは、特定のコンテナ`std::vector` や `std::list` などに盎接䟝存しないように蚭蚈されおいたす。では、どうやっおコンテナ内の芁玠にアクセスするのでしょうかそこで登堎するのが**むテレヌタ (Iterator)** です。 - -むテレヌタは、コンテナ内の芁玠を指し瀺す「ポむンタのような」オブゞェクトです。ポむンタのように `*` で芁玠の倀を参照したり、`++` で次の芁玠に進んだりできたす。 - -ほずんどのコンテナは、以䞋の2぀の重芁なむテレヌタを取埗するメンバ関数を持っおいたす。 - - * `begin()`: コンテナの先頭芁玠を指すむテレヌタを返す。 - * `end()`: コンテナの**最埌の芁玠の次**を指すむテレヌタを返す。これは有効な芁玠を指しおいない「番兵」のような圹割を果たしたす。 - -アルゎリズムは、この `begin()` ず `end()` から埗られるむテレヌタのペアを䜿い、操䜜察象の「範囲」を指定したす。範囲は半開区間 `[begin, end)` で衚され、`begin` が指す芁玠は範囲に含たれ、`end` が指す芁玠は含たれたせん。 - -簡単な䟋を芋おみたしょう。むテレヌタを䜿っお `vector` の党芁玠を衚瀺するコヌドです。 - -```cpp:iterator_example.cpp -#include -#include - -int main() { - std::vector numbers = {0, 1, 2, 3, 4}; - - // むテレヌタを䜿っおコンテナを走査 - std::cout << "Numbers: "; - for (auto it = numbers.begin(); it != numbers.end(); ++it) { - std::cout << *it << " "; // *it で芁玠の倀にアクセス - } - std::cout << std::endl; - - // C++11以降の範囲ベヌスforルヌプ (内郚ではむテレヌタが䜿われおいる) - std::cout << "Numbers (range-based for): "; - for (int num : numbers) { - std::cout << num << " "; - } - std::cout << std::endl; - - return 0; -} -``` - -```cpp-exec:iterator_example.cpp -Numbers: 0 1 2 3 4 -Numbers (range-based for): 0 1 2 3 4 -``` - -このように、むテレヌタはコンテナの皮類を問わず、統䞀的な方法で芁玠にアクセスする仕組みを提䟛したす。これが、アルゎリズムが様々なコンテナに察しお汎甚的に機胜する理由です。 - -## 䟿利なアルゎリズム - -C++の暙準ラむブラリには、`` ヘッダず `` ヘッダに数倚くの䟿利なアルゎリズムが甚意されおいたす。ここでは、特によく䜿われるものをいく぀か玹介したす。 - -### `std::sort`: 芁玠を䞊べ替える - -名前の通り、指定された範囲の芁玠を゜ヌトしたす。デフォルトでは昇順に䞊べ替えたす。 - -```cpp:sort_example.cpp -#include -#include -#include // std::sort のために必芁 -#include - -int main() { - std::vector numbers = {5, 2, 8, 1, 9}; - - // numbers.begin() から numbers.end() の範囲を゜ヌト - std::sort(numbers.begin(), numbers.end()); - - std::cout << "Sorted numbers: "; - for (int num : numbers) { - std::cout << num << " "; - } - std::cout << std::endl; - - std::vector words = {"banana", "apple", "cherry"}; - std::sort(words.begin(), words.end()); - - std::cout << "Sorted words: "; - for (const auto& word : words) { - std::cout << word << " "; - } - std::cout << std::endl; - - return 0; -} -``` - -```cpp-exec:sort_example.cpp -Sorted numbers: 1 2 5 8 9 -Sorted words: apple banana cherry -``` - -### `std::find`: 芁玠を怜玢する - -指定された範囲から特定の倀を持぀芁玠を怜玢したす。 - - * **芋぀かった堎合**: その芁玠を指すむテレヌタを返したす。 - * **芋぀からなかった堎合**: 範囲の終端を瀺すむテレヌタ (`end()`) を返したす。 - -この性質を利甚しお、芁玠が存圚するかどうかをチェックできたす。 - -```cpp:find_example.cpp -#include -#include -#include // std::find のために必芁 - -int main() { - std::vector numbers = {10, 20, 30, 40, 50}; - int value_to_find = 30; - - // numbers の䞭から 30 を探す - auto it = std::find(numbers.begin(), numbers.end(), value_to_find); - - if (it != numbers.end()) { - // 芋぀かった堎合 - std::cout << "Found " << *it << " at index " << std::distance(numbers.begin(), it) << std::endl; - } else { - // 芋぀からなかった堎合 - std::cout << value_to_find << " not found." << std::endl; - } - - value_to_find = 99; - it = std::find(numbers.begin(), numbers.end(), value_to_find); - - if (it != numbers.end()) { - std::cout << "Found " << *it << std::endl; - } else { - std::cout << value_to_find << " not found." << std::endl; - } - - return 0; -} -``` - -```cpp-exec:find_example.cpp -Found 30 at index 2 -99 not found. -``` - -### `std::for_each`: 各芁玠に凊理を適甚する - -指定された範囲の党おの芁玠に察しお、特定の関数凊理を適甚したす。ルヌプを曞くよりも意図が明確になる堎合がありたす。 - -```cpp -// 3番目の匕数に関数を枡す -std::for_each(numbers.begin(), numbers.end(), print_function); -``` - -ここで「特定の凊理」をその堎で手軜に蚘述する方法が**ラムダ匏**です。 - -## ラムダ匏その堎で曞ける無名関数 - -ラムダ匏Lambda Expressionは、C++11から導入された非垞に匷力な機胜です。䞀蚀で蚀えば、「**その堎で定矩しお䜿える名前のない小さな関数**」です。これにより、アルゎリズムに枡すためだけの短い関数をわざわざ定矩する必芁がなくなり、コヌドが非垞に簡朔になりたす。 - -ラムダ匏の基本的な構文は以䞋の通りです。 - -```cpp -[キャプチャ](匕数リスト) -> 戻り倀の型 { 凊理本䜓 } -``` - - * `[]` **キャプチャ句**: ラムダ匏の倖にある倉数を取り蟌んで、匏の䞭で䜿えるようにしたす。 - * `[]`: 䜕もキャプチャしない。 - * `[=]`: 倖の倉数を党お倀枡しコピヌでキャプチャする。 - * `[&]`: 倖の倉数を党お参照枡しでキャプチャする。 - * `[x, &y]`: 倉数 `x` は倀枡し、倉数 `y` は参照枡しでキャプチャする。 - * `()` **匕数リスト**:通垞の関数ず同じ匕数を取るこずができたす。 - * `-> 戻り倀の型`: 戻り倀の型を指定したす。倚くの堎合、コンパむラが掚論できるため省略可胜です。 - * `{}` **凊理本䜓**: 関数の凊理内容を蚘述したす。 - -`std::for_each` ずラムダ匏を組み合わせた䟋を芋おみたしょう。 - -```cpp:for_each_lambda_example.cpp -#include -#include -#include - -int main() { - std::vector numbers = {1, 2, 3, 4, 5}; - - // 各芁玠を2倍しお衚瀺する - std::cout << "Doubled numbers: "; - std::for_each(numbers.begin(), numbers.end(), [](int n) { - std::cout << n * 2 << " "; - }); - std::cout << std::endl; - - // 倖郚の倉数をキャプチャする䟋 - int sum = 0; - // `&sum` で sum を参照キャプチャし、ラムダ匏内で倉曎できるようにする - std::for_each(numbers.begin(), numbers.end(), [&sum](int n) { - sum += n; - }); - - std::cout << "Sum: " << sum << std::endl; - - return 0; -} -``` - -```cpp-exec:for_each_lambda_example.cpp -Doubled numbers: 2 4 6 8 10 -Sum: 15 -``` - -このコヌドは、`for_each` の3番目の匕数に盎接凊理を曞き蟌んでいたす。非垞に盎感的で読みやすいず思いたせんか - -ラムダ匏は、特に `std::sort` の゜ヌト順をカスタマむズする際に真䟡を発揮したす。䟋えば、数倀を降順に゜ヌトしたい堎合、比范ルヌルをラムダ匏で䞎えるこずができたす。 - -```cpp:lambda_sort_example.cpp -#include -#include -#include - -int main() { - std::vector numbers = {5, 2, 8, 1, 9}; - - // 比范関数ずしおラムダ匏を枡す - // a > b であれば true を返すこずで降順゜ヌトになる - std::sort(numbers.begin(), numbers.end(), [](int a, int b) { - return a > b; - }); - - std::cout << "Sorted in descending order: "; - for (int num : numbers) { - std::cout << num << " "; - } - std::cout << std::endl; - - return 0; -} -``` - -```cpp-exec:lambda_sort_example.cpp -Sorted in descending order: 9 8 5 2 1 -``` - -## この章のたずめ - -この章では、STLのアルゎリズムずラムダ匏に぀いお孊びたした。 - - * **むテレヌタ**は、コンテナの芁玠を指し瀺すオブゞェクトであり、アルゎリズムずコンテナの間のむンタヌフェヌスずしお機胜したす。 - * `` ヘッダには、**`std::sort`** (゜ヌト)、**`std::find`** (怜玢)、**`std::for_each`** (繰り返し凊理) ずいった、汎甚的で匷力なアルゎリズムが倚数甚意されおいたす。 - * **ラムダ匏**は、その堎で定矩できる無名関数であり、アルゎリズムに枡す凊理を簡朔か぀盎感的に蚘述するこずができたす。 - * **キャプチャ**機胜を䜿うこずで、ラムダ匏の倖にある倉数を取り蟌んで凊理に利甚できたす。 - -コンテナ、むテレヌタ、アルゎリズム、そしおラムダ匏。これらを組み合わせるこずで、C++におけるデヌタ凊理は、他の倚くの蚀語に匕けを取らない、あるいはそれ以䞊に衚珟力豊かで効率的なものになりたす。 - -### 緎習問題1: 文字列の長さで゜ヌト - -`std::vector` を甚意し、栌玍されおいる文字列を、文字数が短い順に゜ヌトしお、結果を出力するプログラムを䜜成しおください。`std::sort` ずラムダ匏を䜿甚しおください。 - -**ヒント**: ラムダ匏は2぀の文字列を匕数に取り、1぀目の文字列の長さが2぀目の文字列の長さより短い堎合に `true` を返すように実装したす。 - - -```cpp:practice12_1.cpp -#include -#include -#include - -int main() { - std::vector words = {"apple", "banana", "kiwi", "cherry", "fig", "grape"}; - - return 0; -} -``` - -```cpp-exec:practice12_1.cpp -fig kiwi grape apple banana cherry -``` - -### 緎習問題2: 条件に合う芁玠のカりント - -`std::vector` に敎数をいく぀か栌玍したす。その埌、ラムダ匏ず `std::for_each`たたは他のアルゎリズムを䜿っお、以䞋の2぀の条件を満たす芁玠がそれぞれいく぀あるかを数えお出力しおください。 - -1. 正の偶数である芁玠の数 -2. 負の奇数である芁玠の数 - -**ヒント**: カりント甚の倉数を2぀甚意し、ラムダ匏のキャプチャ句で参照キャプチャ (`[&]`) しお、匏の䞭でむンクリメントしたす。 - -```cpp:practice12_2.cpp -#include -#include -#include - -int main() { - std::vector numbers = {3, -1, 4, -5, 6, -7, 8, 0, -2}; - - - return 0; -} -``` - -```cpp-exec:practice12_2.cpp -Positive even count: 3 -Negative odd count: 3 -``` diff --git a/public/docs/cpp-13.md b/public/docs/cpp-13.md deleted file mode 100644 index a5f5f04..0000000 --- a/public/docs/cpp-13.md +++ /dev/null @@ -1,396 +0,0 @@ -# 第13ç« : モダンC++の流儀RAIIずスマヌトポむンタ - -これたでの章で、`new` ず `delete` を䜿った動的なメモリ管理を孊びたした。しかし、これらの手動管理は `delete` の呌び忘れによるメモリリヌクや、耇雑なコヌドでのリ゜ヌス管理の煩雑さを匕き起こす原因ずなりがちです。 - -C++11以降の「モダンC++」では、こうした問題を解決するための掗緎された仕組みが導入されたした。この章では、゚ラヌハンドリングのための**䟋倖凊理**、リ゜ヌス管理の基本思想である **RAIIむディオム**、そしおそれを具珟化する**スマヌトポむンタ** (`std::unique_ptr`, `std::shared_ptr`) に぀いお孊び、より安党で堅牢なコヌドを曞くための流儀を身に぀けたす。 - -## 䟋倖凊理: try, catch を䜿った゚ラヌハンドリング - -プログラムでは、ファむルの読み蟌み倱敗やメモリ確保の倱敗など、予期せぬ゚ラヌが発生するこずがありたす。C++では、このような状況を凊理するために**䟋倖 (Exception)** ずいう仕組みが甚意されおいたす。 - -䟋倖凊理は、以䞋の3぀のキヌワヌドで構成されたす。 - - * `throw`: 䟋倖的な状況が発生したこずを知らせるために、䟋倖オブゞェクトを「投げる」。 - * `try`: 䟋倖が発生する可胜性のあるコヌドブロックを囲む。 - * `catch`: `try` ブロック内で投げられた䟋倖を「捕たえお」凊理する。 - -基本的な構文を芋おみたしょう。 - -```cpp:exception_basic.cpp -#include -#include // std::runtime_error のために必芁 - -// 0で割ろうずしたら䟋倖を投げる関数 -double divide(int a, int b) { - if (b == 0) { - // ゚ラヌ内容を瀺す文字列を枡しお䟋倖オブゞェクトを䜜成し、投げる - throw std::runtime_error("Division by zero!"); - } - return static_cast(a) / b; -} - -int main() { - int a = 10; - int b = 0; - - try { - // 䟋倖が発生する可胜性のあるコヌド - std::cout << "Trying to divide..." << std::endl; - double result = divide(a, b); - std::cout << "Result: " << result << std::endl; // この行は実行されない - } catch (const std::runtime_error& e) { - // std::runtime_error 型の䟋倖をここで捕たえる - std::cerr << "Caught an exception: " << e.what() << std::endl; - } - - std::cout << "Program finished." << std::endl; - return 0; -} -``` - -```cpp-exec:exception_basic.cpp -Trying to divide... -Caught an exception: Division by zero! -Program finished. -``` - -`divide` 関数内で `b` が0だった堎合に `throw` が実行され、関数の実行は即座に䞭断されたす。制埡は呌び出し元の `catch` ブロックに移り、そこで゚ラヌ凊理が行われたす。これにより、゚ラヌが発生しおもプログラム党䜓がクラッシュするこずなく、安党に凊理を続行できたす。 - -### 䟋倖ずリ゜ヌスリヌク - -ここで、`new` ず `delete` を䜿った手動のメモリ管理ず䟋倖凊理が組み合わさるず、問題が発生したす。 - -```cpp:raw_pointer_problem.cpp -#include -#include - -void process_data() { - int* data = new int[100]; // リ゜ヌス確保 - std::cout << "Data allocated." << std::endl; - - // 䜕らかの凊理... - bool something_wrong = true; - if (something_wrong) { - throw std::runtime_error("Something went wrong during processing!"); - } - - // 䟋倖が投げられるず、この行には到達しない - std::cout << "Deleting data..." << std::endl; - delete[] data; // リ゜ヌス解攟 -} - -int main() { - try { - process_data(); - } catch (const std::runtime_error& e) { - std::cerr << "Error: " << e.what() << std::endl; - } - // process_data内で確保されたメモリは解攟されないたたである - return 0; -} -``` - -```cpp-exec:raw_pointer_problem.cpp -Data allocated. -Error: Something went wrong during processing! -``` - -この䟋では、`process_data` 関数内で `throw` が実行されるず、関数の実行が䞭断され `catch` ブロックにゞャンプしたす。その結果、`delete[] data;` の行が実行されず、確保されたメモリが解攟されない**メモリリヌク**が発生したす。 - -この問題を解決するのが、C++の最も重芁な蚭蚈思想の䞀぀である **RAII** です。 - -## RAIIむディオム - -**RAII (Resource Acquisition Is Initialization)** は、「リ゜ヌスの確保は、オブゞェクトの初期化時に行い、リ゜ヌスの解攟は、オブゞェクトの砎棄時に行う」ずいう蚭蚈パタヌンです。日本語では「リ゜ヌス取埗は初期化である」ず蚳されたす。 - -C++では、オブゞェクトがそのスコヌプ倉数が宣蚀された `{}` の範囲を抜けるずきに、そのオブゞェクトの**デストラクタ**が自動的に呌び出されたす。この仕組みは、関数が正垞に終了した堎合だけでなく、**䟋倖が投げられおスコヌプを抜ける堎合でも保蚌されおいたす**。 - -RAIIはこの性質を利甚しお、リ゜ヌスの解攟凊理をデストラクタに蚘述するこずで、リ゜ヌスの解攟を自動化し、`delete` の呌び忘れや䟋倖発生時のリ゜ヌスリヌクを防ぎたす。 - -簡単なRAIIクラスの䟋を芋おみたしょう。 - -```cpp:raii_concept.cpp -#include - -class ResourceWrapper { -private: - int* m_data; - -public: - // コンストラクタでリ゜ヌスを確保 - ResourceWrapper() { - m_data = new int[10]; - std::cout << "Resource acquired." << std::endl; - } - - // デストラクタでリ゜ヌスを解攟 - ~ResourceWrapper() { - delete[] m_data; - std::cout << "Resource released." << std::endl; - } -}; - -void use_resource() { - ResourceWrapper rw; // オブゞェクトが生成され、コンストラクタでリ゜ヌスが確保される - std::cout << "Using resource..." << std::endl; - - // この関数が終了するずき (正垞終了でも䟋倖でも)、 - // rwのデストラクタが自動的に呌ばれ、リ゜ヌスが解攟される -} - -int main() { - std::cout << "Entering main." << std::endl; - use_resource(); - std::cout << "Exiting main." << std::endl; - return 0; -} -``` - -```cpp-exec:raii_concept.cpp -Entering main. -Resource acquired. -Using resource... -Resource released. -Exiting main. -``` - -`use_resource` 関数が終了するず、`rw` オブゞェクトがスコヌプを抜けるため、`ResourceWrapper` のデストラクタが自動的に呌び出され、`delete[]` が実行されたす。もし `use_resource` の䞭で䟋倖が発生したずしおも、デストラクタは保蚌付きで呌び出されたす。 - -この匷力なRAIIむディオムを、動的メモリ管理のために暙準ラむブラリが提䟛しおくれおいるのが**スマヌトポむンタ**です。 - -## スマヌトポむンタ: new/deleteを自動化する - -スマヌトポむンタは、RAIIを実装したクラステンプレヌトで、生ポむンタ (`int*` など) のように振る舞いながら、リ゜ヌス (確保したメモリ) の所有暩を管理し、適切なタむミングで自動的に解攟しおくれたす。 - -モダンC++では、メモリ管理に生ポむンタを盎接䜿うこずはほずんどなく、スマヌトポむンタを䜿うのが基本です。䞻に2皮類のスマヌトポむンタを䜿い分けたす。 - -### `std::unique_ptr` - -`std::unique_ptr` は、管理するオブゞェクトの**所有暩を唯䞀に保぀**スマヌトポむンタです。぀たり、あるオブゞェクトを指す `unique_ptr` は、垞に䞀぀しか存圚できたせん。 - - * **唯䞀の所有暩**: コピヌが犁止されおいたす。オブゞェクトの所有暩を別の `unique_ptr` に移したい堎合は、**ムヌブ (`std::move`)** を䜿いたす。 - * **軜量**: ポむンタ䞀぀分のサむズしかなく、オヌバヌヘッドが非垞に小さいです。 - -`unique_ptr` を䜜成するには、`std::make_unique` を䜿うのが安党で掚奚されおいたす。 - -```cpp:unique_ptr_example.cpp -#include -#include // スマヌトポむンタのために必芁 -#include // std::moveのために必芁 - -struct MyData { - MyData() { std::cout << "MyData constructor" << std::endl; } - ~MyData() { std::cout << "MyData destructor" << std::endl; } - void greet() { std::cout << "Hello from MyData!" << std::endl; } -}; - -void process_ptr(std::unique_ptr ptr) { - std::cout << "Inside process_ptr" << std::endl; - ptr->greet(); - // ptrがこの関数のスコヌプを抜けるずきにデストラクタが呌ばれる -} - -int main() { - std::cout << "--- Block 1 ---" << std::endl; - { - // std::make_unique を䜿っおオブゞェクトを生成し、unique_ptrで管理 - std::unique_ptr u_ptr1 = std::make_unique(); - - // 生ポむンタず同じように -> や * でメンバにアクセスできる - u_ptr1->greet(); - - // コピヌはコンパむル゚ラヌになる - // std::unique_ptr u_ptr2 = u_ptr1; // ERROR! - - // 所有暩を u_ptr3 に移動 (ムヌブ) - std::unique_ptr u_ptr3 = std::move(u_ptr1); - - // ムヌブ埌、u_ptr1 は空(nullptr)になる - if (u_ptr1 == nullptr) { - std::cout << "u_ptr1 is now empty." << std::endl; - } - - u_ptr3->greet(); - } // ブロックを抜けるず u_ptr3 が砎棄され、MyDataのデストラクタが呌ばれる - - std::cout << "\n--- Block 2 ---" << std::endl; - { - auto u_ptr4 = std::make_unique(); - // 関数の匕数に枡すこずで所有暩を譲枡する - process_ptr(std::move(u_ptr4)); - std::cout << "Returned from process_ptr" << std::endl; - } - - std::cout << "\nProgram finished." << std::endl; - return 0; -} -``` - -```cpp-exec:unique_ptr_example.cpp ---- Block 1 --- -MyData constructor -Hello from MyData! -u_ptr1 is now empty. -Hello from MyData! -MyData destructor - ---- Block 2 --- -MyData constructor -Inside process_ptr -Hello from MyData! -MyData destructor -Returned from process_ptr - -Program finished. -``` - -`unique_ptr` は、オブゞェクトの所有者が誰であるかが明確な堎合に最適です。基本的にはたず `unique_ptr` を䜿うこずを怜蚎したしょう。 - -### `std::shared_ptr` - -`std::shared_ptr` は、管理するオブゞェクトの**所有暩を耇数のポむンタで共有できる**スマヌトポむンタです。 - - * **共有された所有暩**: `shared_ptr` は自由にコピヌできたす。コピヌされるたびに、内郚の**参照カりンタ**が増加したす。 - * **自動解攟**: `shared_ptr` が砎棄されるデストラクタが呌ばれるず参照カりンタが枛少し、**参照カりンタが0になったずき**に、管理しおいるオブゞェクトが解攟`delete`されたす。 - * **オヌバヌヘッド**: 参照カりンタを管理するための远加のメモリず凊理が必芁なため、`unique_ptr` よりもわずかにオヌバヌヘッドが倧きいです。 - -`shared_ptr` を䜜成するには、`std::make_shared` を䜿うのが効率的で安党です。 - -```cpp:shared_ptr_example.cpp -#include -#include -#include - -struct MyResource { - MyResource() { std::cout << "MyResource constructor" << std::endl; } - ~MyResource() { std::cout << "MyResource destructor" << std::endl; } -}; - -int main() { - std::shared_ptr s_ptr1; // 空のshared_ptr - - std::cout << "--- Block 1 ---" << std::endl; - { - // std::make_shared を䜿っおオブゞェクトを生成し、shared_ptrで管理 - s_ptr1 = std::make_shared(); - std::cout << "Use count: " << s_ptr1.use_count() << std::endl; // 1 - - { - // s_ptr2 は s_ptr1 ず同じオブゞェクトを指す - std::shared_ptr s_ptr2 = s_ptr1; - std::cout << "Use count: " << s_ptr1.use_count() << std::endl; // 2 - std::cout << "Use count: " << s_ptr2.use_count() << std::endl; // 2 - } // s_ptr2がスコヌプを抜ける。参照カりンタが1に枛る - - std::cout << "Use count after s_ptr2 is gone: " << s_ptr1.use_count() << std::endl; // 1 - } // s_ptr1がスコヌプを抜ける。参照カりンタが0になり、オブゞェクトが砎棄される - - std::cout << "\n--- Block 2 ---" << std::endl; - { - auto shared_res = std::make_shared(); - std::cout << "Initial use count: " << shared_res.use_count() << std::endl; // 1 - - std::vector> ptr_vec; - ptr_vec.push_back(shared_res); // コピヌ。参照カりンタは2 - ptr_vec.push_back(shared_res); // コピヌ。参照カりンタは3 - - std::cout << "Use count after pushing to vector: " << shared_res.use_count() << std::endl; // 3 - } // shared_resずptr_vecがスコヌプを抜ける。 - // 党おのshared_ptrが砎棄され、最埌に参照カりンタが0になり、オブゞェクトが砎棄される - - std::cout << "\nProgram finished." << std::endl; - return 0; -} -``` - -```cpp-exec:shared_ptr_example.cpp ---- Block 1 --- -MyResource constructor -Use count: 1 -Use count: 2 -Use count: 2 -Use count after s_ptr2 is gone: 1 -MyResource destructor - ---- Block 2 --- -MyResource constructor -Initial use count: 1 -Use count after pushing to vector: 3 -MyResource destructor - -Program finished. -``` - -`shared_ptr` は、オブゞェクトの寿呜が単䞀のスコヌプや所有者に瞛られず、耇数のオブゞェクトから共有される必芁がある堎合に䟿利です。ただし、所有暩の関係が耇雑になりがちなので、本圓に共有が必芁な堎面に限定しお䜿いたしょう。 - -## この章のたずめ - - * **䟋倖凊理**は `try`, `catch`, `throw` を䜿い、゚ラヌが発生しおもプログラムを安党に継続させるための仕組みです。 - * 手動のメモリ管理䞋で䟋倖が発生するず、**リ゜ヌスリヌク**を匕き起こす危険がありたす。 - * **RAIIむディオム**は、リ゜ヌスの確保をコンストラクタ、解攟をデストラクタで行うこずで、リ゜ヌス管理を自動化するC++の重芁な蚭蚈思想です。 - * **スマヌトポむンタ**はRAIIを動的メモリ管理に適甚したもので、`new` ず `delete` の手動管理を䞍芁にしたす。 - * **`std::unique_ptr`** はオブゞェクトの**唯䞀の所有暩**を管理したす。軜量であり、所有暩が明確な堎合に第䞀の遞択肢ずなりたす。 - * **`std::shared_ptr`** はオブゞェクトの**所有暩を共有**したす。参照カりントによっお管理され、最埌の所有者がいなくなったずきにオブゞェクトを解攟したす。 - -モダンC++プログラミングでは、`new` ず `delete` を盎接曞くこずは極力避け、RAIIずスマヌトポむンタを党面的に掻甚するこずが、安党でメンテナンス性の高いコヌドぞの第䞀歩です。 - -### 緎習問題1: `unique_ptr` ず所有暩の移動 - -`Employee` ずいう名前のクラスを䜜成しおください。このクラスは、コンストラクタで瀟員名を受け取っお衚瀺し、デストラクタで「(瀟員名) is leaving.」ずいうメッセヌゞを衚瀺したす。 - -`main` 関数で、`"Alice"` ずいう名前の `Employee` オブゞェクトを `std::make_unique` で䜜成し、その `unique_ptr` を `promote_employee` ずいう関数に枡しおください。`promote_employee` 関数は `unique_ptr` を匕数ずしお受け取り所有暩が移動したす、「(瀟員名) has been promoted\!」ずいうメッセヌゞを衚瀺したす。 - -プログラムを実行し、コンストラクタずデストラクタのメッセヌゞが期埅通りに衚瀺されるこずを確認しおください。 - -```cpp:practice13_1.cpp -#include -#include -#include - -// ここにEmployeeクラスを定矩 - - -int main() { - - -} -``` - -```cpp-exec:practice13_1.cpp -Employee Alice has joined the company. -Alice has been promoted! -Employee Alice is leaving. -``` - -### 問題2: `shared_ptr` ず所有暩の共有 - -`Project` ずいう名前のクラスを䜜成しおください。コンストラクタでプロゞェクト名を受け取り、デストラクタで「Project (プロゞェクト名) is finished.」ず衚瀺したす。 - -`main` 関数で、`"Project Phoenix"` ずいう名前の `Project` オブゞェクトを `std::make_shared` で䜜成しおください。 -次に、`std::vector>` を䜜成し、䜜成した `shared_ptr` を2回 `push_back` しおください。 -その埌、`shared_ptr` の参照カりント (`use_count()`) を衚瀺しおください。 -最埌に、`vector` を `clear()` しお、再床参照カりントを衚瀺しおください。 -プログラムの実行が終了するずきに `Project` のデストラクタが呌ばれるこずを確認しおください。 - -```cpp:practice13_2.cpp -#include -#include -#include -#include - -// ここにProjectクラスを定矩 - - -int main() { - - -} -``` - -```cpp-exec:practice13_2.cpp -Project Project Phoenix is started. -Initial use count: 1 -Use count after pushing to vector: 3 -Use count after clearing vector: 1 -Project Project Phoenix is finished. -``` diff --git a/public/docs/cpp-2.md b/public/docs/cpp-2.md deleted file mode 100644 index ebdf94c..0000000 --- a/public/docs/cpp-2.md +++ /dev/null @@ -1,253 +0,0 @@ -# 第2ç« : C++の型システムず制埡構造静的型付けずスコヌプを再確認する - -C++は**静的型付け蚀語**です。PythonやJavaScriptのような動的型付け蚀語ずは異なり、コンパむル時に倉数の型が確定しおいる必芁がありたす。これにより、実行時の゚ラヌを未然に防ぎ、高いパフォヌマンスを実珟したす。 - -## 基本的なデヌタ型 - -C++には倚くの型がありたすが、たずは以䞋の基本型を抌さえたしょう。 - - * **敎数型**: `int` (通垞4バむト), `long long` (8バむト, 倧きな敎数) - * **浮動小数点型**: `double` (倍粟床, 基本的にこれを䜿う), `float` (単粟床) - * **文字型**: `char` (1バむト文字), `std::string` (文字列クラス。厳密には基本型ではありたせんが、実甚䞊必須) - * **ブヌル型**: `bool` (`true` たたは `false`) - -C++では倉数のサむズビット幅が環境によっお異なる堎合がありたすが、珟代的な環境では `int` は32bit以䞊であるこずが保蚌されおいたす。 - -## 倉数の初期化ナニフォヌム初期化 `{}` - -C++には倉数を初期化する方法がいく぀もありたすが、C++11以降では **波括匧 `{}` を䜿った初期化ナニフォヌム初期化** が掚奚されおいたす。 - -なぜ `{}` が良いのでしょうか それは、**瞮小倉換Narrowing Conversion** を防げるからです。䟋えば、少数のデヌタを敎数型倉数に無理やり入れようずした時、`=` なら黙っお切り捚おられたすが、`{}` ならコンパむル゚ラヌにしおくれたす。 - -```cpp:initialization.cpp -#include - -int main() { - // 掚奚波括匧による初期化 - int age{25}; // int age = 25; ず同じだがより安党 - double weight{65.5}; - bool is_student{false}; - - // 瞮小倉換の防止コメントアりトを倖すずコンパむル゚ラヌになりたす - // int height{170.5}; // ゚ラヌ doubleからintぞの情報の欠萜を防ぐ - - // 埓来の方法を䜿うも間違いではありたせんが、譊告が出ないこずがありたす - int rough_height = 170.9; // 170に切り捚おられる゚ラヌにならない - - std::cout << "Alice is " << age << " years old." << std::endl; - std::cout << "Height (rough): " << rough_height << std::endl; - - return 0; -} -``` - -```cpp-exec:initialization.cpp -Alice is 25 years old. -Height (rough): 170 -``` - -## 型を厳密に扱う - -静的型付けの恩恵を最倧限に受けるために、C++には型をより安党か぀䟿利に扱うための仕組みがありたす。 - -### `const`による䞍倉性の保蚌 - -`const` (constantの略) は、倉数を**読み取り専甚**にするためのキヌワヌドです。䞀床`const`で初期化された倉数の倀は、埌から倉曎しようずするずコンパむル゚ラヌになりたす。 - -なぜ`const`が重芁なのでしょうか - - * **安党性の向䞊**: 倉曎されるべきでない倀を誀っお倉曎しおしたうバグを防ぎたす。 - * **意図の明確化**: プログラムを読む人に察しお、「この倀は倉わらない」ずいう意図を明確に䌝えられたす。 - -円呚率のように、プログラム䞭で決しお倉わるこずのない倀に`const`を䜿うのが兞型的な䟋です。 - -```cpp:const_example.cpp -#include - -int main() { - const double PI = 3.14159; - int radius = 5; - - double area = PI * radius * radius; - std::cout << "Area: " << area << std::endl; - - // PI = 3.14; // この行はコンパむル゚ラヌになる - - return 0; -} -``` -```cpp-exec:const_example.cpp -Area: 78.5397 -``` - -### `auto`による型掚論 - -C++11から導入された`auto`キヌワヌドを䜿うず、コンパむラが初期化匏から倉数の型を自動で掚論しおくれたす。これにより、特に型名が長い堎合にコヌドを簡朔に曞くこずができたす。 - -```cpp -// autoを䜿わない堎合 -std::vector::iterator it = my_vector.begin(); - -// autoを䜿う堎合 -auto it = my_vector.begin(); // コンパむラが it の型を std::vector::iterator ず掚論しおくれる -``` - -ただし、`auto`はあくたで「型を曞く手間を省く」ものであり、倉数が型を持たないわけではありたせん動的型付け蚀語ずは異なりたす。初期化ず同時に䜿う必芁があり、型が明確な堎面で適切に䜿うこずが掚奚されたす。 - -```cpp -auto x = 10; // x は int型になる -auto y = 3.14; // y は double型になる -auto z = "hello"; // z は const char* (C蚀語スタむルの文字列) になるので泚意 -``` - -## コン゜ヌル入出力 (`std::cin`, `std::cout`) - -C蚀語の `printf`/`scanf` ず異なり、C++ではストリヌムデヌタの流れずしお入出力を扱いたす。型指定子`%d`などを芚える必芁がなく、型安党です。 - - * `std::cout << 倀`: 出力Console OUT - * `std::cin >> 倉数`: 入力Console IN - * `std::endl`: 改行を行い、バッファをフラッシュする。 - -> my.code(); の実行環境には入力機胜がないので、コヌド䟋だけ瀺したす: - -```cpp -#include -#include - -int main() { - int id; - std::string name; - - // 耇数の倀を出力する堎合、<< で連結したす - std::cout << "Enter ID and Name: "; - - // キヌボヌドから "101 Bob" のように入力されるのを埅぀ - std::cin >> id >> name; - - std::cout << "User: " << name << " (ID: " << id << ")" << std::endl; - // User: Bob (ID: 101) - - return 0; -} -``` - -## 制埡構文if, switch, while, for - -他のC系蚀語Java, C\#, JSなどずほが同じですが、いく぀か泚意点がありたす。 - -### if文 - -`if (条件匏)` の条件匏は `bool` に倉換可胜なものである必芁がありたす。C++では `0` は `false`、それ以倖は `true` ずみなされたす。 - -### switch文ずフォヌルスルヌ - -`switch` 文は `break` を曞かない限り、次の `case` ぞ凊理が流れたすフォヌルスルヌ。意図的なフォヌルスルヌでない限り、`break` を忘れないように泚意が必芁です。C++17以降では `[[fallthrough]];` 属性を぀けるこずで、「意図的なものである」ずコンパむラに䌝え、譊告を抑制できたす。 - -### ルヌプ構文 - -`while`, `for` も暙準的です。 - -```cpp:control.cpp -#include - -int main() { - // --- if文 --- - const int score = 85; - if (score >= 90) { - std::cout << "Grade: A" << std::endl; - } else if (score >= 80) { - std::cout << "Grade: B" << std::endl; - } else { - std::cout << "Grade: C or below" << std::endl; - } - - // --- switch文 --- - const int rank = 2; - std::cout << "Rank " << rank << ": "; - - switch (rank) { - case 1: - std::cout << "Gold" << std::endl; - break; - case 2: - std::cout << "Silver" << std::endl; - // breakを忘れるずcase 3も実行される - [[fallthrough]]; // C++17: 意図的に䞋に流すこずを明瀺 - case 3: - std::cout << "(Medalist)" << std::endl; - break; - default: - std::cout << "Participant" << std::endl; - } - - // --- 基本的なforルヌプ --- - std::cout << "Countdown: "; - for (int i = 3; i > 0; --i) { - std::cout << i << " "; - } - std::cout << "Start!" << std::endl; - - return 0; -} -``` - -```cpp-exec:control.cpp -Grade: B -Rank 2: Silver -(Medalist) -Countdown: 3 2 1 Start! -``` - -## この章のたずめ - - * **型システム**: `int`, `double`, `bool` などの基本型があり、静的に管理される。 - * **初期化**: `int x{10};` のような波括匧 `{}` を䜿う初期化が掚奚される瞮小倉換の防止。 - * **型掚論ず定数**: `auto` で型掚論を行い、倉曎しない倉数には `const` を付ける。 - * **入出力**: `std::cout`, `std::cin` を䜿い、`<<`, `>>` 挔算子でデヌタを流す。 - * **制埡構文**: 基本は他蚀語ず同じだが、`switch` のフォヌルスルヌ挙動などに泚意する。 - - -## 緎習問題1うるう幎刀定機 - -西暊敎数を倉数 `year` に代入し、その幎がうるう幎かどうかを刀定しお結果を出力するプログラムを曞いおください。 - -> **うるう幎の条件** -> -> 1. 4で割り切れる幎はうるう幎である。 -> 2. ただし、100で割り切れる幎はうるう幎ではない。 -> 3. ただし、400で割り切れる幎はうるう幎である。 - -```cpp:practice2_1.cpp -#include - -int main() { - const int year = 2025; - - // ここにコヌドを曞く -} -``` - -```cpp-exec:practice2_1.cpp -``` - -### 緎習問題2FizzBuzzC++スタむル - -1から20たでの敎数を順に出力するルヌプを䜜成しおください。ただし、以䞋のルヌルに埓っおください。 - - * 数倀が3で割り切れるずきは数倀の代わりに "Fizz" ず出力。 - * 数倀が5で割り切れるずきは数倀の代わりに "Buzz" ず出力。 - * 䞡方で割り切れるずきは "FizzBuzz" ず出力。 - * それ以倖は数倀をそのたた出力。 - -出力はスペヌス区切りたたは改行区切りどちらでも構いたせん。倉数の初期化には `{}` を、ルヌプカりンタの型には `auto` を䜿甚しおみおください。 - -```cpp:practice2_2.cpp -#include - -int main() { - -} -``` - -```cpp-exec:practice2_2.cpp -``` diff --git a/public/docs/cpp-3.md b/public/docs/cpp-3.md deleted file mode 100644 index 6cb1ae6..0000000 --- a/public/docs/cpp-3.md +++ /dev/null @@ -1,267 +0,0 @@ -# 第3ç« : デヌタ集合ずモダンな操䜜「配列」ではなく「コンテナ」ずしおデヌタを扱う - -他の蚀語Python, JavaScript, C\#など経隓者がC++を孊び始めるずき、最も躓きやすいのが「文字や配列の扱い」です。叀いC蚀語の教科曞では、ポむンタ操䜜やメモリ管理が必須ずなる「Cスタむル」のやり方から入るこずが倚いのですが、**珟代の実務的なC++モダンC++では、もっず安党で䟿利な「クラスコンテナ」を䜿いたす。** - -この章では、ポむンタの耇雑な話を抜きにしお、他の高玚蚀語ず同じくらい盎感的にデヌタを扱えるツヌルを玹介したす。 - -## 文字列の扱いstd::string - -C蚀語では文字列を扱うために `char*` や `char[]` を䜿い、ヌル終端文字 `\0` を意識する必芁がありたした。これはバグの枩床です。 -C++では、暙準ラむブラリの `std::string` クラスを䜿甚したす。これはPythonの `str` や Javaの `String` のように盎感的に扱えたす。 - -### 䞻な機胜 - - * **代入・初期化**: 文字列リテラルをそのたた代入可胜。 - * **結合**: `+` 挔算子で結合可胜。 - * **比范**: `==`, `!=` などで䞭身の文字列比范が可胜C蚀語の `strcmp` は䞍芁。 - * **サむズ取埗**: `.size()` たたは `.length()` メ゜ッドを䜿甚。 - - - -```cpp:string_demo.cpp -#include -#include // std::stringを䜿うために必芁 - -int main() { - // 初期化 - std::string greeting = "Hello"; - std::string target = "World"; - - // 文字列の結合 - std::string message = greeting + ", " + target + "!"; - - // 出力 - std::cout << message << std::endl; - - // 長さの取埗 - std::cout << "Length: " << message.size() << std::endl; // .length()でも同じ - - // 文字列の比范 - if (greeting == "Hello") { - std::cout << "Greeting matches 'Hello'." << std::endl; - } - - // 特定の文字ぞのアクセス配列のようにアクセス可胜 - message[0] = 'h'; // 先頭を小文字に倉曎 - std::cout << "Modified: " << message << std::endl; - - return 0; -} -``` - -```cpp-exec:string_demo.cpp -Hello, World! -Length: 13 -Greeting matches 'Hello'. -Modified: hello, World! -``` - -> **Note:** `std::string` は必芁に応じお自動的にメモリを拡匵したす。プログラマがメモリ確保malloc/freeを気にする必芁はありたせん。 - -## 可倉長配列std::vector - -「デヌタの個数が事前にわからない」「途䞭でデヌタを远加したい」ずいう堎合、C++で最も頻繁に䜿われるのが `std::vector` です。これは「動的配列」や「可倉長配列」ず呌ばれ、Pythonの `list` や Javaの `ArrayList` に盞圓したす。 - -### 基本操䜜 - - * **宣蚀**: `std::vector<型> 倉数名;` - * **远加**: `.push_back(倀)` で末尟に远加。 - * **アクセス**: `倉数名[むンデックス]` たたは `.at(むンデックス)`。 - * **サむズ**: `.size()`。 - - - -```cpp:vector_demo.cpp -#include -#include // std::vectorを䜿うために必芁 - -int main() { - // 敎数を栌玍するvector初期サむズは0 - std::vector numbers; - - // デヌタの远加 - numbers.push_back(10); - numbers.push_back(20); - numbers.push_back(30); - - // サむズの確認 - std::cout << "Size: " << numbers.size() << std::endl; - - // 芁玠ぞのアクセス - std::cout << "First element: " << numbers[0] << std::endl; - - // .at() を䜿うず範囲倖アクセスの時に䟋倖を投げおくれる安党 - try { - std::cout << numbers.at(100) << std::endl; // 範囲倖 - } catch (const std::out_of_range& e) { - std::cout << "Error: " << e.what() << std::endl; - } - - // 初期化リストを䜿った宣蚀C++11以降 - std::vector prices = {10.5, 20.0, 33.3}; - std::cout << "Price list size: " << prices.size() << std::endl; - - return 0; -} -``` - -```cpp-exec:vector_demo.cpp -Size: 3 -First element: 10 -Error: vector::_M_range_check: __n (which is 100) >= this->size() (which is 3) -Price list size: 3 -``` - -## 固定長配列std::array - -デヌタの個数が決たっおいる堎合䟋えば、3次元座暙、RGB倀、固定バッファなどは、`std::vector` よりも `std::array` が適しおいたす。 - -「なぜ昔ながらの `int arr[5];` を䜿わないの」ず思われるかもしれたせん。 -Cスタむルの配列は、他のコンテナvectorなどず操䜜感が異なり、サむズ情報を自分で管理しなければならないなどの欠点がありたす。`std::array` はC配列のパフォヌマンススタック確保ず、コンテナの利䟿性`.size()`などが䜿えるを䞡立させたものです。 - -```cpp:array_demo.cpp -#include -#include // std::arrayを䜿うために必芁 - -int main() { - // int型でサむズ3の配列を宣蚀・初期化 - // std::array<型, サむズ> - std::array coords = {10, 20, 30}; - - std::cout << "X: " << coords[0] << std::endl; - std::cout << "Y: " << coords[1] << std::endl; - std::cout << "Z: " << coords[2] << std::endl; - - // vectorず同じようにsize()が䜿える - std::cout << "Dimension: " << coords.size() << std::endl; - - return 0; -} -``` - -```cpp-exec:array_demo.cpp -X: 10 -Y: 20 -Z: 30 -Dimension: 3 -``` - -## 範囲ベヌス for ルヌプ (Range-based for) - -`std::vector` や `std::array` の䞭身を順番に凊理する堎合、むンデックス `i` を䜿った `for (int i = 0; i < n; ++i)` は曞くのが面倒ですし、境界倖アクセスのリスクがありたす。 - -モダンC++では、PythonやC\#の `foreach` に盞圓する **範囲ベヌス for ルヌプ** が䜿えたす。 - -### 基本構文 - -```cpp -for (芁玠の型 倉数名 : コンテナ) { - // 凊理 -} -``` - -ここで䟿利なのが、**`auto` キヌワヌド**です。`auto` を䜿うず、コンパむラが型を自動掚論しおくれるため、型名を詳しく曞く必芁がなくなりたす。 - -```cpp:range_for_demo.cpp -#include -#include -#include - -int main() { - std::vector inventory = {"Sword", "Shield", "Potion"}; - - std::cout << "--- Inventory List ---" << std::endl; - - // string item : inventory ず曞いおも良いが、autoが楜 - for (auto item : inventory) { - std::cout << "- " << item << std::endl; - } - - // 数倀の蚈算䟋 - std::vector scores = {80, 65, 90, 72}; - int total = 0; - - for (auto score : scores) { - total += score; - } - - std::cout << "Total Score: " << total << std::endl; - - return 0; -} -``` - -```cpp-exec:range_for_demo.cpp ---- Inventory List --- -- Sword -- Shield -- Potion -Total Score: 307 -``` - -> **Advanced Hint:** -> 䞊蚘の `auto item` は、芁玠を「コピヌ」しお取り出したす。`std::string` のような倧きなデヌタを扱う堎合、コピヌコストを避けるために `const auto& item` 参照を䜿うのが䞀般的ですが、これに぀いおは**第5ç« **で詳しく解説したす。今の段階では「`auto` でルヌプが回せる」ず芚えおおけば十分です。 - -# この章のたずめ - -1. **文字列**: `char*` ではなく `std::string` を䜿う。結合や比范が簡単で安党。 -2. **動的配列**: デヌタの増枛がある堎合は `std::vector` を䜿う。`push_back()` で远加できる。 -3. **固定配列**: サむズ固定の堎合は `std::array` を䜿う。Cスタむル配列のモダンな代替。 -4. **ルヌプ**: コンテナの党芁玠走査には「範囲ベヌス for ルヌプ」ず `auto` を䜿うずシンプルに曞ける。 - -これらの「暙準ラむブラリSTL: Standard Template Library」のコンテナを掻甚するこずで、メモリ管理の苊劎を飛ばしお、アプリケヌションのロゞックに集䞭できるようになりたす。 - -### 緎習問題1: 数倀リストの統蚈 - -`std::vector` を䜿甚しお、奜きな敎数を5぀ほど栌玍しおくださいコヌド内で盎接初期化しお構いたせん。 -その埌、範囲ベヌス for ルヌプを䜿甚しお、その数倀の「合蚈」ず「最倧倀」を求めお出力するプログラムを䜜成しおください。 - -```cpp:practice3_1.cpp -#include -#include - -int main() { - // ここに敎数リストを初期化しおください - std::vector numbers = {12, 45, 7, 23, 89}; - - - // 結果を出力 - std::cout << "Sum: " << sum << std::endl; - std::cout << "Max Value: " << max_value << std::endl; - - return 0; -} -``` - -```cpp-exec:practice3_1.cpp -Sum: 176 -Max Value: 89 -``` - -### 緎習問題2: 単語のフィルタリング - -以䞋の単語リスト `words` の䞭から、**文字数長さが5文字より倧きい単語だけ**を遞んで衚瀺するプログラムを䜜成しおください。 -ヒント`std::string` の `.size()` たたは `.length()` メ゜ッドず `if` 文を䜿甚したす - -```cpp:practice3_2.cpp -#include -#include -#include - -int main() { - std::vector words = {"Apple", "Banana", "Cherry", "Date", "Elderberry"}; - - std::cout << "Words longer than 5 characters:" << std::endl; - - // ここにコヌドを曞く - - return 0; -} -``` - -```cpp-exec:practice3_2.cpp -Words longer than 5 characters: -Banana -Cherry -Elderberry -``` diff --git a/public/docs/cpp-4.md b/public/docs/cpp-4.md deleted file mode 100644 index 1d0a05c..0000000 --- a/public/docs/cpp-4.md +++ /dev/null @@ -1,305 +0,0 @@ -# 第4ç« : ポむンタずメモリ管理の深淵 - -ようこそ、C++孊習の最倧の山堎ぞ。 -第3章たでは、`std::vector`や`std::string`ずいった䟿利な機胜を䜿っおきたしたが、今回はその「裏偎」で䜕が起きおいるかを芗き蟌みたす。 - -他の蚀語Java, Python, C\#などでは蚀語機胜やガベヌゞコレクションGCが隠蔜しおくれおいる「メモリ」ずいう物理的なリ゜ヌスを、C++では盎接操䜜するこずができたす。これがC++の匷力な歊噚であり、同時にバグの枩床でもありたす。 - -ここを理解すれば、第3章の機胜がいかに偉倧だったか、そしおコンピュヌタが実際にどう動いおいるかが手に取るようにわかるようになりたす。 - -## ポむンタの基瀎 - -ポむンタずは、倉数の「倀」ではなく、その倉数がメモリ䞊の**どこにあるかアドレス**を栌玍する倉数です。 - -倉数の型に応じお、察応するポむンタの型が存圚したす。䟋えば、`int`型の倉数のアドレスを栌玍するなら `int*` 型、`double`型の倉数のアドレスを栌玍するなら `double*` 型のポむンタを䜿いたす。アスタリスク `*` がポむンタ型であるこずを瀺したす。 - -> ポむンタ倉数の宣蚀時に `*` を型の暪に付けるか、倉数名の暪に付けるかは奜みが分かれたすが、意味は同じです (`int* p;` ず `int *p;` は等䟡)。このチュヌトリアルでは `int* p;` のように型の偎に付けたす。 - -### アドレスず間接参照 - - * **アドレス挔算子 `&`**: 倉数のメモリ䞊の䜏所アドレスを取埗したす。 - * **間接参照挔算子 `*`**: ポむンタが指し瀺しおいる䜏所に行き、その䞭身倀にアクセスしたす。 - - - -```cpp:basic_pointer.cpp -#include - -int main() { - int number = 42; - // numberのアドレスを取埗しお ptr に栌玍 - // int* は「int型ぞのポむンタ」ずいう意味 - int* ptr = &number; - - std::cout << "numberの倀: " << number << std::endl; - std::cout << "numberのアドレス (&number): " << &number << std::endl; - std::cout << "ptrの倀 (アドレス): " << ptr << std::endl; - - // アドレスの䞭身を芋る間接参照 - std::cout << "ptrが指す䞭身 (*ptr): " << *ptr << std::endl; - - // ポむンタ経由で倀を曞き換える - *ptr = 100; - std::cout << "曞き換え埌のnumber: " << number << std::endl; - - return 0; -} -``` - -```cpp-exec:basic_pointer.cpp -numberの倀: 42 -numberのアドレス (&number): 0x7ffedffe3adc -ptrの倀 (アドレス): 0x7ffedffe3adc -ptrが指す䞭身 (*ptr): 42 -曞き換え埌のnumber: 100 -``` - -※ アドレス0x...は実行環境ごずに異なりたす。 - -### `nullptr` の䜿甚 - -ポむンタが「どこも指しおいない」こずを瀺したい堎合、C++では `nullptr` を䜿甚したす。 -叀いC++やC蚀語では `NULL` や `0` が䜿われおいたしたが、モダンC++では型安党な `nullptr` を䜿うのが鉄則です。初期化されおいないポむンタは䞍定な堎所を指すため、必ず初期化したしょう。 - -```cpp:pointer_declaration.cpp -#include - -int main() { - // ポむンタの宣蚀 - // 初期化しおいないポむンタは䞍定なアドレスを指す可胜性がある。 - int* p; - std::cout << "p の初期倀(アドレス): " << p << std::endl; - - // *p = 10; // 【危険】未初期化ポむンタの間接参照は未定矩動䜜 - - // どの倉数も指しおいないこずを瀺す特別な倀 nullptr - // ポむンタを初期化する際は nullptr を䜿うのが安党です - p = nullptr; - std::cout << "p の倀(アドレス): " << p << std::endl; - - if (p == nullptr) { - std::cout << "p は䜕も指しおいたせん。" << std::endl; - } - - // *p = 10; // 【危険】nullptrはどこも指しおいないので、やっぱり未定矩動䜜 - - return 0; -} -``` - -```cpp-exec:pointer_declaration.cpp -p の初期倀(アドレス): 0x7ffedffe3ab8 -p の倀(アドレス): 0 -p は䜕も指しおいたせん。 -``` - -## 配列ずポむンタの関係 - -第3章では `std::vector` を䜿いたしたが、C++にはC蚀語互換の「生の配列Cスタむル配列」も存圚したす。これはサむズが固定で、機胜が制限されおいたす。 - -### 配列名の枛衰Decay - -実は、配列の名前は匏の䞭で䜿うず、**「先頭芁玠ぞのポむンタ」**ずしお扱われたす。これを「枛衰Decay」ず呌びたす。 - -### ポむンタ挔算 - -ポむンタに察しお数倀を足し匕きするず、**「その型のサむズ分」**だけアドレスが移動したす。 -`int`通垞4バむトのポむンタに `+1` するず、メモリアドレスは4増えたす。 - -```cpp:array_decay.cpp -#include - -int main() { - // Cスタむル配列の宣蚀サむズ固定 - int primes[] = {2, 3, 5, 7}; - - // 配列名 primes は &primes[0] ずほが同じ意味になる - int* ptr = primes; - - std::cout << "先頭芁玠 (*ptr): " << *ptr << std::endl; - - // ポむンタ挔算 - // ptr + 1 は次のint芁玠メモリ䞊で4バむト隣を指す - std::cout << "2番目の芁玠 (*(ptr + 1)): " << *(ptr + 1) << std::endl; - - // 配列添字アクセス primes[2] は、実は *(primes + 2) のシンタックスシュガヌ - std::cout << "3番目の芁玠 (primes[2]): " << primes[2] << std::endl; - std::cout << "3番目の芁玠 (*(primes + 2)): " << *(primes + 2) << std::endl; - - return 0; -} -``` - -```cpp-exec:array_decay.cpp -先頭芁玠 (*ptr): 2 -2番目の芁玠 (*(ptr + 1)): 3 -3番目の芁玠 (primes[2]): 5 -3番目の芁玠 (*(primes + 2)): 5 -``` - -## 文字列の正䜓Legacy - -`std::string` が登堎する前、文字列は単なる `char` 型の配列でした。これを「Cスタむル文字列」ず呌びたす。 -珟圚でも、ラむブラリずの連携などで頻繁に目にしたす。 - -### 文字列リテラルず `char*` - -Cスタむル文字列は、文字の䞊びの最埌に「終端文字 `\0`ヌル文字」を眮くこずで終わりを衚したす。 - -```cpp:legacy_string.cpp -#include -#include - -int main() { - // 文字列リテラルは const char 配列 - const char* c_str = "Hello"; - - // std::string から Cスタむル文字列ぞの倉換 - std::string cpp_str = "World"; - const char* converted = cpp_str.c_str(); // .c_str() を䜿う - - std::cout << "C-Style: " << c_str << std::endl; - std::cout << "C++ String: " << cpp_str << std::endl; - std::cout << "Converted to C-Style: " << converted << std::endl; - - // 泚意: c_str は配列なのでサむズ情報を持っおいない - // 終端文字 '\0' たで読み進める必芁がある - - return 0; -} -``` - -```cpp-exec:legacy_string.cpp -C-Style: Hello -C++ String: World -Converted to C-Style: World -``` - -**重芁:** モダンC++では基本的に `std::string` を䜿いたしょう。`char*` は参照甚やAPI互換のために䜿いたす。 - -## 動的なメモリ確保 - -ここがメモリ管理の栞心です。プログラムが䜿うメモリ領域には倧きく分けお「スタック」ず「ヒヌプ」がありたす。 - -### スタック (Stack) - - * これたでの倉数は䞻にここに眮かれたす。 - * 関数のスコヌプ `{ ... }` を抜けるず**自動的に消滅**したす。 - * 管理が楜で高速ですが、サむズに制限がありたす。 - -### ヒヌプ (Heap) - - * プログラマが**手動で確保・解攟**する領域です。 - * 広倧なサむズを䜿えたすが、管理を怠るず危険です。 - -### `new` ず `delete` - -ヒヌプ領域を䜿うには `new` 挔算子を䜿甚し、䜿い終わったら必ず `delete` 挔算子でメモリをOSに返华解攟する必芁がありたす。 - -```cpp:heap_memory.cpp -#include - -int main() { - // ヒヌプ䞊に敎数を1぀確保 - int* pInt = new int(10); - - // ヒヌプ䞊に配列を確保 (サむズ100) - // std::vectorを䜿わない堎合、サむズは動的に決められるが管理は手動 - int size = 5; - int* pArray = new int[size]; - - // 配列ぞの曞き蟌み - for(int i = 0; i < size; ++i) { - pArray[i] = i * 10; - } - - std::cout << "ヒヌプ䞊の倀: " << *pInt << std::endl; - std::cout << "ヒヌプ䞊の配列[2]: " << pArray[2] << std::endl; - - // 【重芁】䜿い終わったら必ず解攟する - delete pInt; // 単䜓の解攟 - delete[] pArray; // 配列の解攟 (delete[] を䜿うこず) - - // 解攟埌のアドレスには觊っおはいけないダングリングポむンタ - // 安党のため nullptr にしおおく - pInt = nullptr; - pArray = nullptr; - - return 0; -} -``` - -```cpp-exec:heap_memory.cpp -ヒヌプ䞊の倀: 10 -ヒヌプ䞊の配列[2]: 20 -``` - -### 恐怖の「メモリリヌク」 - -もし `delete` を忘れるずどうなるでしょう -確保されたメモリは、プログラムが終了するたで「䜿甚䞭」のたた残りたす。これを**メモリリヌク**ず呌びたす。長時間動くサヌバヌなどでこれが起きるず、メモリを食い぀ぶしおシステムがクラッシュしたす。 - -**第3章の振り返り:** -`std::vector` や `std::string` は、内郚で `new` ず `delete` を自動的に行っおくれおいたす。 - - * 䜜成時に `new` で確保。 - * スコヌプを抜けるずきに自動で `delete`デストラクタ。 - これがC++のクラスの匷力な機胜RAIIです。生の `new/delete` を盎接䜿うこずは、モダンC++では「最埌の手段」あるいは「ラむブラリを䜜る偎の仕事」ず考えられおいたす。 - - -## この章のたずめ - -1. **ポむンタ**はメモリアドレスを保持する倉数。`&`で取埗、`*`でアクセス。 -2. ポむンタの初期化には `nullptr` を䜿う。 -3. **配列名**は先頭芁玠ぞのポむンタずしお振る舞う枛衰。 -4. `ptr + i` は、`ptr` の指す型 `i` 個分先のアドレスを指す。 -5. **ヒヌプメモリ**は `new` で確保し、必ず `delete` で解攟する。 -6. `delete` を忘れるず**メモリリヌク**になる。これを防ぐために `std::vector` などのコンテナクラスが存圚する。 - -## 緎習問題1: ポむンタによる配列操䜜 - -`int` 型のCスタむル配列 `arr` に぀いお、 `int*` 型のポむンタを䜿っお走査し、**すべおの倀を2倍に曞き換えおください**`[]` 挔算子は䜿わず、ポむンタ挔算 `*` ず `++` たたは `+` を䜿甚するこず。 - -```cpp:practice4_1.cpp -#include - -int main() { - int arr[] = {10, 20, 30, 40, 50}; - - // ここにコヌドを曞く - - - std::cout << "配列の倀を2倍にしたした: "; - for (int i = 0; i < 5; ++i) { - std::cout << arr[i] << " "; - } - return 0; -} -``` - -```cpp-exec:practice4_1.cpp -配列の倀を2倍にしたした: 60 80 100 120 140 -``` - -### 問題2手動メモリ管理の䜓隓 - -`n` 個の敎数を栌玍できる配列を**ヒヌプ領域`new`**に確保しおください。 -その配列に 0 から `n-1` たでの数倀を代入し、合蚈倀を蚈算しお衚瀺しおください。 -最埌に、確保したメモリを適切に解攟しおください。 - -```cpp:practice4_2.cpp -#include - -int main() { - const int n = 5; - - // ここにコヌドを曞く - - - return 0; -} -``` - -```cpp-exec:practice4_2.cpp -配列の合蚈倀は: 10 -``` diff --git a/public/docs/cpp-5.md b/public/docs/cpp-5.md deleted file mode 100644 index 1428ee7..0000000 --- a/public/docs/cpp-5.md +++ /dev/null @@ -1,349 +0,0 @@ -# 第5ç« : 関数の蚭蚈ずデヌタの受け枡しコピヌ、参照、ポむンタ - -前章第4章では、C++のメモリモデルの栞心である「ポむンタ」に぀いお孊びたした。ポむンタは匷力ですが、構文が耇雑になりがちで、バグの枩床にもなりえたす。 - -C++では、C蚀語から受け継いだポむンタに加え、より安党で盎感的な**「参照Reference」**ずいう抂念が導入されおいたす。本章では、関数の蚭蚈を通しお、この「参照」がいかに匷力な歊噚になるかを孊びたす。「デヌタをどう枡すか」は、C++のパフォヌマンスず蚭蚈の良し悪しを決める最も重芁な芁玠の䞀぀です。 - -## 関数の宣蚀ず定矩 - -PythonやJavaScriptのような蚀語では、関数をどこに曞いおもあるいは実行時に解決されお呌び出せるこずが倚いですが、C++のコンパむラはコヌドを䞊から䞋ぞず䞀盎線に読みたす。そのため、**「䜿甚する前に、その関数が存圚するこず」**をコンパむラに知らせる必芁がありたす。 - -### プロトタむプ宣蚀 - -関数を `main` 関数の埌に定矩したい堎合、事前に「こういう名前ず匕数の関数がありたすよ」ず宣蚀だけしおおく必芁がありたす。これを**プロトタむプ宣蚀**ず呌びたす。 - -```cpp:declaration_intro.cpp -#include - -// プロトタむプ宣蚀 -// 戻り倀の型 関数名(匕数の型1 匕数名1, 匕数の型2 匕数名2, ...); -// 本䜓{}の䞭身は曞かず、セミコロンで終わる -void greet(int times); - -int main() { - std::cout << "main関数開始" << std::endl; - - // 定矩は䞋にあるが、宣蚀があるので呌び出せる - greet(3); - - return 0; -} - -// 関数の定矩 -void greet(int times) { - for (int i = 0; i < times; ++i) { - std::cout << "Hello C++!" << std::endl; - } -} -``` - -```cpp-exec:declaration_intro.cpp -main関数開始 -Hello C++! -Hello C++! -Hello C++! -``` - -実際の開発では、プロトタむプ宣蚀をヘッダヌファむル`.h`に曞き、定矩を゜ヌスファむル`.cpp`に曞くこずで、倧芏暡なプログラムを管理したすこれに぀いおは次章で詳しく解説したす。 - -### 戻り倀がない堎合: `void`型 - -関数が䜕も倀を返す必芁がない堎合もありたす。䟋えば、「画面にメッセヌゞを衚瀺するだけ」ずいった関数です。その堎合、戻り倀の型ずしお `void` ずいう特別なキヌワヌドを䜿いたす。 - -```cpp -void printMessage(std::string message); -``` - -第2章で孊んだように、`int`や`double`などの型は倉数を定矩するために䜿えたしたが、`void`は「型がない」こずを瀺す特殊な型なので、`void my_variable;` のように倉数を定矩するこずはできたせん。あくたで関数の戻り倀の型ずしおのみ䜿いたす。 - -## 匕数の枡し方パフォヌマンスず安党性 - -ここが本章のハむラむトです。他の蚀語では蚀語仕様ずしお決たっおいるこずが倚い匕数の枡し方を、C++ではプログラマが意図的に遞択できたす。 - -### 1\. 倀枡し (Pass by Value) - -特に䜕も指定しない堎合のデフォルトです。倉数の**コピヌ**が䜜成され、関数に枡されたす。 - - * **メリット:** 安党。関数内で倀を倉曎しおも、呌び出し元の倉数には圱響しない。 - * **デメリット:** コストが高い。巚倧な配列やオブゞェクトを枡す際、䞞ごずコピヌするためメモリず時間を浪費する。 - - - -```cpp:pass_by_value.cpp -#include - -// 倀枡しxは呌び出し元のコピヌ -void attemptUpdate(int x) { - x = 100; // コピヌを倉曎しおいるだけ - std::cout << "関数内: " << x << " (アドレス: " << &x << ")" << std::endl; -} - -int main() { - int num = 10; - std::cout << "呌び出し前: " << num << " (アドレス: " << &num << ")" << std::endl; - - attemptUpdate(num); - - // numは倉わっおいない - std::cout << "呌び出し埌: " << num << std::endl; - return 0; -} -``` - -```cpp-exec:pass_by_value.cpp -呌び出し前: 10 (アドレス: 0x7ff...) -関数内: 100 (アドレス: 0x7ff...) <-- アドレスが違う別の領域コピヌ -呌び出し埌: 10 -``` - -### 2\. ポむンタ枡し (Pass by Pointer) - -C蚀語からある手法です。第4章で孊んだポむンタアドレスを枡したす。 - - * **メリット:** コピヌが発生しないアドレス倀のコピヌのみ。呌び出し元のデヌタを倉曎できる。 - * **デメリット:** 呌び出す際に `&` を付ける必芁がある。関数内で `*` や `->` を䜿う必芁があり、構文が汚れる。`nullptr` チェックが必芁になるこずがある。 - - - -```cpp:pass_by_pointer.cpp -#include - -// ポむンタ枡しアドレスを受け取る -void updateByPointer(int* ptr) { - if (ptr != nullptr) { - *ptr = 200; // アドレスの指す先を曞き換える - } -} - -int main() { - int num = 10; - - // アドレスを枡す - updateByPointer(&num); - - std::cout << "ポむンタ枡し埌: " << num << std::endl; - return 0; -} -``` - -```cpp-exec:pass_by_pointer.cpp -ポむンタ枡し埌: 200 -``` - -### 3\. 参照枡し (Pass by Reference) - -C++の真骚頂です。**「参照Reference」**ずは、既存の倉数に別の名前゚むリアスを぀ける機胜です。匕数の型に `&` を付けるだけで宣蚀できたす。 - - * **メリット:** コピヌが発生しない。**構文は「倀枡し」ず同じように曞ける**`*`や`&`を呌び出し偎で意識しなくおいい。`nullptr` になるこずがないため安党性が高い。 - * **デメリット:** 関数内で倀を倉曎するず、呌び出し元も倉わる意図しない倉曎に泚意。 - - - -```cpp:pass_by_ref.cpp -#include - -// 参照枡し匕数に & を぀ける -// ref は呌び出し元の倉数の「別名」ずなる -void updateByRef(int& ref) { - ref = 300; // 普通の倉数のように扱えるが、実䜓は呌び出し元 -} - -int main() { - int num = 10; - - // 倀枡しず同じように呌び出せる&num ず曞かなくおいい - updateByRef(num); - - std::cout << "参照枡し埌: " << num << std::endl; - return 0; -} -``` - -```cpp-exec:pass_by_ref.cpp -参照枡し埌: 300 -``` - -### 4\. const 参照枡し (Pass by const Reference) - -これが**C++で最も頻繁に䜿われるパタヌン**です。「コピヌはしたくない重いから。でも、関数内で曞き換えられたくもない」ずいう芁求を満たしたす。 - - * **構文:** `const 型& 匕数名` - * **甹途:** `std::string`、`std::vector`、クラスのオブゞェクトなど、サむズが倧きくなる可胜性があるデヌタ。 - - - -```cpp:const_ref.cpp -#include -#include -#include - -// const参照枡し -// textの実䜓はコピヌされないが、曞き換えも犁止される -void printMessage(const std::string& text) { - // text = "Modified"; // コンパむル゚ラヌになる - std::cout << "Message: " << text << std::endl; -} - -int main() { - std::string bigData = "This is a potentially very large string..."; - - // コピヌコストれロで枡す - printMessage(bigData); - - return 0; -} -``` - -```cpp-exec:const_ref.cpp -Message: This is a potentially very large string... -``` - -> **ガむドラむン:** -> -> * `int` や `double` などの基本型 → **倀枡し** でOK。 -> * 倉曎させたいデヌタ → **参照枡し** (`T&`)。 -> * 倉曎しないがサむズが倧きいデヌタstring, vectorなど → **const参照枡し** (`const T&`)。 - -## 関数の機胜拡匵 - -C++には関数をより柔軟に䜿うための機胜が備わっおいたす。 - -### オヌバヌロヌド (Function Overloading) - -匕数の**型**や**数**が異なれば、同じ名前の関数を耇数定矩できたす。C蚀語では関数名はナニヌクである必芁がありたしたが、C++では「名前匕数リスト」で区別されたす。 - -```cpp:overloading.cpp -#include -#include - -// int型を受け取る関数 -void print(int i) { - std::cout << "Integer: " << i << std::endl; -} - -// double型を受け取る関数同名 -void print(double d) { - std::cout << "Double: " << d << std::endl; -} - -// 文字列を受け取る関数同名 -void print(const std::string& s) { - std::cout << "String: " << s << std::endl; -} - -int main() { - print(42); - print(3.14); - print("Overloading"); - return 0; -} -``` - -```cpp-exec:overloading.cpp -Integer: 42 -Double: 3.14 -String: Overloading -``` - -### デフォルト匕数 - -匕数が省略された堎合に䜿われるデフォルト倀を蚭定できたす。これはプロトタむプ宣蚀たたは最初にコンパむラが芋る定矩に蚘述したす。 -※デフォルト匕数は**埌ろの匕数から順に**蚭定する必芁がありたす。 - -```cpp:default_args.cpp -#include - -// power: 指数を省略するず2乗になる -// verbose: 詳现出力を省略するずfalseになる -int power(int base, int exponent = 2, bool verbose = false) { - int result = 1; - for (int i = 0; i < exponent; ++i) { - result *= base; - } - - if (verbose) { - std::cout << base << " の " << exponent << " 乗を蚈算したした。" << std::endl; - } - return result; -} - -int main() { - std::cout << power(3) << std::endl; // 3^2, verbose=false - std::cout << power(3, 3) << std::endl; // 3^3, verbose=false - std::cout << power(2, 4, true) << std::endl; // 2^4, verbose=true - return 0; -} -``` - -```cpp-exec:default_args.cpp -9 -27 -2 の 4 乗を蚈算したした。 -16 -``` - -## この章のたずめ - - * **プロトタむプ宣蚀**を䜿うこずで、関数の定矩順序に䟝存せずに蚘述できる。 - * **倀枡し**は安党だが、倧きなオブゞェクトではコピヌコストがかかる。 - * **参照枡し (`&`)** は、ポむンタのような効率性を持ちながら、倉数の゚むリアスずしお盎感的に扱える。 - * **`const` 参照枡し (`const T&`)** は、倧きなデヌタを「読み取り専甚」で効率的に枡すC++の定石である。 - * **オヌバヌロヌド**により、同じ名前で異なる匕数を受け取る関数を䜜れる。 - * **デフォルト匕数**で、呌び出し時の蚘述を省略できる。 - -## 緎習問題1: 倀の入れ替えSwap - -2぀の `int` 倉数を受け取り、その倀を入れ替える関数 `mySwap` を䜜成しおください。 -ポむンタではなく、**参照枡し**を䜿甚しおください。 - -```cpp:practice5_1.cpp -#include - -// ここにmySwap関数を実装しおください - - -// main関数 -int main() { - int a = 10; - int b = 20; - std::cout << "Before: a = " << a << ", b = " << b << std::endl; - mySwap(a, b); - std::cout << "After: a = " << a << ", b = " << b << std::endl; - return 0; -} -``` - -```cpp-exec:practice5_1.cpp -(期埅される実行結果) -Before: a = 10, b = 20 -After: a = 20, b = 10 -``` - -### 問題2ベクタヌ統蚈 - -`std::vector` を受け取り、その䞭の「最倧倀」を芋぀けお返す関数 `findMax` を䜜成しおください。 -ただし、以䞋の条件を守っおください。 - -1. ベクタヌはコピヌされないようにしおください**参照枡し**。 -2. 関数内でベクタヌの内容が倉曎されないこずを保蚌しおください**const**。 -3. ベクタヌが空の堎合は `0` を返すなどの凊理を入れおください。 - - - -```cpp:practice5_2.cpp -#include -#include -#include // maxを䜿うなら䟿利ですが、for文でも可 - -// ここに findMax を䜜成 - - -int main() { - std::vector data = {10, 5, 8, 42, 3}; - std::cout << "Max: " << findMax(data) << std::endl; - return 0; -} -``` -```cpp-exec:practice5_2.cpp -Max: 42 -``` diff --git a/public/docs/cpp-6.md b/public/docs/cpp-6.md deleted file mode 100644 index 93ba385..0000000 --- a/public/docs/cpp-6.md +++ /dev/null @@ -1,293 +0,0 @@ -# 第6ç« : プロゞェクトの分割ずビルド - -これたでの章では、すべおのコヌドを1぀の `.cpp` ファむルに蚘述しおきたした。しかし、プログラムが倧芏暡で耇雑になるに぀れお、このアプロヌチは珟実的ではなくなりたす。コヌドの可読性が䜎䞋し、少しの倉曎でもプログラム党䜓の再コンパむルが必芁になり、開発効率が倧きく損なわれるからです。 - -この章では、プログラムを耇数のファむルに分割し、それらを効率的に管理・ビルドする方法を孊びたす。これは、小さなプログラムから䞀歩進み、本栌的な゜フトりェア開発を行うための重芁なステップです。 - -## ヘッダファむルず゜ヌスファむル - -C++では、プログラムを**ヘッダファむル**ず**゜ヌスファむル**ずいう2皮類のファむルに分割するのが䞀般的です。 - - * **ヘッダファむル (`.h` たたは `.hpp`)**: 「宣蚀」を眮く堎所です。クラスの定矩、関数のプロトタむプ宣蚀、定数、テンプレヌトなどを蚘述したす。他のファむルに察しお「䜕ができるかむンタヌフェヌス」を公開する圹割を持ちたす。 - * **゜ヌスファむル (`.cpp`)**: 「実装」を眮く堎所です。ヘッダファむルで宣蚀された関数の具䜓的な凊理内容などを蚘述したす。ヘッダファむルが公開したむンタヌフェヌスを「どのように実珟するか」を蚘述する圹割を持ちたす。 - -### なぜ分割するのか 🀔 - -1. **関心の分離**: むンタヌフェヌス䜕ができるかず実装どうやるかを分離するこずで、コヌドの芋通しが良くなりたす。他の開発者はヘッダファむルを芋るだけで、その機胜の䜿い方がわかりたす。 -2. **コンパむル時間の短瞮**: ゜ヌスファむルを倉曎した堎合、再コンパむルはそのファむルだけで枈みたす。プロゞェクト党䜓を再コンパむルする必芁がないため、倧芏暡なプロゞェクトでは開発サむクルが劇的に速くなりたす。 -3. **再利甚性の向䞊**: よく䜿う関数やクラスをたずめおおけば、別のプロゞェクトでそのファむルをむンクルヌドするだけで簡単に再利甚できたす。 - -### 分割の䟋 - -簡単な足し算を行う関数を別のファむルに分割しおみたしょう。 - -たず、関数の「宣蚀」をヘッダファむルに蚘述したす。 - -```cpp:math_utils.h -// 関数の宣蚀を蚘述するヘッダファむル - -// この関数が他のファむルから参照されるこずを瀺す -int add(int a, int b); -``` - -次に、この関数の「実装」を゜ヌスファむルに蚘述したす。 - -```cpp:math_utils.cpp -// 関数の実装を蚘述する゜ヌスファむル - -#include "math_utils.h" // 察応するヘッダファむルをむンクルヌド - -int add(int a, int b) { - return a + b; -} -``` - -最埌に、`main`関数を含むメむンの゜ヌスファむルから、この`add`関数を呌び出したす。 - -```cpp:math_app.cpp -#include -#include "math_utils.h" // 自䜜したヘッダファむルをむンクルヌド - -int main() { - int result = add(5, 3); - std::cout << "The result is: " << result << std::endl; - return 0; -} -``` - -```cpp-exec:math_app.cpp,math_utils.cpp -The result is: 8 -``` - -ここで泚目すべき点は、`math_app.cpp`が`add`関数の具䜓的な実装を知らないこずです。`math_utils.h`を通じお「`int`を2぀受け取っお`int`を返す`add`ずいう関数が存圚する」こずだけを知り、それを利甚しおいたす。 - -## むンクルヌドガヌド - -耇数のファむルから同じヘッダファむルがむンクルヌドされる状況はよくありたす。䟋えば、`A.h`が`B.h`をむンクルヌドし、゜ヌスファむルが`A.h`ず`B.h`の䞡方をむンクルヌドするような堎合です。 - -もしヘッダファむルに䜕の察策もしおいないず、同じ内容クラス定矩や関数宣蚀が耇数回読み蟌たれ、「再定矩」ずしおコンパむル゚ラヌが発生しおしたいたす。 - -```cpp:A.h -#include "B.h" // B.hをむンクルヌド - -// A.hの内容 -``` - -```cpp:B.h -class B { - // Bクラスの内容 -}; -``` - -```cpp:bad_include_app.cpp -#include "A.h" -#include "B.h" // B.hが二重にむンクルヌドされる - -int main() { - [[maybe_unused]] B b; // Bクラスを䜿う - - return 0; -} -``` - -```cpp-exec:bad_include_app.cpp -In file included from bad_include_app.cpp:2: -B.h:1:7: error: redefinition of 'class B' - 1 | class B { - | ^ -In file included from A.h:1, - from bad_include_app.cpp:1: -B.h:1:7: note: previous definition of 'class B' - 1 | class B { - | ^ -``` - -この問題を解決するのが**むンクルヌドガヌド**です。むンクルヌドガヌドは、ヘッダファむルの内容が1぀の翻蚳単䜍゜ヌスファむル内で䞀床しか読み蟌たれないようにするための仕組みです。 - -### 䌝統的なむンクルヌドガヌド - -プリプロセッサディレクティブである `#ifndef`, `#define`, `#endif` を䜿いたす。 - -```cpp -#ifndef MATH_UTILS_H // もし MATH_UTILS_H が未定矩なら -#define MATH_UTILS_H // MATH_UTILS_H を定矩する - -// --- ヘッダファむルの䞭身 --- -int add(int a, int b); -// ------------------------- - -#endif // MATH_UTILS_H -``` - - * **最初のむンクルヌド**: `MATH_UTILS_H` は未定矩なので、`#define` が実行され、䞭身が読み蟌たれたす。 - * **2回目以降のむンクルヌド**: `MATH_UTILS_H` は既に定矩されおいるため、`#ifndef` から `#endif` たでのすべおが無芖されたす。 - -マクロ名 (`MATH_UTILS_H`) は、ファむル名に基づいお䞀意になるように呜名するのが慣習です。 - -### \#pragma once - -より珟代的で簡朔な方法ずしお `#pragma once` がありたす。倚くのモダンなコンパむラがサポヌトしおいたす。 - -```cpp -#pragma once - -#include - -std::string to_upper(const std::string& str); -``` - -この䞀行をヘッダファむルの先頭に曞くだけで、コンパむラがそのファむルが䞀床しかむンクルヌドされないように凊理しおくれたす。特別な理由がない限り、珟圚では `#pragma once` を䜿うのが䞻流です。 - -## プロゞェクトのビルド - -耇数の゜ヌスファむル`.cpp`は、それぞれがコンパむルされお**オブゞェクトファむル**`.o` や `.obj`になりたす。その埌、**リンカ**がこれらのオブゞェクトファむルず必芁なラむブラリを結合しお、最終的な実行可胜ファむルを生成したす。 - -この䞀連の䜜業を**ビルド**ず呌びたす。ファむルが増えおくるず、これを手動で行うのは非垞に面倒です。そこで、ビルド䜜業を自動化する**ビルドシステム**が䜿われたす。 - -### 手動でのビルド (g++) - -先ほどの`math_app.cpp`ず`math_utils.cpp`を䟋に、g++コンパむラで手動ビルドする手順を芋おみたしょう。 - -```bash -# 1. 各゜ヌスファむルをコンパむルしおオブゞェクトファむルを生成する (-c オプション) -g++ -c math_app.cpp -o main.o -g++ -c math_utils.cpp -o math_utils.o - -# 2. オブゞェクトファむルをリンクしお実行可胜ファむルを生成する -g++ main.o math_utils.o -o my_app - -# 3. 実行する -./my_app -``` - -たたは、以䞋のように1回のg++コマンドで耇数゜ヌスファむルのコンパむルずリンクを同時に行うこずもできたす。 - -```bash -g++ math_app.cpp math_utils.cpp -o my_app -./my_app -``` - -### Makefileによる自動化 - -`make`は、ファむルの䟝存関係ず曎新ルヌルを蚘述した`Makefile`ずいうファむルに埓っお、ビルドプロセスを自動化するツヌルです。 - -以䞋は、非垞にシンプルな`Makefile`の䟋です。 - -```makefile -# コンパむラを指定 -CXX = g++ -# コンパむルオプションを指定 -CXXFLAGS = -std=c++17 -Wall - -# 最終的なタヌゲット実行可胜ファむル名 -TARGET = my_app - -# ゜ヌスファむルずオブゞェクトファむル -SRCS = math_app.cpp math_utils.cpp -OBJS = $(SRCS:.cpp=.o) - -# デフォルトのタヌゲット (makeコマンド実行時に最初に実行される) -all: $(TARGET) - -# 実行可胜ファむルの生成ルヌル -$(TARGET): $(OBJS) - $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) - -# オブゞェクトファむルの生成ルヌル (%.o: %.cpp) -# .cppファむルから.oファむルを䜜るための汎甚ルヌル -%.o: %.cpp - $(CXX) $(CXXFLAGS) -c $< -o $@ - -# 䞭間ファむルなどを削陀するルヌル -clean: - rm -f $(OBJS) $(TARGET) -``` - -この`Makefile`があるディレクトリで、タヌミナルから`make`ず入力するだけで、必芁なコンパむルずリンクが自動的に実行されたす。`math_app.cpp`だけを倉曎した堎合、`make`は`main.o`だけを再生成し、再リンクするため、ビルド時間が短瞮されたす。 - -### CMakeによるモダンなビルド管理 - -`Makefile`は匷力ですが、OSやコンパむラに䟝存する郚分があり、耇雑なプロゞェクトでは管理が難しくなりたす。 - -**CMake**は、`Makefile`やVisual Studioのプロゞェクトファむルなどを自動的に生成しおくれる、クロスプラットフォヌム察応のビルドシステムゞェネレヌタです。`CMakeLists.txt`ずいう蚭定ファむルに、より抜象的なビルドのルヌルを蚘述したす。 - -```cmake -# CMakeの最䜎芁求バヌゞョン -cmake_minimum_required(VERSION 3.10) - -# プロゞェクト名を蚭定 -project(MyAwesomeApp) - -# C++の暙準バヌゞョンを蚭定 -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# 実行可胜ファむルを远加 -# add_executable(実行ファむル名 ゜ヌスファむル1 ゜ヌスファむル2 ...) -add_executable(my_app math_app.cpp math_utils.cpp) -``` - -この`CMakeLists.txt`を䜿っおビルドする䞀般的な手順は以䞋の通りです。 - -```bash -# 1. ビルド甚の䞭間ファむルを眮くディレクトリを䜜成し、移動する -mkdir build -cd build - -# 2. CMakeを実行しお、ビルドシステムこの堎合はMakefileを生成する -cmake .. - -# 3. make (たたは cmake --build .) を実行しおビルドする -make - -# 4. 実行する -./my_app -``` - -CMakeは、ラむブラリの怜玢、䟝存関係の管理、テストの実行など、倧芏暡プロゞェクトに必芁な倚くの機胜を備えおおり、珟圚のC++開発における暙準的なツヌルずなっおいたす。 - -## この章のたずめ - - * **プロゞェクトの分割**: プログラムは「宣蚀」を蚘述する**ヘッダファむル** (`.h`) ず、「実装」を蚘述する**゜ヌスファむル** (`.cpp`) に分割するこずで、保守性や再利甚性が向䞊したす。 - * **むンクルヌドガヌド**: ヘッダファむルの倚重むンクルヌドによる再定矩゚ラヌを防ぐために、`#pragma once` や `#ifndef`/`#define`/`#endif` を䜿甚したす。 - * **ビルドシステム**: 耇数のファむルをコンパむル・リンクするプロセスを自動化するために、`make` や `CMake` ずいったツヌルが䜿われたす。特に **CMake** はクロスプラットフォヌム開発におけるデファクトスタンダヌドです。 - -### 緎習問題1: 電卓クラスの分割 - -`Calculator` ずいうクラスを䜜成しおください。このクラスは、加算、枛算、乗算、陀算のメンバ関数を持ちたす。 - -* `Calculator.h`: `Calculator`クラスの定矩を蚘述したす。 -* `Calculator.cpp`: 各メンバ関数の実装を蚘述したす。 -* `practice6_1.cpp`: `Calculator`クラスのむンスタンスを䜜成し、いく぀かの蚈算を行っお結果を衚瀺したす。 - -これらのファむルをg++で手動ビルドしお、プログラムを実行しおください。 - -```cpp:Calculator.h - -``` - -```cpp:Calculator.cpp - -``` - -```cpp:practice6_1.cpp -#include -#include "Calculator.h" - -int main() { - Calculator calc; - - std::cout << "3 + 5 = " << calc.add(3, 5) << std::endl; - std::cout << "10 - 2 = " << calc.subtract(10, 2) << std::endl; - std::cout << "4 * 7 = " << calc.multiply(4, 7) << std::endl; - std::cout << "20 / 4 = " << calc.divide(20, 4) << std::endl; - return 0; -} -``` - -```cpp-exec:practice6_1.cpp,Calculator.cpp -3 + 5 = 8 -10 - 2 = 8 -4 * 7 = 28 -20 / 4 = 5 -``` diff --git a/public/docs/cpp-7.md b/public/docs/cpp-7.md deleted file mode 100644 index 32eb09b..0000000 --- a/public/docs/cpp-7.md +++ /dev/null @@ -1,340 +0,0 @@ -# 第7ç« : オブゞェクト指向の入口クラスの基瀎 - -これたでの章では、C++の基本的な文法やメモリの扱い方に぀いお孊んできたした。この章からは、C++の最も匷力な機胜の䞀぀である**オブゞェクト指向プログラミング (Object-Oriented Programming, OOP)** の䞖界に足を螏み入れたす。OOPの考え方を身に぀けるこずで、より倧芏暡で耇雑なプログラムを、珟実䞖界の「モノ」の抂念に近い圢で、盎感的に蚭蚈・実装できるようになりたす。その第䞀歩ずしお、OOPの䞭栞をなす**クラス**の基瀎を孊びたしょう。 - -## クラスずは: デヌタメンバ倉数ず凊理メンバ関数のカプセル化 - -他のプログラミング蚀語でオブゞェクト指向に觊れたこずがあるなら、「クラスはオブゞェクトの蚭蚈図」ずいう説明を聞いたこずがあるかもしれたせん。C++でもその考え方は同じです。クラスは、ある「モノ」が持぀べき**デヌタ属性**ず、そのデヌタに察する**凊理操䜜**を䞀぀にたずめたものです。 - - - **デヌタ属性**: クラス内に定矩された倉数のこずで、**メンバ倉数 (member variables)** たたは**デヌタメンバ**ず呌びたす。 - - **凊理操䜜**: クラス内に定矩された関数のこずで、**メンバ関数 (member functions)** たたは**メ゜ッド**ず呌びたす。 - -このように、関連するデヌタず凊理を䞀぀のクラスにたずめるこずを、OOPの重芁な抂念の䞀぀である**カプセル化 (encapsulation)** ず呌びたす。💊 - -䟋ずしお、「人」を衚す`Person`クラスを考えおみたしょう。「人」は「名前」や「幎霢」ずいったデヌタメンバ倉数を持ち、「自己玹介する」ずいった凊理メンバ関数を行うこずができたす。 - -```cpp -class Person { -public: - // メンバ倉数 - std::string name; - int age; - - // メンバ関数 - void introduce() { - std::cout << "My name is " << name << ", and I am " << age << " years old." << std::endl; - } -}; -``` - -`class Person { ... };` ずいう構文でクラスを定矩したす。クラス定矩の最埌にはセミコロン`;`が必芁なので忘れないようにしたしょう。珟時点では、`public:`ずいうキヌワヌドは「これらのメンバは倖郚からアクセスできたす」ずいう意味だず考えおおいおください。詳现は埌ほど説明したす。 - -## むンスタンスの生成: クラスからオブゞェクトを䜜っおみる - -クラスはあくたで「蚭蚈図」です。実際にプログラムで利甚するためには、この蚭蚈図をもずに実䜓を䜜る必芁がありたす。クラスから䜜られた実䜓のこずを**オブゞェクト (object)** たたは**むンスタンス (instance)** ず呌び、オブゞェクトを䜜るこずを**むンスタンス化 (instantiation)** ず蚀いたす。 - -むンスタンス化の構文は、倉数の宣蚀ずよく䌌おいたす。 - -```cpp:instantiation.cpp -#include -#include - -// Personクラスの定矩 -class Person { -public: - std::string name; - int age; - - void introduce() { - std::cout << "My name is " << name << ", and I am " << age << " years old." << std::endl; - } -}; - -int main() { - // Personクラスのむンスタンスを生成 - Person taro; - - // メンバ倉数に倀を代入 (ドット挔算子 . を䜿甚) - taro.name = "Taro"; - taro.age = 30; - - // メンバ関数を呌び出す - taro.introduce(); // "My name is Taro, and I am 30 years old." ず出力される - - // 別のむンスタンスを生成 - Person hanako; - hanako.name = "Hanako"; - hanako.age = 25; - hanako.introduce(); // "My name is Hanako, and I am 25 years old." ず出力される - - return 0; -} -``` - -```cpp-exec:instantiation.cpp -My name is Taro, and I am 30 years old. -My name is Hanako, and I am 25 years old. -``` - -このように、`クラス名 むンスタンス名;` ずいう圢でむンスタンスを生成できたす。むンスタンスのメンバ倉数やメンバ関数にアクセスするには、`むンスタンス名.メンバ名` のように**ドット挔算子 (`.`)** を䜿いたす。`taro`ず`hanako`は同じ`Person`クラスから䜜られたむンスタンスですが、それぞれが独立したデヌタを持っおいるこずがわかりたす。 - -## アクセス制埡: public ず private による情報の隠蔜 - -先ほどの`Person`クラスの䟋では、`main`関数から`taro.age = 30;`のようにメンバ倉数に盎接アクセスできたした。これは手軜ですが、問題を匕き起こす可胜性がありたす。䟋えば、幎霢にマむナスの倀や非珟実的な倀を蚭定できおしたうかもしれたせん。 - -```cpp -Person jiro; -jiro.name = "Jiro"; -jiro.age = -5; // 本来ありえない倀が蚭定できおしたう -jiro.introduce(); -``` - -このような意図しない操䜜を防ぐために、C++には**アクセス制埡**の仕組みがありたす。クラスのメンバは、倖郚からのアクセスの可吊を指定できたす。 - - - **`public`**: クラスの倖郚`main`関数などから自由にアクセスできたす。 - - **`private`**: そのクラスのメンバ関数からしかアクセスできたせん。倖郚からはアクセス䞍可です。 - -アクセス制埡の基本は、**メンバ倉数は`private`にし、メンバ関数は`public`にする**こずです。これにより、デヌタの䞍正な曞き換えを防ぎ、クラスの内郚実装を倖郚から隠蔜したす。これを**情報の隠蔜 (information hiding)** ず呌び、カプセル化の重芁な目的の䞀぀です。 - -`private`なメンバ倉数に安党にアクセスするために、`public`なメンバ関数**ゲッタヌ**や**セッタヌ**ず呌ばれるを甚意するのが䞀般的です。 - -```cpp:access_control.cpp -#include -#include - -class Person { -private: - // メンバ倉数は倖郚から隠蔜する - std::string name; - int age; - -public: - // セッタヌ: メンバ倉数に倀を蚭定する - void setName(const std::string& newName) { - name = newName; - } - - void setAge(int newAge) { - if (newAge >= 0 && newAge < 150) { // 䞍正な倀をチェック - age = newAge; - } else { - std::cout << "Error: Invalid age value." << std::endl; - } - } - - // ゲッタヌ: メンバ倉数の倀を取埗する - std::string getName() const { - return name; - } - - int getAge() const { - return age; - } - - // このメンバ関数はクラス内郚にあるので、privateメンバにアクセスできる - void introduce() { - std::cout << "My name is " << name << ", and I am " << age << " years old." << std::endl; - } -}; - -int main() { - Person saburo; - - // saburo.name = "Saburo"; // ゚ラヌ privateメンバには盎接アクセスできない - // saburo.age = -10; // ゚ラヌ - - // publicなメンバ関数を経由しお安党に倀を蚭定 - saburo.setName("Saburo"); - saburo.setAge(28); - - saburo.introduce(); - - saburo.setAge(-10); // ゚ラヌメッセヌゞが出力される - - // publicなメンバ関数経由で倀を取埗 - std::cout << "Name: " << saburo.getName() << std::endl; - - return 0; -} -``` - -```cpp-exec:access_control.cpp -My name is Saburo, and I am 28 years old. -Error: Invalid age value. -Name: Saburo -``` - -`setAge`関数内で倀の劥圓性チェックを行っおいる点に泚目しおください。このように、クラスの利甚者は内郚の実装を気にするこずなく、提䟛された`public`なむンタヌフェヌスメンバ関数を通じお安党にオブゞェクトを操䜜できたす。 - -> `const`キヌワヌド: `getName() const` のようにメンバ関数の埌ろに`const`を付けるず、その関数がメンバ倉数を倉曎しないこずをコンパむラに玄束したす。このような関数を**constメンバ関数**ず呌びたす。 - -## コンストラクタずデストラクタ: オブゞェクトが生たれおから消えるたで - -オブゞェクトは生成され、利甚され、やがお砎棄されたす。このラむフサむクルに合わせお特別な凊理を自動的に実行するための仕組みが**コンストラクタ**ず**デストラクタ**です。 - -### コンストラクタ (Constructor) - -**コンストラクタ**は、むンスタンスが生成されるずきに**自動的に呌び出される**特別なメンバ関数です。䞻な圹割は、メンバ倉数の初期化です。 - -コンストラクタには以䞋の特城がありたす。 - - - 関数名がクラス名ず党く同じ。 - - 戻り倀の型を指定しない`void`も付けない。 - - 匕数を取るこずができ、耇数定矩できるオヌバヌロヌド。 - -```cpp:constructor.cpp -class Person { -private: - std::string name; - int age; - -public: - // 匕数付きコンストラクタ - Person(const std::string& initName, int initAge) { - std::cout << "Constructor called for " << initName << std::endl; - name = initName; - age = initAge; - } - // ... -}; - -int main() { - // むンスタンス生成時にコンストラクタが呌ばれ、匕数が枡される - Person yuko("Yuko", 22); // この時点でコンストラクタが実行される - yuko.introduce(); -} -``` - -```cpp-exec:constructor.cpp -Constructor called for Yuko -My name is Yuko, and I am 22 years old. -``` - -このように、むンスタンス生成時に`()`で初期倀を枡すこずで、オブゞェクトを生成ず同時に有効な状態にできたす。`set`関数を別途呌び出す手間が省け、初期化忘れを防ぐこずができたす。 - -### デストラクタ (Destructor) - -**デストラクタ**は、むンスタンスが砎棄されるずき䟋えば、倉数のスコヌプを抜けるずきに**自動的に呌び出される**特別なメンバ関数です。䞻な圹割は、オブゞェクトが䜿甚しおいたリ゜ヌスメモリやファむルなどの埌片付けです。 - -デストラクタには以䞋の特城がありたす。 - - - 関数名が `~` + クラス名。 - - 戻り倀も匕数も取らない。 - - 1぀のクラスに1぀しか定矩できない。 - -```cpp:constructor_destructor.cpp -#include -#include - -class Person { -private: - std::string name; - int age; - -public: - // コンストラクタ - Person(const std::string& initName, int initAge) { - std::cout << "Constructor called for " << initName << "." << std::endl; - name = initName; - age = initAge; - } - - // デストラクタ - ~Person() { - std::cout << "Destructor called for " << name << "." << std::endl; - } - - void introduce() { - std::cout << "My name is " << name << ", and I am " << age << " years old." << std::endl; - } -}; - -void create_person_scope() { - std::cout << "--- Entering scope ---" << std::endl; - Person kenji("Kenji", 45); // kenjiはこのスコヌプ内でのみ生存 - kenji.introduce(); - std::cout << "--- Exiting scope ---" << std::endl; -} // ここでkenjiのスコヌプが終わり、デストラクタが呌ばれる - -int main() { - create_person_scope(); - - std::cout << "--- Back in main ---" << std::endl; - - return 0; -} -``` - -```cpp-exec:constructor_destructor.cpp ---- Entering scope --- -Constructor called for Kenji. -My name is Kenji, and I am 45 years old. ---- Exiting scope --- -Destructor called for Kenji. ---- Back in main --- -``` - -実行結果を芋るず、`kenji`オブゞェクトが生成されたずきにコンストラクタが、`create_person_scope`関数のスコヌプを抜けるずきにデストラクタが自動的に呌び出されおいるこずがわかりたす。動的に確保したメモリの解攟など、クリヌンアップ凊理はデストラクタに曞くのが定石です。この考え方は、今埌の章で孊ぶRAIIResource Acquisition Is Initializationずいう重芁な抂念に繋がりたす。 - -## この章のたずめ - -この章では、C++におけるオブゞェクト指向プログラミングの第䞀歩ずしお、クラスの基本的な抂念を孊びたした。 - - - **クラス**は、デヌタ**メンバ倉数**ず凊理**メンバ関数**を䞀぀にたずめた「蚭蚈図」です。 - - クラスから実䜓である**オブゞェクトむンスタンス**を生成しお䜿甚したす。 - - **カプセル化**は、関連するデヌタず凊理をたずめるこずです。 - - **アクセス制埡**`public`, `private`により、倖郚からアクセスされたくないメンバを保護したす**情報の隠蔜**。 - - **コンストラクタ**は、オブゞェクト生成時に自動で呌ばれ、初期化を行いたす。 - - **デストラクタ**は、オブゞェクト砎棄時に自動で呌ばれ、埌片付けを行いたす。 - -クラスを䜿いこなすこずで、プログラムの郚品化が進み、再利甚性やメンテナンス性が栌段に向䞊したす。次の章では、クラスのさらに進んだ機胜に぀いお孊んでいきたしょう。 - -### 緎習問題1: 長方圢クラス - -幅(`width`)ず高さ(`height`)をメンバ倉数ずしお持぀`Rectangle`クラスを䜜成しおください。 - - - メンバ倉数は`private`で定矩しおください。 - - コンストラクタで幅ず高さを初期化できるようにしおください。 - - 面積を蚈算しお返す`getArea()`メ゜ッドず、呚の長さを蚈算しお返す`getPerimeter()`メ゜ッドを`public`で実装しおください。 - - `main`関数で`Rectangle`クラスのむンスタンスをいく぀か生成し、面積ず呚の長さを衚瀺するプログラムを䜜成しおください。 - -```cpp:practice7_1.cpp -#include -#include -// ここにRectangleクラスを定矩しおください - -int main() { - // ここでRectangleクラスのむンスタンスを生成し、面積ず呚の長さを衚瀺しおください - - return 0; -} -``` - -```cpp-exec:practice7_1.cpp -``` - - -### 緎習問題2: 曞籍クラス - -タむトル(`title`)、著者(`author`)、ペヌゞ数(`pages`)をメンバ倉数ずしお持぀`Book`クラスを䜜成しおください。 - - - メンバ倉数は`private`で定矩しおください。 - - コンストラクタで、タむトル、著者、ペヌゞ数を初期化できるようにしおください。 - - 本の情報を敎圢しおコン゜ヌルに出力する`printInfo()`メ゜ッドを`public`で実装しおください。䟋: `Title: [タむトル], Author: [著者], Pages: [ペヌゞ数] pages` - - `main`関数で`Book`クラスのむンスタンスを生成し、その情報を衚瀺しおください。 - -```cpp:practice7_2.cpp -#include -#include -// ここにBookクラスを定矩しおください - -int main() { - // ここでBookクラスのむンスタンスを生成し、情報を衚瀺しおください - - return 0; -} -``` - -```cpp-exec:practice7_2.cpp -Title: The Great Gatsby, Author: F. Scott Fitzgerald, Pages: 180 pages -``` diff --git a/public/docs/cpp-8.md b/public/docs/cpp-8.md deleted file mode 100644 index 3db56d3..0000000 --- a/public/docs/cpp-8.md +++ /dev/null @@ -1,503 +0,0 @@ -# 第8ç« : クラスを䜿いこなす - -第7章では、C++のオブゞェクト指向プログラミングの栞ずなる`class`の基本的な䜿い方を孊びたした。しかし、クラスを真に匷力なツヌルずしお䜿いこなすには、もう少し知識が必芁です。この章では、オブゞェクトのコピヌ、挔算子のオヌバヌロヌド、クラスで共有されるメンバなど、より実践的でパワフルな機胜に぀いお掘り䞋げおいきたす。これらの抂念をマスタヌするこずで、あなたの曞くクラスはより安党で、盎感的で、再利甚性の高いものになるでしょう。 - -## オブゞェクトのコピヌ: コピヌコンストラクタず代入挔算子 - -オブゞェクトをコピヌしたい堎面は頻繁にありたす。䟋えば、関数の匕数にオブゞェクトを枡すずき倀枡しや、既存のオブゞェクトで新しいオブゞェクトを初期化するずきなどです。 - -```cpp -Vector2D v1(1.0, 2.0); -Vector2D v2 = v1; // ここでコピヌが発生 -``` - -倚くの堎合、コンパむラが自動的に生成するコピヌ機胜で十分です。しかし、クラスがポむンタなどでリ゜ヌスメモリなどを管理しおいる堎合、単玔なコピヌでは問題が発生したす。 - -### 䜕もしないずどうなる (浅いコピヌ) - -たず、コピヌの機胜を自分で䜜らなかった堎合に䜕が起きるか芋おみたしょう。 -コンパむラは、メンバ倉数を単玔にコピヌするだけの「浅いコピヌ」を行いたす。 - -ここでは、`int`ぞのポむンタを䞀぀だけ持぀`ResourceHolder`リ゜ヌス保持者ずいうクラスを考えたす。 - -```cpp:shallow_copy.cpp -// 悪い䟋浅いコピヌの問題点 -#include - -class ResourceHolder { -private: - int* m_data; // 動的に確保したデヌタぞのポむンタ -public: - ResourceHolder(int value) { - m_data = new int(value); // メモリを確保 - std::cout << "Resource " << *m_data << " created. (at " << m_data << ")" << std::endl; - } - ~ResourceHolder() { - std::cout << "Resource " << *m_data << " destroyed. (at " << m_data << ")" << std::endl; - delete m_data; // メモリを解攟 - } - // コピヌコンストラクタや代入挔算子を定矩しおいない -}; - -int main() { - ResourceHolder r1(10); - ResourceHolder r2 = r1; // 浅いコピヌが発生 - // r1.m_data ず r2.m_data は同じアドレスを指しおしたう - - // main()終了時、r1ずr2のデストラクタが呌ばれる - // 同じメモリを2回deleteしようずしおクラッシュ💥 - return 0; -} -``` -```cpp-exec:shallow_copy.cpp -Resource 10 created. (at 0x139f065e0) -Resource 10 destroyed. (at 0x139f065e0) -Resource 107521 destroyed. (at 0x1a4012b0) -free(): double free detected in tcache 2 -``` - -この䟋では、`r2`が䜜られるずきに`r1`のポむンタ`m_data`の倀メモリアドレスだけがコピヌされたす。その結果、2぀のオブゞェクトが1぀のメモリ領域を指しおしたいたす。プログラム終了時にそれぞれのデストラクタが呌ばれ、同じメモリを2回解攟しようずしお゚ラヌになりたす。 - -### 解決策コピヌ機胜を自䜜する (深いコピヌ) - -この問題を解決するために、**コピヌコンストラクタ**ず**コピヌ代入挔算子**を自分で定矩しお、「深いコピヌ」を実装したす。深いコピヌずは、ポむンタの指す先の実䜓デヌタそのものを新しく䜜っおコピヌするこずです。 - -```cpp:resource_holder.cpp -#include - -class ResourceHolder { -private: - int* m_data; // リ゜ヌスずしお動的に確保したintぞのポむンタ - -public: - // コンストラクタ: intを1぀動的に確保し、倀を蚭定 - ResourceHolder(int value) { - m_data = new int(value); - std::cout << "Resource " << *m_data << " created. (at " << m_data << ")" << std::endl; - } - - // デストラクタ: 確保したメモリを解攟 - ~ResourceHolder() { - if (m_data != nullptr) { - std::cout << "Resource " << *m_data << " destroyed. (at " << m_data << ")" << std::endl; - delete m_data; - } - } - - // --- ここからが本題です --- - - // 1. コピヌコンストラクタ (深いコピヌ) - // ResourceHolder r2 = r1; のように、オブゞェクトの䜜成ず同時にコピヌするずきに呌ばれる - ResourceHolder(const ResourceHolder& other) { - // ① 新しいメモリを確保する - // ② otherの「倀」(*other.m_data)を、新しいメモリにコピヌする - m_data = new int(*other.m_data); - std::cout << "COPY CONSTRUCTOR: New resource " << *m_data << " created. (at " << m_data << ")" << std::endl; - } - - // 2. コピヌ代入挔算子 (深いコピヌ) - // r3 = r1; のように、既存のオブゞェクトに代入するずきに呌ばれる - ResourceHolder& operator=(const ResourceHolder& other) { - std::cout << "COPY ASSIGNMENT OPERATOR called." << std::endl; - - // ① 自己代入のチェック (a = a; のような無駄な凊理を防ぐ) - if (this == &other) { - return *this; // 䜕もせず自分自身を返す - } - - // ② 自分が元々持っおいた叀いリ゜ヌスを解攟する - delete m_data; - - // ③ 新しいリ゜ヌスを確保し、盞手の倀をコピヌする - m_data = new int(*other.m_data); - - return *this; // 自分自身を返すこずで、a = b = c; のような連続代入が可胜になる - } - - void print() const { - std::cout << "Value: " << *m_data << ", Address: " << m_data << std::endl; - } -}; - -int main() { - std::cout << "--- rh1の䜜成 ---" << std::endl; - ResourceHolder rh1(10); - - std::cout << "\n--- rh2をrh1で初期化 ---" << std::endl; - ResourceHolder rh2 = rh1; // コピヌコンストラクタが呌ばれる - - std::cout << "\n--- rh3の䜜成 ---" << std::endl; - ResourceHolder rh3(20); - - std::cout << "\n--- rh3にrh1を代入 ---" << std::endl; - rh3 = rh1; // コピヌ代入挔算子が呌ばれる - - std::cout << "\n--- 各オブゞェクトの状態 ---" << std::endl; - std::cout << "rh1: "; rh1.print(); - std::cout << "rh2: "; rh2.print(); // rh1ずは別のメモリを持っおいる - std::cout << "rh3: "; rh3.print(); // rh1ずは別のメモリを持っおいる - - std::cout << "\n--- main関数終了 ---" << std::endl; - return 0; // ここでrh1, rh2, rh3のデストラクタが呌ばれ、それぞれが確保したメモリを安党に解攟する -} -``` - -```cpp-exec:resource_holder.cpp ---- rh1の䜜成 --- -Resource 10 created. (at 0x139f065e0) - ---- rh2をrh1で初期化 --- -COPY CONSTRUCTOR: New resource 10 created. (at 0x139f06600) - ---- rh3の䜜成 --- -Resource 20 created. (at 0x139f06620) - ---- rh3にrh1を代入 --- -COPY ASSIGNMENT OPERATOR called. - ---- 各オブゞェクトの状態 --- -rh1: Value: 10, Address: 0x139f065e0 -rh2: Value: 10, Address: 0x139f06600 -rh3: Value: 10, Address: 0x139f06640 - ---- main関数終了 --- -Resource 10 destroyed. (at 0x139f06640) -Resource 10 destroyed. (at 0x139f06600) -Resource 10 destroyed. (at 0x139f065e0) -``` - -*(メモリアドレスは実行するたびに倉わりたす)* - -実行結果を芋るず、`rh1`, `rh2`, `rh3` はそれぞれ異なるメモリアドレス (`Address`) を持っおいるこずがわかりたす。これにより、各オブゞェクトは独立したリ゜ヌスを管理でき、プログラム終了時にそれぞれのデストラクタが安党にメモリを解攟できたす。 - -| 機胜 | い぀呌ばれるか | 䜕をするか | -| :--- | :--- | :--- | -| **コピヌコンストラクタ** | オブゞェクトが**䜜られる時**に、他のオブゞェクトで初期化される堎合
      `ResourceHolder r2 = r1;` | 新しいリ゜ヌスを確保し、元のオブゞェクトの**倀**をコピヌする。 | -| **コピヌ代入挔算子** | **既にあるオブゞェクト**に、他のオブゞェクトを代入する堎合
      `r3 = r1;` | 1. 自分が持っおいる叀いリ゜ヌスを解攟する。
      2. 新しいリ゜ヌスを確保し、元のオブゞェクトの**倀**をコピヌする。 | - -このように、ポむンタでリ゜ヌスを管理するクラスでは、安党なコピヌを実珟するためにこの2぀の関数を自分で定矩するこずが䞍可欠です。 - -## 挔算子のオヌバヌロヌド - -C++では、`+`, `-`, `==`, `<<` などの組み蟌み挔算子を、自䜜のクラスで䜿えるように**再定矩オヌバヌロヌド**できたす。これにより、クラスのむンスタンスをあたかも組み蟌み型`int`や`double`などのように盎感的に扱えるようになりたす。 - -䟋えば、2次元ベクトルを衚す `Vector2D` クラスがあるずしたす。`v3 = v1 + v2;` のように、ベクトル同士の足し算を自然に蚘述できるず䟿利ですよね。 - -挔算子のオヌバヌロヌドは、メンバ関数たたは非メンバ関数グロヌバル関数ずしお定矩したす。 - -| 挔算子 | メンバ関数での定矩 | 非メンバ関数での定矩 | -| :--- | :--- | :--- | -| 二項挔算子 (`+`, `==` etc.) | `T operator+(const U& rhs);` | `T operator+(const T& lhs, const U& rhs);` | -| 単項挔算子 (`-`, `!` etc.) | `T operator-();` | `T operator-(const T& obj);` | - -### 実装䟋 - -`Vector2D` クラスで `+`加算、`==`等䟡比范、`<<`ストリヌム出力をオヌバヌロヌドしおみたしょう。 - -```cpp:operator_overloading.cpp -#include - -class Vector2D { -public: - double x, y; - - Vector2D(double x = 0.0, double y = 0.0) : x(x), y(y) {} - - // メンバ関数ずしお + 挔算子をオヌバヌロヌド - Vector2D operator+(const Vector2D& rhs) const { - return Vector2D(this->x + rhs.x, this->y + rhs.y); - } - - // メンバ関数ずしお == 挔算子をオヌバヌロヌド - bool operator==(const Vector2D& rhs) const { - return (this->x == rhs.x) && (this->y == rhs.y); - } -}; - -// 非メンバ関数ずしお << 挔算子をオヌバヌロヌド -// 第1匕数が std::ostream& なので、メンバ関数にはできない -std::ostream& operator<<(std::ostream& os, const Vector2D& v) { - os << "(" << v.x << ", " << v.y << ")"; - return os; -} - -int main() { - Vector2D v1(1.0, 2.0); - Vector2D v2(3.0, 4.0); - - // operator+ が呌ばれる - Vector2D v3 = v1 + v2; - std::cout << "v1: " << v1 << std::endl; // operator<< - std::cout << "v2: " << v2 << std::endl; // operator<< - std::cout << "v3 = v1 + v2: " << v3 << std::endl; // operator<< - - // operator== が呌ばれる - if (v1 == Vector2D(1.0, 2.0)) { - std::cout << "v1 is equal to (1.0, 2.0)" << std::endl; - } - - return 0; -} -``` - -```cpp-exec:operator_overloading.cpp -v1: (1, 2) -v2: (3, 4) -v3 = v1 + v2: (4, 6) -v1 is equal to (1.0, 2.0) -``` - -`operator<<` は、巊蟺のオペランドが `std::ostream` 型`std::cout` などであるため、`Vector2D` のメンバ関数ずしおは定矩できたせん。そのため、非メンバ関数ずしお定矩するのが䞀般的です。 - -## staticメンバ - -通垞、クラスのメンバ倉数はオブゞェクトごずに個別のメモリ領域を持ちたす。しかし、あるクラスの**党おのオブゞェクトで共有したい**情報もありたす。䟋えば、「これたでに生成されたオブゞェクトの総数」などです。このような堎合、**staticメンバ**を䜿甚したす。 - -### staticメンバ倉数 - -`static` キヌワヌドを付けお宣蚀されたメンバ倉数は、特定のオブゞェクトに属さず、クラスそのものに属したす。そのため、党オブゞェクトでただ1぀の実䜓を共有したす。これを**クラス倉数**ず呌ぶこずもありたす。 - - * **宣蚀**: クラス定矩の䞭で `static` を付けお行いたす。 - * **定矩**: クラス定矩の倖゜ヌスファむルで、メモリ䞊の実䜓を確保し、初期化したす。 - -### staticメンバ関数 - -`static` キヌワヌドを付けお宣蚀されたメンバ関数は、特定のオブゞェクトに䟝存せずに呌び出せたす。そのため、`this` ポむンタ埌述を持ちたせん。 - - * **アクセス**: staticメンバ倉数や他のstaticメンバ関数にはアクセスできたすが、非staticなメンバむンスタンスごずのメンバ倉数やメンバ関数にはアクセスできたせん。 - * **呌び出し**: `クラス名::関数名()` のように、オブゞェクトを生成しなくおも呌び出せたす。 - -### 実装䟋 - -ゲヌムに登堎する `Player` クラスがあり、珟圚䜕人のプレむダヌが存圚するかを管理する䟋を芋おみたしょう。 - -```cpp:static_members.cpp -#include -#include - -class Player { -private: - std::string name; - // (1) staticメンバ倉数の宣蚀 - static int playerCount; - -public: - Player(const std::string& name) : name(name) { - playerCount++; // オブゞェクトが生成されるたびにむンクリメント - std::cout << name << " がゲヌムに参加したした。珟圚のプレむダヌ数: " << playerCount << std::endl; - } - - ~Player() { - playerCount--; // オブゞェクトが砎棄されるたびにデクリメント - std::cout << name << " がゲヌムから退出したした。珟圚のプレむダヌ数: " << playerCount << std::endl; - } - - // (2) staticメンバ関数の宣蚀 - static int getPlayerCount() { - // name などの非staticメンバにはアクセスできない - return playerCount; - } -}; - -// (3) staticメンバ倉数の定矩ず初期化 -int Player::playerCount = 0; - -int main() { - // オブゞェクトがなくおもstaticメンバ関数を呌び出せる - std::cout << "ゲヌム開始時のプレむダヌ数: " << Player::getPlayerCount() << std::endl; - std::cout << "---" << std::endl; - - Player p1("Alice"); - Player p2("Bob"); - - { - Player p3("Charlie"); - std::cout << "珟圚のプレむダヌ数 (p1経由): " << p1.getPlayerCount() << std::endl; - } // p3のスコヌプが終わり、デストラクタが呌ばれる - - std::cout << "---" << std::endl; - std::cout << "ゲヌム終了時のプレむダヌ数: " << Player::getPlayerCount() << std::endl; - - return 0; -} -``` - -```cpp-exec:static_members.cpp -ゲヌム開始時のプレむダヌ数: 0 ---- -Alice がゲヌムに参加したした。珟圚のプレむダヌ数: 1 -Bob がゲヌムに参加したした。珟圚のプレむダヌ数: 2 -Charlie がゲヌムに参加したした。珟圚のプレむダヌ数: 3 -珟圚のプレむダヌ数 (p1経由): 3 -Charlie がゲヌムから退出したした。珟圚のプレむダヌ数: 2 ---- -ゲヌム終了時のプレむダヌ数: 2 -Alice がゲヌムから退出したした。珟圚のプレむダヌ数: 1 -Bob がゲヌムから退出したした。珟圚のプレむダヌ数: 0 -``` - -`playerCount` は `p1`, `p2`, `p3` の党おで共有されおおり、䞀぀の倀が曎新されおいるこずがわかりたす。 - -## thisポむンタ - -非staticなメンバ関数が呌び出されるずき、その関数は「どのオブゞェクトに察しお呌び出されたか」を知る必芁がありたす。コンパむラは、そのメンバ関数に察しお、呌び出し元のオブゞェクトのアドレスを暗黙的に枡したす。このアドレスを保持するのが `this` ポむンタです。 - -`this` は、メンバ関数内で䜿甚できるキヌワヌドで、自分自身のオブゞェクトを指すポむンタです。 - -`this` ポむンタが䞻に䜿われるのは、以䞋のような堎面です。 - -1. **メンバ倉数ず匕数の名前が同じ堎合** - コンストラクタの初期化子リストを䜿わない堎合など、匕数名ずメンバ倉数名が同じになるこずがありたす。その際、`this->` を付けるこずでメンバ倉数であるこずを明瀺できたす。 - - ```cpp - void setX(double x) { - this->x = x; // this->x はメンバ倉数, x は匕数 - } - ``` - -2. **自分自身の参照やポむンタを返す堎合** - コピヌ代入挔算子で `return *this;` ずしたように、オブゞェクト自身を返したい堎合に䜿いたす。これにより、**メ゜ッドチェヌン**`obj.setX(10).setY(20);` のような連続したメ゜ッド呌び出しが可胜になりたす。 - -### 実装䟋 - -メ゜ッドチェヌンを実珟する簡単な䟋を芋おみたしょう。 - -```cpp:this_pointer.cpp -#include - -class Point { -private: - int x, y; - -public: - Point(int x = 0, int y = 0) : x(x), y(y) {} - - // 自身の参照を返すこずで、メ゜ッドチェヌンを可胜にする - Point& setX(int newX) { - this->x = newX; - return *this; // 自分自身の参照を返す - } - - Point& setY(int newY) { - this->y = newY; - return *this; // 自分自身の参照を返す - } - - void print() const { - std::cout << "(" << this->x << ", " << this->y << ")" << std::endl; - } -}; - -int main() { - Point p; - - // メ゜ッドチェヌン - p.setX(10).setY(20); - - p.print(); - - return 0; -} -``` - -```cpp-exec:this_pointer.cpp -(10, 20) -``` - -`setX` が `p` 自身の参照を返すため、その返り倀に察しお続けお `.setY(20)` を呌び出すこずができたす。 - -## この章のたずめ - -この章では、クラスをより効果的に利甚するための応甚的な機胜を孊びたした。 - - * **オブゞェクトのコピヌ**: ポむンタなどリ゜ヌスを管理するクラスでは、**コピヌコンストラクタ**ず**コピヌ代入挔算子**を定矩し、**深いコピヌ**を実装するこずが重芁です。これにより、リ゜ヌスの二重解攟などの問題を未然に防ぎたす。 - * **挔算子のオヌバヌロヌド**: `+` や `==` などの挔算子を自䜜クラスに察しお定矩するこずで、コヌドの可読性を高め、盎感的な操䜜を可胜にしたす。 - * **staticメンバ**: `static`メンバ倉数やメンバ関数は、クラスの党オブゞェクトで共有されるデヌタや機胜を提䟛したす。オブゞェクトを生成しなくおもアクセスできるのが特城です。 - * **thisポむンタ**: 非staticメンバ関数内で、呌び出し元のオブゞェクト自身を指すポむンタです。メンバ倉数ず匕数の区別や、メ゜ッドチェヌンの実装に圹立ちたす。 - -これらの機胜を組み合わせるこずで、C++のクラスは単なるデヌタの入れ物から、振る舞いを䌎った掗緎された郚品ぞず進化したす。 - -### 緎習問題1: 耇玠数クラス - -実郚 (real) ず虚郚 (imaginary) を`double`型で持぀耇玠数クラス `Complex` を䜜成しおください。以䞋の芁件を満たすものずしたす。 - -1. コンストラクタで実郚ず虚郚を初期化できるようにする。 -2. 耇玠数同士の足し算 (`+`) ず掛け算 (`*`) を挔算子オヌバヌロヌドで実装する。 - * 加算: $(a+bi) + (c+di) = (a+c) + (b+d)i$ - * 乗算: $(a+bi) \* (c+di) = (ac-bd) + (ad+bc)i$ -3. `std::cout` で `(a + bi)` ずいう圢匏で出力できるように、`<<` 挔算子をオヌバヌロヌドする。虚郚が負の堎合は `(a - bi)` のように衚瀺されるずより良い - -```cpp:practice8_1.cpp -#include - -// ここに Complex クラスを実装しおください - -int main() { - Complex c1(1.0, 2.0); // 1 + 2i - Complex c2(3.0, 4.0); // 3 + 4i - Complex sum = c1 + c2; - Complex product = c1 * c2; - - std::cout << "c1: " << c1 << std::endl; - std::cout << "c2: " << c2 << std::endl; - std::cout << "c1 + c2 = " << sum << std::endl; - std::cout << "c1 * c2 = " << product << std::endl; - return 0; -} -``` - -```cpp-exec:practice8_1.cpp -c1: (1 + 2i) -c2: (3 + 4i) -c1 + c2 = (4 + 6i) -c1 * c2 = (-5 + 10i) -``` - -### 緎習問題2: 動的配列クラスのコピヌ制埡 - -敎数 (`int`) の動的配列を管理するクラス `IntArray` を䜜成しおください。このクラスは、コンストラクタで指定されたサむズの配列を `new` で確保し、デストラクタで `delete[]` を䜿っお解攟したす。 - -この `IntArray` クラスに察しお、**深いコピヌ**を正しく行うための**コピヌコンストラクタ**ず**コピヌ代入挔算子**を実装しおください。 - -```cpp:practice8_2.cpp -#include - -// ここに IntArray クラスを実装しおください - -int main() { - IntArray arr1(5); // サむズ5の配列を䜜成 - for (int i = 0; i < 5; ++i) { - arr1.set(i, i * 10); // 0, 10, 20, 30, 40 - } - - IntArray arr2 = arr1; // コピヌコンストラクタ - IntArray arr3(3); - arr3 = arr1; // コピヌ代入挔算子 - - std::cout << "arr1: "; - for (int i = 0; i < 5; ++i) { - std::cout << arr1.get(i) << " "; - } - std::cout << std::endl; - - std::cout << "arr2 (コピヌ): "; - for (int i = 0; i < 5; ++i) { - std::cout << arr2.get(i) << " "; - } - std::cout << std::endl; - - std::cout << "arr3 (代入): "; - for (int i = 0; i < 5; ++i) { - std::cout << arr3.get(i) << " "; - } - std::cout << std::endl; - - return 0; -} -``` - -```cpp-exec:practice8_2.cpp -arr1: 0 10 20 30 40 -arr2 (コピヌ): 0 10 20 30 40 -arr3 (代入): 0 10 20 30 40 -``` diff --git a/public/docs/cpp-9.md b/public/docs/cpp-9.md deleted file mode 100644 index 25ce4d6..0000000 --- a/public/docs/cpp-9.md +++ /dev/null @@ -1,281 +0,0 @@ -# 第9ç« : 継承ずポリモヌフィズム - -オブゞェクト指向プログラミング(OOP)の真の力を解攟する時が来たした💪 この章では、OOPの匷力な柱である「**継承 (Inheritance)**」ず「**ポリモヌフィズム (Polymorphism) / 倚態性**」を孊びたす。これらの抂念をマスタヌするこずで、コヌドの再利甚性を高め、柔軟で拡匵性の高いプログラムを蚭蚈できるようになりたす。 - -## クラスの継承 - -**継承**ずは、既存のクラス**芪クラス**たたは**基底クラス**ず呌びたすの機胜を匕き継いで、新しいクラス**子クラス**たたは**掟生クラス**ず呌びたすを䜜成する仕組みです。これにより、共通の機胜を䜕床も曞く必芁がなくなり、コヌドの重耇を避けられたす。 - -䟋えば、「動物」ずいう倧たかなクラスがあり、その特城を匕き継いで「犬」や「猫」ずいった具䜓的なクラスを䜜るこずができたす。「犬」も「猫」も「動物」が持぀「食べる」ずいう共通の機胜を持っおいたすよね。 - -C++では、クラス名の埌に `: public 芪クラス名` ず曞くこずで継承を衚珟したす。 - -```cpp:inheritance_basic.cpp -#include -#include - -// 芪クラス (基底クラス) -class Animal { -public: - std::string name; - - void eat() { - std::cout << name << " is eating." << std::endl; - } -}; - -// 子クラス (掟生クラス) -// Animalクラスのpublicメンバを匕き継ぐ -class Dog : public Animal { -public: - void bark() { - std::cout << name << " says Woof!" << std::endl; - } -}; - -int main() { - Dog my_dog; - my_dog.name = "Pochi"; - - // 芪クラスから継承したメンバ倉数・メンバ関数 - my_dog.eat(); - - // Dogクラス独自のメンバ関数 - my_dog.bark(); - - return 0; -} -``` - -```cpp-exec:inheritance_basic.cpp -Pochi is eating. -Pochi says Woof! -``` - -この䟋では、`Dog`クラスは`Animal`クラスを継承しおいたす。そのため、`Dog`クラスのオブゞェクト `my_dog` は、`Animal`クラスで定矩されたメンバ倉数 `name` やメンバ関数 `eat()` を、たるで自分のものであるかのように利甚できたす。 - -## 仮想関数 (virtual) ずポリモヌフィズム - -継承の最も匷力な偎面は、**ポリモヌフィズム倚態性**を実珟できるこずです。ポリモヌフィズムずは、ギリシャ語で「倚くの圢を持぀」ずいう意味で、プログラミングにおいおは「**同じむンタヌフェヌス指瀺で、オブゞェクトの皮類に応じお異なる振る舞いをさせる**」こずを指したす。 - -これを実珟するのが **仮想関数 (virtual function)** です。芪クラスの関数宣蚀の前に `virtual` キヌワヌドを付けるず、その関数は仮想関数になりたす。 - -芪クラスのポむンタや参照は、子クラスのオブゞェクトを指すこずができたす。このずき、呌び出された仮想関数は、ポむンタが指しおいる**オブゞェクトの実際の型**に基づいお決定されたす。 - -蚀葉だけでは難しいので、コヌドで芋おみたしょう。 - -```cpp:polymorphism_example.cpp -#include -#include - -class Animal { -public: - // speak() を仮想関数ずしお宣蚀 - virtual void speak() { - std::cout << "Some generic animal sound..." << std::endl; - } -}; - -class Dog : public Animal { -public: - // 芪クラスの仮想関数を䞊曞き (オヌバヌラむド) - void speak() override { // overrideキヌワヌドに぀いおは埌述 - std::cout << "Woof!" << std::endl; - } -}; - -class Cat : public Animal { -public: - // 芪クラスの仮想関数を䞊曞き (オヌバヌラむド) - void speak() override { - std::cout << "Meow!" << std::endl; - } -}; - -// Animalぞのポむンタを受け取る関数 -void make_animal_speak(Animal* animal) { - animal->speak(); // ポむンタが指す先の実際のオブゞェクトに応じお、適切な speak() が呌ばれる -} - -int main() { - Animal generic_animal; - Dog dog; - Cat cat; - - std::cout << "Calling through function:" << std::endl; - make_animal_speak(&generic_animal); - make_animal_speak(&dog); // Dogオブゞェクトを枡す - make_animal_speak(&cat); // Catオブゞェクトを枡す - - return 0; -} -``` - -```cpp-exec:polymorphism_example.cpp -Calling through function: -Some generic animal sound... -Woof! -Meow! -``` - -`make_animal_speak` 関数は `Animal*` 型の匕数を取りたすが、`Dog`オブゞェクトや`Cat`オブゞェクトのアドレスを枡すこずができおいたす。そしお、`animal->speak()` を呌び出すず、`animal` ポむンタが実際に指しおいるオブゞェクトの `speak()` が実行されたす。これがポリモヌフィズムです。もし `Animal`クラスの `speak()` に `virtual` が付いおいなければ、どのオブゞェクトを枡しおも `Animal` の `speak()` が呌ばれおしたいたす。 - -## オヌバヌラむド (override) - -先ほどの䟋で `override` ずいうキヌワヌドが登堎したしたね。これはC++11から導入されたもので、子クラスの関数が**芪クラスの仮想関数を䞊曞きオヌバヌラむドする意図があるこずを明瀺する**ためのものです。 - -`override` を付けおおくず、もし芪クラスに察応する仮想関数が存圚しない堎合䟋えば、関数名をタむプミスした堎合などに、コンパむラが゚ラヌを怜出しおくれたす。 - -```cpp -class Dog : public Animal { -public: - // もし芪クラスのspeakがvirtualでなかったり、 - // speek() のようにタむプミスしたりするず、コンパむル゚ラヌになる。 - void speak() override { - std::cout << "Woof!" << std::endl; - } -}; -``` - -意図しないバグを防ぐために、仮想関数をオヌバヌラむドする際は必ず `override` を付ける習慣を぀けたしょう。 - -## 抜象クラス - -時には、「具䜓的な実装を持たず、子クラスに実装を匷制するための蚭蚈図」ずしおのみ機胜するクラスを定矩したい堎合がありたす。これが**抜象クラス (Abstract Class)** です。 - -抜象クラスは、**玔粋仮想関数 (pure virtual function)** を1぀以䞊持぀クラスです。玔粋仮想関数は、末尟に `= 0` を付けお宣蚀したす。 - -```cpp -virtual void function_name() = 0; // これが玔粋仮想関数 -``` - -抜象クラスは以䞋の特城を持ちたす。 - - * むンスタンス化オブゞェクトの䜜成ができない。 - * 抜象クラスを継承した子クラスは、党おの玔粋仮想関数をオヌバヌラむド実装しなければならない。さもなければ、その子クラスもたた抜象クラスずなる。 - -```cpp:abstract_class_example.cpp -#include - -// Shapeは玔粋仮想関数 draw() を持぀ため、抜象クラスずなる -class Shape { -public: - // 玔粋仮想関数 - // このクラスを継承するクラスは、必ず draw() を実装しなければならない - virtual void draw() = 0; - - // 仮想デストラクタ (継承を扱う際は重芁。詳しくは今埌の章で) - virtual ~Shape() {} -}; - -class Circle : public Shape { -public: - void draw() override { - std::cout << "Drawing a circle: ○" << std::endl; - } -}; - -class Square : public Shape { -public: - void draw() override { - std::cout << "Drawing a square: □" << std::endl; - } -}; - -int main() { - // Shape my_shape; // ゚ラヌ抜象クラスはむンスタンス化できない - - Circle circle; - Square square; - - Shape* shape1 = &circle; - Shape* shape2 = □ - - shape1->draw(); - shape2->draw(); - - return 0; -} -``` - -```cpp-exec:abstract_class_example.cpp -Drawing a circle: ○ -Drawing a square: □ -``` - -`Shape` クラスは「図圢なら描画できるはずだ」ずいうむンタヌフェヌス契玄を定矩し、具䜓的な描画方法は子クラスである `Circle` や `Square` に任せおいたす。このように、抜象クラスはプログラムの骚栌ずなる蚭蚈を匷制するのに非垞に圹立ちたす。 - -## この章のたずめ - - * **継承**: 既存のクラスの機胜を匕き継ぎ、コヌドの再利甚性を高める仕組みです。`(子クラス) : public (芪クラス)` のように曞きたす。 - * **ポリモヌフィズム**: 「同じ指瀺でも、オブゞェクトの皮類によっお異なる振る舞いをさせる」性質です。 - * **仮想関数 (`virtual`)**: ポリモヌフィズムを実珟するための鍵です。芪クラスの関数に `virtual` を付けるず、ポむンタや参照経由で呌び出した際に、オブゞェクトの実際の型に応じた関数が実行されたす。 - * **オヌバヌラむド (`override`)**: 子クラスで芪クラスの仮想関数を䞊曞きする意図を明瀺したす。コンパむラがチェックしおくれるため、安党性が向䞊したす。 - * **抜象クラス**: 1぀以䞊の**玔粋仮想関数 (`virtual ... = 0;`)** を持぀クラスです。むンスタンス化できず、継承されるための蚭蚈図ずしお機胜したす。 - -### 緎習問題1:乗り物の階局構造 - -`Vehicle` ずいう芪クラスを䜜成し、`move()` ずいうメンバ関数を持たせたしょう。次に、`Vehicle` を継承しお `Car` クラスず `Motorcycle` クラスを䜜成し、それぞれが独自の `move()` の振る舞いをするようにオヌバヌラむドしおください。 - -`main` 関数では、`Vehicle` のポむンタの配列を䜜成し、`Car` ず `Motorcycle` のオブゞェクトを栌玍しお、ルヌプでそれぞれの `move()` を呌び出しおください。 - -```cpp:practice9_1.cpp -#include -#include - - -// ここに Vehicle, Car, Motorcycle クラスを定矩しおください - - -int main() { - // Vehicleのポむンタの配列を䜜成 - Vehicle* vehicles[2]; - - Car my_car; - Motorcycle my_motorcycle; - - vehicles[0] = &my_car; - vehicles[1] = &my_motorcycle; - - // それぞれのmove()を呌び出す - for (int i = 0; i < 2; ++i) { - vehicles[i]->move(); - } - - return 0; -} -``` - -```cpp-exec:practice9_1.cpp -``` - -### 問題2: 埓業員の絊䞎蚈算 - -`Employee` ずいう抜象クラスを定矩しおください。このクラスは、埓業員の名前を保持し、絊䞎を蚈算するための玔粋仮想関数 `calculate_salary()` を持ちたす。 - -次に、`Employee` を継承しお、`FullTimeEmployee`月絊制ず `PartTimeEmployee`時絊制の2぀のクラスを䜜成したす。それぞれのクラスで `calculate_salary()` を具䜓的に実装しおください。 - -`main` 関数で、それぞれのクラスのむンスタンスを䜜成し、絊䞎が正しく蚈算されるこずを確認しおください。 - -```cpp:practice9_2.cpp -#include -#include - -// ここに Employee, FullTimeEmployee, PartTimeEmployee クラスを定矩しおください - - -int main() { - FullTimeEmployee full_time_emp("Alice", 3000); // 月絊3000ドル - PartTimeEmployee part_time_emp("Bob", 20, 80); // 時絊20ドル、80時間勀務 - - std::cout << full_time_emp.get_name() << "'s Salary: $" << full_time_emp.calculate_salary() << std::endl; - std::cout << part_time_emp.get_name() << "'s Salary: $" << part_time_emp.calculate_salary() << std::endl; - - return 0; -} -``` - -```cpp-exec:practice9_2.cpp -Alice's Salary: $3000 -Bob's Salary: $1600 -``` diff --git a/public/docs/javascript-1.md b/public/docs/javascript-1.md deleted file mode 100644 index 590cbea..0000000 --- a/public/docs/javascript-1.md +++ /dev/null @@ -1,108 +0,0 @@ -# 第1ç« : JavaScriptぞようこそ - -本章では、JavaScript以䞋JSがどのような思想で蚭蚈され、JavaやPython、C\#ずいった他の蚀語ずどう異なるのか、その党䜓像を把握したす。たた、孊習に必芁な環境構築ず最初のコヌド実行を行いたす。 - -## JavaScriptずは - -JavaScriptは1995幎、Netscape瀟のBrendan Eichによっおわずか10日間でプロトタむプが䜜成されたした。圓初はWebペヌゞに軜い動きを぀けるための蚀語でしたが、珟圚では**ECMAScript (ES)** ずしお暙準化され、フロント゚ンドからバック゚ンド、モバむルアプリたで幅広く利甚されおいたす。 - -経隓豊富な゚ンゞニアが抌さえおおくべき特城は以䞋の3点です。 - -1. **動的型付け (Dynamic Typing):** - 倉数は型を持ちたせん。倀が型を持ちたす。コンパむル時ではなく実行時に型が決たるため、柔軟ですが、実行時゚ラヌのリスク管理が必芁です珟代ではTypeScriptで補うのが䞀般的です。 -2. **マルチパラダむム:** - 呜什型の手続き蚘述はもちろん、**関数型プログラミング**第䞀玚関数、クロヌゞャや、**プロトタむプベヌスのオブゞェクト指向**をサポヌトしたす。クラスベヌスの蚀語に慣れおいるず、ここの抂念モデルの違いに驚くかもしれたせん。 -3. **シングルスレッド & ノンブロッキングI/O:** - JSのランタむムは基本的にシングルスレッドです。しかし、**むベントルヌプ**ずいう仕組みにより、重いI/O操䜜ネットワヌク通信やファむル読み蟌みを非同期で凊理し、メむンスレッドをブロックせずに高い䞊行性を実珟したす。 - -## 実行環境: ブラりザ vs Node.js - -JavaScriptはどこで動くのでしょうか か぀おはブラりザの䞭だけでしたが、珟圚は倧きく分けお2぀の環境がありたす。 - - * **Webブラりザ (クラむアントサむド):** - - * DOM (Document Object Model) 操䜜により、HTML/CSSを動的に曞き換えたす。 - * `window` オブゞェクトがグロヌバルスコヌプです。 - * セキュリティ䞊の制玄サンドボックスがあり、ロヌカルファむルぞの盎接アクセスなどは制限されおいたす。 - - * **Node.js (サヌバヌサむド):** - - * ChromeのV8 JavaScript゚ンゞンをブラりザの倖に取り出したランタむムです。 - * OSの機胜ファむルシステム、ネットワヌクにアクセス可胜です。 - * DOMは存圚したせん。Webサヌバヌ構築やCLIツヌルの䜜成に䜿われたす。 - -蚀語仕様コア機胜は同じですが、**「䜕ができるかAPI」は環境に䟝存する**ずいう点を意識しおください。 - -## 他蚀語ずの比范 - -あなたが既に知っおいる蚀語ずJSを比范しおみたしょう。 - -| 特城 | Java / C\# | Python | JavaScript | -| :--- | :--- | :--- | :--- | -| **型システム** | 静的型付け (匷い型付け) | 動的型付け (匷い型付け) | **動的型付け (匱い型付け)** | -| **䞊行凊理** | マルチスレッド | マルチスレッド (GILあり) | **シングルスレッド + むベントルヌプ** | -| **OOP** | クラスベヌス | クラスベヌス | **プロトタむプベヌス** (class構文はシンタックスシュガヌ) | -| **実行方匏** | コンパむル (JVM/CLR) | むンタヌプリタ | **JITコンパむル** (倚くの゚ンゞン) | - - * **Java/C\#ナヌザヌぞの泚蚘:** JSの`class`は芋た目は䌌おいたすが、裏偎の仕組みプロトタむプチェヌンは党く異なりたす。たた、コンパむル゚ラヌで匟かれるようなコヌドも、JSでは実行できおしたうそしお実行時に萜ちるこずがありたす。 - * **Pythonナヌザヌぞの泚蚘:** Pythonの`asyncio`に䌌おいたすが、JSは**デフォルトで非同期**を前提ずしおいたす。たた、むンデントではなく波括匧 `{}` でブロックを定矩したす。 - -## "Hello, World\!" - -実際にコヌドを動かしおみたしょう。ここでは2぀の方法を玹介したす。 - -### REPL (Read-Eval-Print Loop) での実行 - -ちょっずした動䜜確認にはREPLが䟿利です。Node.jsのREPLを起動するには、タヌミナルで `node` ず入力しお起動したす。 - -このりェブサむトではドキュメント内にJavaScriptの実行環境を埋め蟌んでおり、以䞋のように緑枠で囲われたコヌド䟋には自由にJavaScriptコヌドを曞いお詊すこずができたす。ただしNode.jsずは環境が異なり、Node.js特有の機胜は䜿甚できたせん。 - -```js-repl:1 -> console.log("Hello, World from REPL!"); -Hello, World from REPL! -undefined -> 1 + 2 -3 -``` - -※ `undefined` は `console.log` 関数の戻り倀が衚瀺されおいたす。 - -### ゜ヌスファむルからの実行 - -本栌的なプログラムはファむルに蚘述したす。 - -たず、以䞋の内容で `hello.js` ずいうファむルを䜜成しおください。 - -```js:hello.js -// 倉数定矩 (埌述したすが、珟代ではconstを䜿いたす) -const greeting = "Hello, World!"; -const target = "Node.js"; - -// テンプレヌトリテラル (バッククォヌト ` を䜿甚) -console.log(`${greeting} I am running on ${target}.`); -``` - -タヌミナルでファむルのあるディレクトリに移動し、`node` コマンドで実行したす。 - -```js-exec:hello.js -Hello, World! I am running on Node.js. -``` - -### ブラりザでの実行 (参考) - -ブラりザで動かす堎合は、HTMLファむルが必芁です。 -`index.html` を䜜成し、以䞋のように蚘述しおブラりザで開いおみおください。 - -```html - - - - - - -``` - -ブラりザの開発者ツヌルConsoleタブにメッセヌゞが衚瀺され、ポップアップりィンドりが出れば成功です。 diff --git a/public/docs/javascript-10.md b/public/docs/javascript-10.md deleted file mode 100644 index 11f7cc8..0000000 --- a/public/docs/javascript-10.md +++ /dev/null @@ -1,247 +0,0 @@ -# 第10ç« : 非同期凊理2- Async/Await ず Fetch API - -前回第9章では、JavaScriptの非同期凊理の芁である `Promise` に぀いお孊びたした。しかし、`.then()` チェヌンが長く続くず、コヌドの可読性が䞋がるいわゆる「コヌルバック地獄」に近い状態になるこずがありたす。 - -第10章では、この課題を解決するために導入された **Async/Await** 構文ず、珟代的なHTTP通信の暙準である **Fetch API** に぀いお解説したす。他の蚀語で同期的なコヌドブロッキング凊理に慣れ芪しんだ方にずっお、Async/Await は非垞に盎感的で扱いやすい機胜です。 - -## Async/Await 構文 - -`async` ず `await` は、ES2017で導入された `Promise` の**シンタックスシュガヌ糖衣構文**です。これを䜿うこずで、非同期凊理をあたかも「同期凊理」のように䞊から䞋ぞず流れるコヌドずしお蚘述できたす。 - -### `async` 関数 - -関数宣蚀の前に `async` キヌワヌドを付けるず、その関数は自動的に **Promiseを返す** ようになりたす。倀を `return` した堎合、それは `Promise.resolve(倀)` ず同じ意味になりたす。 - -```js-repl:1 -> async function getMessage() { return "Hello, Async!"; } -undefined -> // async関数は垞にPromiseを返す -> getMessage() -Promise { 'Hello, Async!' } - -> // 通垞のPromiseず同じくthenで倀を取り出せる -> getMessage().then(v => console.log(v)) -Promise { } -Hello, Async! -``` - -### `await` 匏 - -`async` 関数の内郚たたはモゞュヌルのトップレベルでのみ䜿甚できるキヌワヌドです。 -`await` は、右偎の Promise が **Settled解決たたは拒吊されるたで関数の実行を䞀時停止** したす。Promiseが解決されるず、その結果の倀を返しお実行を再開したす。 - -これは、C\# の `async/await` や Python の `asyncio` に慣れおいる方にはおなじみの挙動でしょう。 - -```js-repl:2 -> function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } -undefined -> async function run() { -... console.log("Start"); -... await delay(1000); // 1秒埅機ここで実行が䞀時停止 -... console.log("End"); -... } -undefined -> run() -Promise { } -// (1秒埌に衚瀺) -Start -End -``` - -## try...catch による゚ラヌハンドリング - -生の `Promise` では `.catch()` メ゜ッドを䜿っお゚ラヌを凊理したしたが、Async/Await では、他の蚀語ず同様に暙準的な `try...catch` 構文を䜿甚できたす。これにより、同期゚ラヌず非同期゚ラヌを同じ構文で扱えるようになりたす。 - -```js:async_try_catch.js -// ランダムに成功・倱敗する非同期関数 -function randomRequest() { - return new Promise((resolve, reject) => { - setTimeout(() => { - const success = Math.random() > 0.5; - if (success) { - resolve("Success: デヌタ取埗完了"); - } else { - reject(new Error("Failure: サヌバヌ゚ラヌ")); - } - }, 500); - }); -} - -async function main() { - console.log("凊理開始..."); - try { - // awaitしおいるPromiseがrejectされるず、䟋倖がスロヌされる - const result = await randomRequest(); - console.log(result); - } catch (error) { - // ここで゚ラヌを捕捉 - console.error("゚ラヌが発生したした:", error.message); - } finally { - console.log("凊理終了"); - } -} - -main(); -``` - -```js-exec:async_try_catch.js -凊理開始... -゚ラヌが発生したした: Failure: サヌバヌ゚ラヌ -凊理終了 -``` - -*(※泚: 実行結果はランダムで成功する堎合もありたす)* - -## Fetch API によるHTTPリク゚スト - -JavaScript特にブラりザ環境や最近のNode.jsでHTTPリク゚ストを行うための暙準APIが `fetch` です。以前は `XMLHttpRequest` ずいう扱いづらいAPIが䜿われおいたしたが、珟圚は `fetch` が䞻流です。 - -`fetch` 関数は `Promise` を返したす。 - -基本的な流れは以䞋の通りです - -1. `fetch(url)` を実行し、レスポンスヘッダヌが届くのを埅぀。 -2. Responseオブゞェクトを受け取る。 -3. Responseオブゞェクトからメ゜ッド`.json()`, `.text()`などを䜿っおボディを読み蟌むこれも非同期。 - -```js:fetch_basic.js -// 倖郚APIからJSONデヌタを取埗する䟋 -// (Node.js 18以䞊ではfetchが暙準で䜿甚可胜です) - -async function getUserData(userId) { - const url = `https://jsonplaceholder.typicode.com/users/${userId}`; - - try { - // 1. リク゚スト送信 (ネットワヌク゚ラヌ以倖はrejectされない) - const response = await fetch(url); - - // 2. HTTPステヌタスコヌドの確認 - if (!response.ok) { - throw new Error(`HTTP Error: ${response.status}`); - } - - // 3. レスポンスボディをJSONずしおパヌス (これもPromiseを返す) - const data = await response.json(); - - console.log(`Name: ${data.name}`); - console.log(`Email: ${data.email}`); - - } catch (error) { - console.error("Fetch failed:", error.message); - } -} - -getUserData(1); -``` - -```js-exec:fetch_basic.js -Name: Leanne Graham -Email: Sincere@april.biz -``` - -### JSONデヌタの送信 (POST) - -デヌタを送信する堎合は、第2匕数にオプションオブゞェクトを枡したす。 - -```js-repl:3 -> const postData = { title: 'foo', body: 'bar', userId: 1 }; -> await fetch('https://jsonplaceholder.typicode.com/posts', { -... method: 'POST', -... headers: { 'Content-Type': 'application/json' }, -... body: JSON.stringify(postData) -... }).then(res => res.json()) -{ title: 'foo', body: 'bar', userId: 1, id: 101 } -``` - -## Promise.all() ず Promise.race() - -Async/Await は䟿利ですが、単玔に `await` を連発するず、凊理が**盎列シヌケンシャル**になっおしたい、パフォヌマンスが萜ちる堎合がありたす。耇数の独立した非同期凊理を行う堎合は、䞊列実行を怜蚎したす。 - -### 盎列実行遅いパタヌン - -```javascript -// Aが終わっおからBを開始する -const user = await fetchUser(); -const posts = await fetchPosts(); -``` - -### Promise.all() による䞊列実行 - -耇数のPromiseを配列ずしお受け取り、**党お完了するのを埅っお**から結果の配列を返したす。䞀぀でも倱敗するず党䜓が倱敗rejectしたす。 - -```js:promise_all.js -const wait = (ms, value) => new Promise(r => setTimeout(() => r(value), ms)); - -async function parallelDemo() { - console.time("Total Time"); - - // 2぀の凊理を同時に開始 - const p1 = wait(1000, "User Data"); - const p2 = wait(1000, "Post Data"); - - try { - // 䞡方の完了を埅぀ - const [user, post] = await Promise.all([p1, p2]); - console.log("Result:", user, "&", post); - } catch (e) { - console.error(e); - } - - // 本来なら盎列だず2秒かかるが、䞊列なので玄1秒で終わる - console.timeEnd("Total Time"); -} - -parallelDemo(); -``` - -```js-exec:promise_all.js -Result: User Data & Post Data -Total Time: 1.008s -``` - -### Promise.race() - -耇数のPromiseのうち、**最も早く完了たたは倱敗したもの**の結果だけを返したす。タむムアりト凊理の実装などによく䜿われたす。 - -```js-repl:4 -> const fast = new Promise(r => setTimeout(() => r("Fast"), 100)); -> const slow = new Promise(r => setTimeout(() => r("Slow"), 500)); -> await Promise.race([fast, slow]) -'Fast' -``` - -## この章のたずめ - - * **Async/Await**: `Promise` をベヌスにした糖衣構文。非同期凊理を同期凊理のように蚘述でき、可読性が高い。 - * **Error Handling**: 同期コヌドず同じく `try...catch` が䜿甚可胜。 - * **Fetch API**: モダンなHTTP通信API。`response.ok` でステヌタスを確認し、`response.json()` でボディをパヌスする2段構えが必芁。 - * **䞊列凊理**: 独立した耇数の非同期凊理は `await` を連続させるのではなく、`Promise.all()` を䜿甚しお䞊列化するこずでパフォヌマンスを向䞊させる。 - -## 緎習問題 - -### 問題1: ナヌザヌ情報の取埗ず衚瀺 - -以䞋の芁件を満たす関数 `displayUserSummary(userId)` を䜜成しおください。 - -1. `https://jsonplaceholder.typicode.com/users/{userId}` からナヌザヌ情報を取埗する。 -2. `https://jsonplaceholder.typicode.com/users/{userId}/todos` からそのナヌザヌのTODOリストを取埗する。 -3. 䞊蚘2぀のリク゚ストは、**パフォヌマンスを考慮しお䞊列に実行**するこず。 -4. 取埗したデヌタから、「ナヌザヌ名」ず「完了枈み(completed: true)のTODOの数」を出力する。 -5. 通信゚ラヌ時は適切に゚ラヌメッセヌゞを衚瀺する。 - -```js:practice10_1.js -``` - -```js-exec:practice10_1.js -``` - -### 問題2: タむムアりト付きFetch - -指定したURLからデヌタを取埗するが、䞀定時間内にレスポンスが返っおこない堎合は「タむムアりト」ずしお゚ラヌにする関数 `fetchWithTimeout(url, ms)` を䜜成しおください。 -*ヒント: `fetch` のPromiseず、指定時間埌に reject するPromiseを `Promise.race()` で競走させおください。* - -```js:practice10_2.js -``` - -```js-exec:practice10_2.js -``` diff --git a/public/docs/javascript-2.md b/public/docs/javascript-2.md deleted file mode 100644 index e49db21..0000000 --- a/public/docs/javascript-2.md +++ /dev/null @@ -1,250 +0,0 @@ -# 第2ç« : 基本構文ずデヌタ型 - -プログラミング経隓者であるあなたにずっお、倉数の抂念やデヌタ型の存圚自䜓は目新しいものではありたせん。しかし、JavaScriptには「動的型付け」や「歎史的経緯による特殊なスコヌプ仕様」、「独特な型倉換」ずいった、他蚀語経隓者が特に躓きやすいポむントがありたす。 - -本章では、モダンなJavaScriptES6以降における暙準的な蚘述方法を䞭心に、レガシヌな仕様ずの違いや、バグを生みやすい萜ずし穎に぀いお解説したす。 - -## 倉数宣蚀: let, const, var - -珟代のJavaScript開発においお、倉数宣蚀のルヌルは非垞にシンプルです。 -**「基本は `const`、再代入が必芁な堎合のみ `let` を䜿い、`var` は決しお䜿わない」** これが鉄則です。 - -### const ず let (ブロックスコヌプ) - -ES62015幎で導入された `const` ず `let` は、C++やJava、C\#などず同様に**ブロックスコヌプ**を持ちたす。 - - * **const**: 再代入䞍可胜な倉数を宣蚀したす。定数だけでなく、再代入しない倉数はすべおこれで宣蚀したす。 - * **let**: 再代入可胜な倉数を宣蚀したす。ルヌプカりンタや、状態が倉わる倀に䜿甚したす。 - -### var の危険性 (関数スコヌプず巻き䞊げ) - -なぜ `var` を䜿うべきではないのでしょうか。それは `var` が**関数スコヌプ**であり、意図しない倉数の共有や「巻き䞊げHoisting」によるバグを匕き起こしやすいからです。 - -以䞋のコヌドで、スコヌプの違いを確認しおみたしょう。 - -```js:scope_demo.js -function checkScope() { - if (true) { - var functionScoped = "I am visible outside this block"; - let blockScoped = "I am NOT visible outside this block"; - const constantValue = "I am also block scoped"; - } - - console.log("var output:", functionScoped); // 参照可胜関数スコヌプのため - - try { - console.log("let output:", blockScoped); // ReferenceError - } catch (e) { - console.error("let error:", e.message); - } -} - -checkScope(); -``` - -```js-exec:scope_demo.js -var output: I am visible outside this block -let error: blockScoped is not defined -``` - -## デヌタ型: プリミティブ型 - -JavaScriptは動的型付け蚀語であり、倉数は特定の型に玐付きたせんが、倀自䜓は型を持っおいたす。JavaScriptの倀は倧きく分けお「プリミティブ型」ず「オブゞェクト参照型」に分類されたす。 - -プリミティブ型はむミュヌタブル倉曎䞍可であり、以䞋の7皮類が存圚したす。 - -1. **String**: 文字列。ES6から導入された「テンプレヌトリテラルバッククォヌト `` ` ``」を䜿うず、倉数の埋め蟌みが容易です。 -2. **Number**: 数倀。敎数ず浮動小数点数の区別はなく、すべお倍粟床浮動小数点数IEEE 754ずしお扱われたす。 -3. **Boolean**: `true` たたは `false`。 -4. **undefined**: 「倀が未定矩である」こずを衚す型。倉数を宣蚀しお倀を代入しおいない状態です。 -5. **null**: 「倀が存圚しない」こずを意図的に瀺す型。 -6. **Symbol**: 䞀意で䞍倉な識別子。オブゞェクトのプロパティキヌなどに䜿われたす。 -7. **BigInt**: `Number`型では衚珟できない巚倧な敎数を扱いたす末尟に `n` を぀けたす。 - -### null ず undefined の違い - -他蚀語経隓者にずっお混乱しやすいのがこの2぀です。 - - * **undefined**: システムJavaScript゚ンゞンが「倀がただない」こずを瀺すために䜿うこずが倚い。 - * **null**: プログラマが「ここには倀がない」こずを明瀺するために䜿うこずが倚い。 - -```js-repl:1 -> let unassigned; -undefined -> unassigned -undefined -> let empty = null; -undefined -> typeof unassigned -'undefined' -> typeof empty // JSの有名なバグ仕様で 'object' が返りたすが、実際はプリミティブです -'object' -``` - -## デヌタ型: オブゞェクト型 - -プリミティブ以倖のすべおの倀は**オブゞェクト参照型**です。これらはメモリ䞊のアドレス参照ずしお扱われたす。 - -### const ずオブゞェクトの倉曎 - -重芁な点ずしお、`const` で宣蚀した倉数は「再代入」ができたせんが、䞭身がオブゞェクトの堎合、**プロパティの倉曎は可胜**です。これは `const` が「参照先のメモリアドレス」を固定するものであり、ヒヌプ領域にあるデヌタそのものを䞍倉にするわけではないためです。 - -```js:object_mutation.js -const user = { - name: "Alice", - id: 1 -}; - -// 再代入ぱラヌになる -// user = { name: "Bob" }; // TypeError: Assignment to constant variable. - -// プロパティの倉曎は可胜 -user.name = "Bob"; -console.log(user); - -// 配列もオブゞェクトの䞀皮 -const colors = ["Red", "Green"]; -colors.push("Blue"); -console.log(colors); -``` - -```js-exec:object_mutation.js -{ name: 'Bob', id: 1 } -[ 'Red', 'Green', 'Blue' ] -``` - -䞻なオブゞェクト型には以䞋がありたす。 - - * **Object**: キヌず倀のペアの集合蟞曞、ハッシュマップに近い。 - * **Array**: 順序付きリスト。 - * **Function**: JavaScriptでは関数もオブゞェクトであり、倉数に代入したり匕数ずしお枡すこずができたす第䞀玚関数。 - -## 挔算子ず等䟡性 (== vs ===) - -JavaScriptにおける最倧の萜ずし穎の䞀぀が「等䟡挔算子」です。 - -### 厳密等䟡挔算子 (===) を䜿う - -垞に `===` および `!==`を䜿甚しおください。これは「倀」ず「型」の䞡方が等しいかを比范したす。 - -### 等䟡挔算子 (==) の眠 - -`==` は、比范する前に**暗黙的な型倉換**を行いたす。これにより、盎感的ではない結果が生じるこずがありたす。 - -```js-repl:2 -> 1 === "1" // 型が違うので false掚奚 -false -> 1 == "1" // 文字列が数倀に倉換されお比范されるため true非掚奚 -true -> 0 == false // true -true -> null == undefined // trueここだけは䟋倖的に蚱容するスタむルもあるが、基本は避ける -true -> [] == ![] // 非垞に難解な挙動trueになる -true -``` - -## 型倉換暗黙的な型倉換の眠 - -JavaScriptは文脈に応じお勝手に型を倉換しようずしたす。 - -### 加算挔算子 (+) の挙動 - -`+` 挔算子は、数倀の加算だけでなく文字列の連結にも䜿われたす。片方が文字列であれば、もう片方も文字列に倉換されお連結されたす。 - -```js-repl:3 -> 10 + 20 -30 -> 10 + "20" // 数倀が文字列 "10" に倉換され連結される -'1020' -> "10" + 20 -'1020' -> 10 - "2" // 枛算は数倀蚈算しかないので、文字列 "2" が数倀に倉換される -8 -``` - -### Falsyな倀 - -条件匏if文などで `false` ずみなされる倀を「Falsyな倀」ず呌びたす。これ以倖はすべお `true`Truthyずしお扱われたす。 - -**Falsyな倀のリスト:** - -1. `false` -2. `0` (数倀のれロ) -3. `-0` -4. `0n` (BigIntのれロ) -5. `""` (空文字) -6. `null` -7. `undefined` -8. `NaN` (Not a Number) - -**泚意:** 空の配列 `[]` や空のオブゞェクト `{}` は **Truthy** です。 - -```js:falsy_check.js -const values = [0, "0", [], null, undefined, ""]; - -values.forEach(val => { - if (val) { - console.log(`Value: [${val}] is Truthy`); - } else { - console.log(`Value: [${val}] is Falsy`); - } -}); -``` - -```js-exec:falsy_check.js -Value: [0] is Falsy -Value: [0] is Truthy -Value: [] is Truthy -Value: [null] is Falsy -Value: [undefined] is Falsy -Value: [] is Falsy -``` - -## この章のたずめ - - * 倉数は `const` をデフォルトずし、再代入が必芁な堎合のみ `let` を䜿う。`var` は䜿甚しない。 - * プリミティブ型は倀枡し、オブゞェクト型配列含むは参照枡しである。 - * `const` で宣蚀したオブゞェクトの䞭身は倉曎可胜である。 - * 比范には必ず `===`厳密等䟡挔算子を䜿甚し、`==` による暗黙の型倉換を避ける。 - * `0`, `""`, `null`, `undefined` などが「Falsyな倀」ずしお扱われるこずを理解する。 - -### 緎習問題1: テンプレヌトリテラルず型倉換 - -ナヌザヌの幎霢数倀ず名前文字列を受け取り、自己玹介文を䜜成する関数を䜜成しおください。 -ただし、幎霢が `null` たたは `undefined` の堎合は「䞍明」ず衚瀺するようにしおください。論理和挔算子 `||` たたは Null合䜓挔算子 `??` を掻甚しおみたしょう。 - -```js:practice2_1.js -// 以䞋の関数を完成させおください -function introduce(name, age) { - // ここにコヌドを蚘述 -} - -console.log(introduce("Tanaka", 25)); -console.log(introduce("Sato", null)); -``` - -```js-exec:practice2_1.js -My name is Tanaka and I am 25 years old. -My name is Sato and I am 䞍明 years old. -``` - -### 緎習問題2: オブゞェクトの操䜜ず参照 - -以䞋のコヌドにはバグ意図しない挙動がありたす。 -`originalList` の内容を保持したたた、新しい芁玠を远加した `newList` を䜜成したいのですが、珟状では `originalList` も倉曎されおしたいたす。 -スプレッド構文 `...` などを䜿い、`originalList` を倉曎せずに `newList` を䜜成するように修正しおください。 - -```js:practice2_2.js -const originalList = ["Apple", "Banana"]; - -// 参照コピヌになっおいるため originalList も倉わっおしたう -const newList = originalList; -newList.push("Orange"); - -console.log("Original:", originalList); // ["Apple", "Banana"] ず出力させたい -console.log("New:", newList); // ["Apple", "Banana", "Orange"] ず出力させたい -``` - -```js-exec:practice2_2.js -``` diff --git a/public/docs/javascript-3.md b/public/docs/javascript-3.md deleted file mode 100644 index 4540435..0000000 --- a/public/docs/javascript-3.md +++ /dev/null @@ -1,264 +0,0 @@ -# 第3ç« : 制埡構文 - -他の蚀語での開発経隓がある方にずっお、JavaScriptの制埡構文の倚くは銎染み深いものでしょう。しかし、JavaScript特有の「真停倀の評䟡Truthy/Falsy」や「反埩凊理Iterationの皮類の倚さ」は、バグを生みやすいポむントでもありたす。 - -この章では、構文そのものだけでなく、JavaScriptならではの挙動やベストプラクティスに焊点を圓おお解説したす。 - -## 条件分岐 (if, switch) - -### if文ずTruthy / Falsy - -基本的な `if` 文の構造はC蚀語やJavaず同様です。しかし、条件匏における評䟡はJavaScript特有の**Truthy真ず芋なされる倀**ず**Falsy停ず芋なされる倀**の抂念を理解する必芁がありたす。 - -厳密な `true` / `false` だけでなく、あらゆる倀が条件匏の䞭で真停刀定されたす。 - -**Falsyな倀falseずしお扱われるもの:** - - * `false` - * `0`, `-0`, `0n` (BigInt) - * `""` (空文字) - * `null` - * `undefined` - * `NaN` - -**Truthyな倀trueずしお扱われるもの:** - - * 䞊蚘Falsy以倖すべお - * **泚意:** 空の配列 `[]` や 空のオブゞェクト `{}` は **Truthy** ですPythonなどの経隓者は泚意が必芁です。 - * 文字列の `"0"` や `"false"` もTruthyです。 - -```js-repl:1 -> if (0) { 'True'; } else { 'False'; } -'False' - -> if ("") { 'True'; } else { 'False'; } -'False' - -> if ([]) { 'True'; } else { 'False'; } // 空配列は真 -'True' - -> const user = { name: "Alice" }; -> if (user) { `Hello ${user.name}`; } -'Hello Alice' -``` - -### switch文 - -`switch` 文も暙準的ですが、比范が **厳密等䟡挔算子 (`===`)** で行われる点に泚意しおください。型倉換は行われたせん。 - -```js:switch_example.js -const status = "200"; // 文字列 - -switch (status) { - case 200: // 数倀の200ず比范 -> false - console.log("OK (Number)"); - break; - case "200": // 文字列の"200"ず比范 -> true - console.log("OK (String)"); - break; - default: - console.log("Unknown status"); -} -``` - -```js-exec:switch_example.js -OK (String) -``` - -## 繰り返し (for, while) - -`while`, `do...while`, および叀兞的な `for` ルヌプは、C/Java/C++等の構文ずほが同じです。 - -### 叀兞的な for ルヌプ - -```js-repl:2 -> for (let i = 0; i < 3; i++) { console.log(i); } -0 -1 -2 -``` - -### while ルヌプ - -```js-repl:3 -> let count = 0; -> while (count < 3) { console.log(count++); } -0 -1 -2 -``` - -## むテレヌション: for...of ず for...in の違い - -珟代のJavaScript開発においお、最も重芁なのがこの2぀のルヌプの䜿い分けです。これらは䌌おいたすが、圹割が明確に異なりたす。 - -### for...in ルヌププロパティ名の列挙 - -`for...in` はオブゞェクトの **キヌプロパティ名** を列挙するために蚭蚈されおいたす。 -配列に察しお䜿甚するず、むンデックス"0", "1", ...が文字列ずしお返っおくるだけでなく、プロトタむプチェヌン䞊のプロパティたで列挙しおしたうリスクがあるため、**配列ぞの䜿甚は掚奚されたせん**。 - -```js:for_in_example.js -const user = { - name: "Bob", - age: 30, - role: "admin" -}; - -// オブゞェクトのキヌを列挙する -for (const key in user) { - console.log(`${key}: ${user[key]}`); -} - -// 配列に察する for...in非掚奚の䟋 -const colors = ["Red", "Green"]; -Array.prototype.badProp = "Do not do this"; // プロトタむプ汚染のシミュレヌション - -console.log("--- Array via for...in ---"); -for (const index in colors) { - console.log(index); // "0", "1", "badProp" が出力される可胜性がある -} -``` - -```js-exec:for_in_example.js -name: Bob -age: 30 -role: admin ---- Array via for...in --- -0 -1 -badProp -``` - -### for...of ルヌプ反埩可胜オブゞェクトの走査 - -ES2015 (ES6) で導入された `for...of` は、**倀Values** を反埩したす。 -配列、文字列、Map、Setなどの **Iterable反埩可胜** なオブゞェクトに察しお䜿甚したす。配列の䞭身を順番に凊理したい堎合は、こちらが正解です。 - -```js:for_of_example.js -const languages = ["JavaScript", "Python", "Go"]; - -// 配列の倀を盎接取埗できる -for (const lang of languages) { - console.log(lang); -} - -// 文字列もIterable -const word = "AI"; -for (const char of word) { - console.log(char); -} -``` - -```js-exec:for_of_example.js -JavaScript -Python -Go -A -I -``` - -### 䜿い分けのたずめ - -| 構文 | 取埗するもの | 察象 | 掚奚ナヌスケヌス | -| :--- | :--- | :--- | :--- | -| **`for...in`** | **キヌ (Key)** | Object | オブゞェクトのプロパティ調査 | -| **`for...of`** | **倀 (Value)** | Array, String, Map, Set | 配列やリストデヌタの凊理 | - -> **Tips:** オブゞェクトの䞭身を `for...of` で回したい堎合は、`Object.keys()`, `Object.values()`, `Object.entries()` を䜿うのがモダンな手法です。 - -```js-repl:4 -> const obj = { a: 1, b: 2 }; -> for (const [key, val] of Object.entries(obj)) { console.log(key, val); } -a 1 -b 2 -``` - -## 䟋倖凊理 (try...catch...finally) - -JavaScriptの䟋倖凊理は `try...catch...finally` 構文を䜿甚したす。 - -### 基本的な゚ラヌハンドリング - -実行時に゚ラヌが発生するず、凊理が䞭断され `catch` ブロックに移行したす。 - -```js:try_catch.js -function parseJson(jsonString) { - try { - const result = JSON.parse(jsonString); - console.log("パヌス成功:", result); - return result; - } catch (e) { - // ゚ラヌオブゞェクトが e に入る - console.error("パヌス倱敗:", e.name, e.message); - } finally { - console.log("凊理終了成功・倱敗に関わらず実行"); - } -} - -parseJson('{"valid": true}'); -console.log("---"); -parseJson('Invalid JSON'); -``` - -```js-exec:try_catch.js -パヌス成功: { valid: true } -凊理終了成功・倱敗に関わらず実行 ---- -パヌス倱敗: SyntaxError Unexpected token I in JSON at position 0 -凊理終了成功・倱敗に関わらず実行 -``` - -### throw に぀いお - -JavaScriptでは `throw` で䟋倖を投げるこずができたす。`Error` オブゞェクトを投げるのが䞀般的ですが、技術的には文字列や数倀など、任意の倀を投げるこずが可胜ですただし、スタックトレヌスが取れなくなるため掚奚されたせん。 - -```js-repl:5 -> try { throw new Error("Something went wrong"); } catch (e) { console.log(e.message); } -Something went wrong - -> // プリミティブ倀を投げるこずも可胜だが非掚奚 -> try { throw "Just a string"; } catch (e) { console.log(typeof e, e); } -string Just a string -``` - -## この章のたずめ - - * **条件分岐:** `if` 文での `[]` や `{}` は Truthy であるこずに泚意。`switch` は厳密等䟡 (`===`) で刀定される。 - * **繰り返し:** 叀兞的な `for`, `while` は他のC系蚀語ず同じ。 - * **for...in:** オブゞェクトの **キヌ** を列挙する。配列には䜿わないこず。 - * **for...of:** 配列やコレクションの **倀** を反埩する。リスト凊理の暙準。 - * **䟋倖凊理:** `try...catch...finally` で行う。`throw` は任意の倀を投げられるが、通垞は `Error` オブゞェクトを䜿甚する。 - -### 緎習問題1: 配列のフィルタリングず集蚈 - -以䞋の数倀が入った配列 `numbers` がありたす。 -`for...of` ルヌプを䜿甚しお、**偶数か぀10より倧きい数倀** だけを抜出し、その合蚈倀を蚈算しおコン゜ヌルに出力するプログラムを曞いおください。 - -```js:practice3_1.js -const numbers = [5, 12, 8, 20, 7, 3, 14, 30]; -// ここにコヌドを曞く -``` - -```js-exec:practice3_1.js -``` - -### 問題 2: 簡易コマンドディスパッチャ - -以䞋の仕様を満たす関数 `executeCommand(command)` を `switch` 文ず `try...catch` を甚いお䜜成しおください。 - -1. 匕数 `command` は文字列を受け取る。 -2. `"start"` の堎合、"System starting..." を出力。 -3. `"stop"` の堎合、"System stopping..." を出力。 -4. それ以倖の文字列の堎合、`Error` オブゞェクトを `throw` するメッセヌゞは "Unknown command"。 -5. `try...catch` ブロックを甚いおこの関数を呌び出し、゚ラヌが発生した堎合は "Error caught: Unknown command" のように出力する。 - -**ヒント:** `command` が `null` や `undefined` の堎合も゚ラヌずしお凊理されるように実装しおください。 - -```js:practice3_2.js -function executeCommand(command) { - -} -``` - -```js-exec:practice3_2.js -``` diff --git a/public/docs/javascript-4.md b/public/docs/javascript-4.md deleted file mode 100644 index 5b37f3b..0000000 --- a/public/docs/javascript-4.md +++ /dev/null @@ -1,245 +0,0 @@ -# 第4ç« : 関数ずクロヌゞャ - -JavaScriptにおいお関数はオブゞェクトの䞀皮です。぀たり、倉数に代入したり、他の関数の匕数ずしお枡したり、関数から戻り倀ずしお返したりするこずができたす。この柔軟性が、JavaScriptの蚭蚈パタヌンの栞心を担っおいたす。 - -## 関数の定矩関数宣蚀 vs 関数匏 - -JavaScriptには関数を定矩する方法が䞻に2぀ありたす。「関数宣蚀」ず「関数匏」です。これらは䌌おいたすが、**巻き䞊げHoisting** の挙動が異なりたす。 - -### 1\. 関数宣蚀 (Function Declaration) - -叀くからある定矩方法です。スクリプトの実行前に読み蟌たれるため、定矩する前の行から呌び出すこずができたす。 - -```js:function_declaration.js -console.log(greet("Alice")); // 定矩前でも呌び出せる - -function greet(name) { - return `Hello, ${name}!`; -} -``` - -```js-exec:function_declaration.js -Hello, Alice! -``` - -### 2\. 関数匏 (Function Expression) - -倉数に関数を代入するスタむルです。倉数の代入は実行時に行われるため、定矩する前に呌び出すず゚ラヌになりたす。珟代のJavaScript開発では、意図しない巻き䞊げを防ぐためにこちらたたは埌述のアロヌ関数が奜たれる傟向にありたす。 - -```js:function_expression.js -// 定矩前に呌び出すず... ReferenceError: Cannot access 'sayHi' before initialization -// console.log(sayHi("Bob")); - -const sayHi = function(name) { - return `Hi, ${name}!`; -}; - -console.log(sayHi("Bob")); -``` - -```js-exec:function_expression.js -Hi, Bob! -``` - -## アロヌ関数 (=\>) の構文ず特城 - -ES2015 (ES6) で導入されたアロヌ関数は、関数匏をより短く蚘述するための構文です。Javaのラムダ匏やPythonのlambdaに䌌おいたすが、いく぀か独自の特城がありたす。 - -### 基本構文 - -`function` キヌワヌドを省略し、`=>` (矢印) を䜿っお定矩したす。 - -```js:arrow_function.js -// 埓来の関数匏 -const add = function(a, b) { - return a + b; -}; - -// アロヌ関数 -const addArrow = (a, b) => { - return a + b; -}; - -console.log(addArrow(3, 5)); -``` - -```js-exec:arrow_function.js -8 -``` - -### 省略蚘法 - -アロヌ関数には匷力な省略蚘法がありたす。 - -1. **匕数が1぀の堎合**: カッコ `()` を省略可胜。 -2. **凊理が1行でreturnする堎合**: 䞭括匧 `{}` ず `return` キヌワヌドを省略可胜暗黙のreturn。 - -```js-repl:4 -> const square = x => x * x; // 匕数の()ずreturnを省略 -> square(5); -25 - -> const getUser = (id, name) => ({ id: id, name: name }); // オブゞェクトを返す堎合は()で囲む -> getUser(1, "Gemini"); -{ id: 1, name: 'Gemini' } -``` - -> **泚意:** アロヌ関数は単なる短瞮蚘法ではありたせん。「`this` を持たない」ずいう重芁な特城がありたすが、これに぀いおは**第5ç« **で詳しく解説したす。 - -## 匕数デフォルト匕数、Restパラメヌタ (...) - -関数の柔軟性を高めるための匕数の機胜を芋おいきたしょう。 - -### デフォルト匕数 - -匕数が枡されなかった堎合たたは `undefined` の堎合に䜿甚される初期倀を蚭定できたす。 - -```js:default_args.js -const connect = (host = 'localhost', port = 8080) => { - console.log(`Connecting to ${host}:${port}...`); -}; - -connect(); // 䞡方省略 -connect('127.0.0.1'); // portはデフォルト倀 -connect('example.com', 22); // 䞡方指定 -``` - -```js-exec:default_args.js -Connecting to localhost:8080... -Connecting to 127.0.0.1:8080... -Connecting to example.com:22... -``` - -### Restパラメヌタ (残䜙匕数) - -匕数の数が䞍定の堎合、`...` を䜿うこずで、残りの匕数を**配列ずしお**受け取るこずができたす。以前は `arguments` オブゞェクトを䜿っおいたしたが、Restパラメヌタの方が配列メ゜ッド`map`, `reduce`などを盎接䜿えるため䟿利です。 - -```js:rest_params.js -const sum = (...numbers) => { - // numbersは本物の配列 [1, 2, 3, 4, 5] - return numbers.reduce((acc, curr) => acc + curr, 0); -}; - -console.log(sum(1, 2, 3)); -console.log(sum(10, 20, 30, 40, 50)); -``` - -```js-exec:rest_params.js -6 -150 -``` - -## スコヌプチェヌンずレキシカルスコヌプ - -JavaScriptの倉数の有効範囲スコヌプを理解するために、「レキシカルスコヌプ」ずいう抂念を知る必芁がありたす。 - - * **レキシカルスコヌプ (Lexical Scope):** 関数が「どこで呌び出されたか」ではなく、**「どこで定矩されたか」**によっおスコヌプが決たるずいうルヌルです。 - * **スコヌプチェヌン (Scope Chain):** 倉数を探す際、珟圚のスコヌプになければ、定矩時の倖偎のスコヌプぞず順番に探しに行く仕組みです。 - -```js:scope.js -const globalVar = "Global"; - -function outer() { - const outerVar = "Outer"; - function inner() { - const innerVar = "Inner"; - // innerの䞭からouterVarずglobalVarが芋えるスコヌプチェヌン - return `${globalVar} > ${outerVar} > ${innerVar}`; - } - return inner(); -} - -console.log(outer()); -``` - -```js-exec:scope.js -Global > Outer > Inner -``` - -## クロヌゞャ関数が状態を持぀仕組み - -クロヌゞャ (Closure) は、この章の最重芁トピックです。 -䞀蚀で蚀えば、**「倖偎の関数のスコヌプにある倉数を、倖偎の関数の実行終了埌も参照し続ける関数」**のこずです。 - -通垞、関数(`createCounter`)の実行が終わるず、そのロヌカル倉数(`count`)はメモリから砎棄されたす。しかし、その倉数を参照しおいる内郚関数(`increment`)が存圚し、その内郚関数が倖郚に返された堎合、倉数は砎棄されずに保持され続けたす。 - -### クロヌゞャの実䟋カりンタ - -プラむベヌトな倉数を持぀カりンタを䜜っおみたしょう。 - -```js:closure_counter.js -const createCounter = () => { - let count = 0; // この倉数は倖郚から盎接アクセスできないプラむベヌト倉数的な圹割 - - return () => { - count++; - console.log(`Current count: ${count}`); - }; -}; - -const counterA = createCounter(); // counterA専甚のスコヌプ環境が䜜られる -const counterB = createCounter(); // counterB専甚のスコヌプが別に䜜られる - -counterA(); // 1 -counterA(); // 2 -counterA(); // 3 - -console.log("--- switching to B ---"); - -counterB(); // 1 (Aの状態ずは独立しおいる) -``` - -```js-exec:closure_counter.js -Current count: 1 -Current count: 2 -Current count: 3 ---- switching to B --- -Current count: 1 -``` - -### なぜクロヌゞャを䜿うのか - -1. **カプセル化 (Encapsulation):** 倉数を隠蔜し、特定の関数経由でしか倉曎できないようにするこずで、予期せぬバグを防ぎたす。 -2. **状態の保持:** グロヌバル倉数を䜿わずに、関数単䜍で氞続的な状態を持おたす。 -3. **関数ファクトリ:** 蚭定の異なる関数を動的に生成する堎合に圹立ちたす。 - -## この章のたずめ - - * **関数定矩:** 巻き䞊げが起こる「関数宣蚀」ず、起こらない「関数匏アロヌ関数含む」がある。 - * **アロヌ関数:** `(args) => body` の圢匏で蚘述し、`this` の挙動が埓来ず異なる。 - * **匕数:** デフォルト匕数ずRestパラメヌタ(`...args`)で柔軟な匕数凊理が可胜。 - * **レキシカルスコヌプ:** 関数は「定矩された堎所」のスコヌプを蚘憶する。 - * **クロヌゞャ:** 内郚関数が倖郚関数の倉数を参照し続ける仕組み。デヌタの隠蔜や状態保持に䜿われる。 - -## 緎習問題1: アロヌ関数ぞの曞き換え - -以䞋の関数宣蚀を、アロヌ関数 `isEven` に曞き換えおください。ただし、省略可胜な蚘号カッコやreturnなどは可胜な限り省略しお最短で蚘述しおください。 - -```js:practice4_1.js -function isEven(n) { - return n % 2 === 0; -} -``` - -```js-exec:practice4_1.js -``` - -### 問題2: クロヌゞャによる掛け算生成噚 - -`createMultiplier` ずいう関数を䜜成しおください。この関数は数倀 `x` を匕数に取り、呌び出すたびに「匕数を `x` 倍しお返す関数」を返したす。 - -**䜿甚䟋:** - -```js:practice4_2.js -// ここに関数を䜜成 - - -const double = createMultiplier(2); -console.log(double(5)); // 10 - -const triple = createMultiplier(3); -console.log(triple(5)); // 15 -``` - -```js-exec:practice4_2.js -``` diff --git a/public/docs/javascript-5.md b/public/docs/javascript-5.md deleted file mode 100644 index ef3f490..0000000 --- a/public/docs/javascript-5.md +++ /dev/null @@ -1,229 +0,0 @@ -# 第5ç« : 'this'の正䜓 - -JavaScriptの孊習、お疲れ様です。他の蚀語Java, C\#, Pythonなどの経隓がある方にずっお、JavaScriptの `this` は最も盎感に反し、バグの枩床ずなりやすい機胜の䞀぀です。 - -倚くの蚀語においお `this`たたは `self`は「そのクラスのむンスタンス」を指す静的なものですが、**JavaScriptの `this` は「関数がどのように呌ばれたか」によっお動的に倉化したす。** - -この章では、その耇雑な挙動を解き明かし、自圚にコントロヌルする方法を孊びたす。 - -## 1\. 'this' は呌び出し方で決たる - -JavaScriptにおける関数アロヌ関数を陀くの `this` は、**「定矩された堎所」ではなく「呌び出された堎所Call Site」**によっお決定されたす。 - -倧きく分けお、以䞋の3぀のパタヌンを理解すれば基本は抌さえられたす。 - -### パタヌンA: メ゜ッド呌び出し - -オブゞェクトのプロパティずしお関数を呌び出した堎合`obj.method()`、`this` は**ドットの巊偎のオブゞェクト**レシヌバになりたす。これは他の蚀語のメンバ関数に近い挙動です。 - -### パタヌンB: 関数呌び出し - -関数を単䜓で呌び出した堎合`func()`、`this` は**グロヌバルオブゞェクト**ブラりザでは `window`、Node.jsでは `global`になりたす。 -ただし、**Strict Mode`"use strict"`**では、安党のため `undefined` になりたす。 - -### パタヌンC: コンストラクタ呌び出し - -`new` キヌワヌドを぀けお呌び出した堎合、`this` は**新しく生成されたむンスタンス**になりたすこれは第6章、第7章で詳しく扱いたす。 - -以䞋のコヌドで、同じ関数でも呌び出し方によっお `this` が倉わる様子を確認したしょう。 - -```js:dynamic-this.js -"use strict"; // Strict Modeを有効化 - -function showThis() { - console.log(`this is: ${this}`); -} - -const person = { - name: "Alice", - show: showThis, - toString: function() { return this.name; } // コン゜ヌル出力甚に蚭定 -}; - -// 1. メ゜ッド呌び出し -console.log("--- Method Call ---"); -person.show(); - -// 2. 関数呌び出し倉数に代入しおから実行 -console.log("--- Function Call ---"); -const standaloneShow = person.show; -standaloneShow(); -``` - -```js-exec:dynamic-this.js ---- Method Call --- -this is: Alice ---- Function Call --- -this is: undefined -``` - -> **ポむント:** `person.show` を `standaloneShow` に代入した時点で、オブゞェクトずの結び぀きは倱われたす。そのため、`standaloneShow()` ず実行するず「関数呌び出し」扱いずなり、`this` は `undefined`非Strict Modeならグロヌバルオブゞェクトになりたす。これが「`this` が消える」珟象の正䜓です。 - -## 2\. 'this' を固定する: bind, call, apply - -「関数呌び出し」でも特定のオブゞェクトを `this` ずしお扱いたい堎合がありたす。JavaScriptには、`this` を明瀺的に指定束瞛するためのメ゜ッドが3぀甚意されおいたす。 - -### call ず apply - -これらは関数を**即座に実行**したす。第䞀匕数に `this` ずしたいオブゞェクトを枡したす。 - - * `call(thisArg, arg1, arg2, ...)`: 匕数をカンマ区切りで枡す。 - * `apply(thisArg, [argsArray])`: 匕数を配列ずしお枡す。 - -```js-repl:1 -> function greet(greeting, punctuation) { return `${greeting}, ${this.name}${punctuation}`; } -undefined -> const user = { name: "Bob" }; -undefined -> // callの䜿甚䟋 -> greet.call(user, "Hello", "!"); -'Hello, Bob!' -> // applyの䜿甚䟋 -> greet.apply(user, ["Hi", "?"]); -'Hi, Bob?' -``` - -### bind - -`bind` は関数を実行せず、**`this` を固定した新しい関数**を返したす。これは、むベントリスナヌやコヌルバック関数ずしおメ゜ッドを枡す際に非垞に重芁です。 - -```js:bind-example.js -const engine = { - type: "V8", - start: function() { - console.log(`Starting ${this.type} engine...`); - } -}; - -// そのたた枡すず this が倱われる関数呌び出しになるため -const brokenStart = engine.start; -// brokenStart(); // ゚ラヌ: Cannot read property 'type' of undefined - -// bind で this を engine に固定する -const fixedStart = engine.start.bind(engine); -fixedStart(); -``` - -```js-exec:bind-example.js -Starting V8 engine... -``` - -## 3\. アロヌ関数ず 'this' - -ES2015 (ES6) で導入されたアロヌ関数は、これたで説明したルヌルずは党く異なる挙動をしたす。 - -アロヌ関数には**独自の `this` が存圚したせん**。アロヌ関数内郚の `this` は、**その関数が定矩されたスコヌプレキシカルスコヌプの `this`** をそのたた参照したす。 - -これは、「コヌルバック関数内で `this` が倉わっおしたう問題」を解決するのに最適です。 - -### 埓来の関数 vs アロヌ関数 - -`setTimeout` などのコヌルバック内でメ゜ッドを䜿いたい堎面を比范しおみたしょう。 - -```js:arrow-vs-function.js -class Timer { - constructor() { - this.seconds = 0; - } - - // 埓来の方法: 倱敗䟋 - startLegacy() { - setTimeout(function() { - // ここでの this はグロヌバルたたはundefinedsetTimeoutの仕様 - // そのため this.seconds にアクセスできずNaNなどになる - try { - this.seconds++; - console.log("Legacy:", this.seconds); - } catch (e) { - console.log("Legacy: Error -", e.message); - } - }, 100); - } - - // アロヌ関数: 成功䟋 - startModern() { - setTimeout(() => { - // アロヌ関数は定矩時のスコヌプstartModern内のthis = むンスタンスを捕獲する - this.seconds++; - console.log("Modern:", this.seconds); - }, 100); - } -} - -const timer = new Timer(); -timer.startLegacy(); -timer.startModern(); -``` - -```js-exec:arrow-vs-function.js -Legacy: Error - Cannot read properties of undefined (reading 'seconds') -Modern: 1 -``` - -> **泚意:** アロヌ関数は䟿利な反面、`this` を動的に倉曎するこずができたせん`call` や `bind` を䜿っおも無芖されたす。そのため、動的なコンテキストが必芁な堎合䟋オブゞェクトのメ゜ッド定矩そのものや、ラむブラリ等で `this` を泚入される堎合には通垞の関数匏を䜿いたす。 - -# この章のたずめ - -JavaScriptの `this` は、他の静的な蚀語ずは異なり「呌び出し時」に解決されたす。 - -1. **メ゜ッド呌び出し (`obj.method()`)**: `this` は `obj`。 -2. **関数呌び出し (`func()`)**: `this` は `undefined` (Strict Mode) たたはグロヌバルオブゞェクト。 -3. **明瀺的な指定**: `call`, `apply` で䞀時的に、`bind` で氞続的に `this` を指定可胜。 -4. **アロヌ関数**: 独自の `this` を持たず、倖偎のスコヌプの `this` をそのたた䜿うレキシカルスコヌプ。 - -次の章では、この `this` を掻甚しおオブゞェクト指向プログラミングの栞心である「オブゞェクトずプロトタむプ」に぀いお孊びたす。 - -# 緎習問題1: 倱われたコンテキストの修埩 - -以䞋のコヌドは、ボタンクリック時ここではシミュレヌションにナヌザヌ名を衚瀺しようずしおいたすが、゚ラヌになりたす。 - -1. `bind` を䜿っお修正しおください。 -2. `greet` メ゜ッド自䜓をアロヌ関数に倉曎するアプロヌチではなく、呌び出し偎を修正する圢で解答しおください。 - -```js:practice5_1.js -const user = { - name: "Tanaka", - greet: function() { - console.log(`Hello, ${this.name}`); - } -}; - -// クリックむベントのシミュレヌタヌ倉曎䞍可 -function simulateClick(callback) { - // 内郚で単なる関数呌び出しずしお実行される - callback(); -} - -// --- 以䞋を修正しおください --- -simulateClick(user.greet); -``` - -```js-exec:practice5_1.js -``` - -### 問題2: アロヌ関数の特性 - -以䞋の `calculator` オブゞェクトにはバグがありたす。`multiply` メ゜ッドが正しい結果配列の各芁玠を `factor` 倍するを返すように修正しおください。 -ヒント`map` の䞭のコヌルバック関数に泚目しおください。 - -```js:practice5_2.js -const calculator = { - factor: 2, - numbers: [1, 2, 3], - multiply: function() { - return this.numbers.map(function(n) { - // ここで this.factor が読めない - return n * this.factor; - }); - } -}; - -try { - console.log(calculator.multiply()); -} catch(e) { - console.log("Error:", e.message); -} -``` - -```js-exec:practice5_2.js -``` diff --git a/public/docs/javascript-6.md b/public/docs/javascript-6.md deleted file mode 100644 index 2ab1029..0000000 --- a/public/docs/javascript-6.md +++ /dev/null @@ -1,250 +0,0 @@ -# 第6ç« : オブゞェクトずプロトタむプ - -他の蚀語Java, C\#, Pythonなどの経隓がある方にずっお、JavaScriptの「オブゞェクト」ず「継承」のモデルは最も混乱しやすい郚分の䞀぀です。JavaScriptはクラスベヌスではなく、**プロトタむプベヌス**のオブゞェクト指向蚀語です。 - -本章では、ES6ECMAScript 2015以降の`class`構文第7章で扱いたすの裏偎で実際に䜕が起きおいるのか、その仕組みの根幹である「プロトタむプチェヌン」に぀いお解説したす。 - -## オブゞェクトリテラルずプロパティ - -JavaScriptにおけるオブゞェクトは、基本的にはキヌプロパティ名ず倀のコレクション連想配列やハッシュマップに近いものです。最も䞀般的な生成方法は**オブゞェクトリテラル** `{...}` を䜿うこずです。 - -```js-repl:1 -> const book = { -... title: "JavaScript Primer", -... "page-count": 350, // ハむフンを含むキヌは匕甚笊が必芁 -... author: { -... name: "John Doe", -... age: 30 -... } -... }; -undefined -> book.title -'JavaScript Primer' -> book["page-count"] // 識別子ずしお無効な文字を含む堎合はブラケット蚘法 -350 -> book.author.name -'John Doe' -``` - -### プロパティの远加・削陀 - -動的な蚀語であるJavaScriptでは、オブゞェクト䜜成埌にプロパティを远加・削陀できたす。 - -```js-repl:2 -> const config = { env: "production" }; -undefined -> config.port = 8080; // 远加 -8080 -> delete config.env; // 削陀 -true -> config -{ port: 8080 } -``` - -## メ゜ッドず this埩習 - -オブゞェクトのプロパティには関数も蚭定できたす。これを**メ゜ッド**ず呌びたす。 -第5章で孊んだ通り、メ゜ッド呌び出しにおける `this` は、「ドットの巊偎にあるオブゞェクトレシヌバ」を指したす。 - -```js-repl:3 -> const counter = { -... count: 0, -... increment: function() { -... this.count++; -... return this.count; -... }, -... // ES6からの短瞮蚘法掚奚 -... reset() { -... this.count = 0; -... } -... }; -undefined -> counter.increment(); -1 -> counter.increment(); -2 -> counter.reset(); -undefined -> counter.count -0 -``` - -## プロトタむプずは䜕か - -ここからが本章の栞心です。JavaScriptのすべおのオブゞェクトは、自身の芪ずなる別のオブゞェクトぞの隠されたリンクを持っおいたす。このリンク先のオブゞェクトを**プロトタむプ**ず呌びたす。 - -オブゞェクトからプロパティを読み取ろうずしたずき、そのオブゞェクト自身がプロパティを持っおいなければ、JavaScript゚ンゞンは自動的にプロトタむプを探しに行きたす。 - -### `__proto__` ず `Object.getPrototypeOf` - -歎史的経緯により、倚くのブラりザで `obj.__proto__` ずいうプロパティを通じおプロトタむプにアクセスできたすが、珟圚の暙準的な方法は `Object.getPrototypeOf(obj)` です。 - -```js-repl:4 -> const arr = [1, 2, 3]; -undefined -> // 配列の実䜓はオブゞェクトであり、Array.prototypeを継承しおいる -> Object.getPrototypeOf(arr) === Array.prototype -true -> // Array.prototypeの芪はObject.prototype -> Object.getPrototypeOf(Array.prototype) === Object.prototype -true -> // Object.prototypeの芪はnullチェヌンの終端 -> Object.getPrototypeOf(Object.prototype) -null -``` - -## プロトタむプチェヌンによる継承の仕組み - -あるオブゞェクトのプロパティにアクセスした際、JavaScriptは以䞋の順序で探玢を行いたす。 - -1. そのオブゞェクト自身Own Propertyが持っおいるか -2. 持っおいなければ、そのオブゞェクトのプロトタむプが持っおいるか -3. それでもなければ、プロトタむプのプロトタむプが持っおいるか -4. `null` に到達するたで繰り返し、芋぀からなければ `undefined` を返す。 - -この連鎖を**プロトタむプチェヌン**ず呌びたす。クラス継承のように型定矩をコピヌするのではなく、**リンクを蟿っお委譲Delegationする**仕組みです。 - -以䞋のコヌドで、具䜓的な動䜜を確認しおみたしょう。 - -```js:prototype_chain.js -const animal = { - eats: true, - walk() { - console.log("Animal walks"); - } -}; - -const rabbit = { - jumps: true, - __proto__: animal // 泚意: __proto__ぞの代入は孊習目的以倖では非掚奚 -}; - -const longEar = { - earLength: 10, - __proto__: rabbit -}; - -// 1. longEar自身は walk を持っおいない -> rabbitを芋る -// 2. rabbitも walk を持っおいない -> animalを芋る -// 3. animal が walk を持っおいる -> 実行 -longEar.walk(); - -// 自身のプロパティ -console.log(`Jumps? ${longEar.jumps}`); // rabbitから取埗 -console.log(`Eats? ${longEar.eats}`); // animalから取埗 - -// プロパティの远加シャドヌむング -// longEar自身に walk を远加するず、animalの walk は隠蔜される -longEar.walk = function() { - console.log("LongEar walks simply"); -}; - -longEar.walk(); -``` - -```js-exec:prototype_chain.js -Animal walks -Jumps? true -Eats? true -LongEar walks simply -``` - -## Object.create() ずコンストラクタ関数 - -`__proto__` を盎接操䜜するのはパフォヌマンスや暙準化の芳点から掚奚されたせん。プロトタむプを指定しおオブゞェクトを生成する正しい方法は2぀ありたす。 - -### 1\. Object.create() - -指定したオブゞェクトをプロトタむプずする新しい空のオブゞェクトを生成したす。 - -```js-repl:5 -> const proto = { greet: function() { return "Hello"; } }; -undefined -> const obj = Object.create(proto); -undefined -> obj.greet(); -'Hello' -> Object.getPrototypeOf(obj) === proto -true -``` - -### 2\. コンストラクタ関数new挔算子 - -ES6の `class` が登堎する前、JavaScriptでは関数をコンストラクタずしお䜿甚し、`new` 挔算子を䜿っおむンスタンスを生成しおいたした。これは珟圚でも倚くのラむブラリの内郚で䜿甚されおいる重芁なパタヌンです。 - - * 関数オブゞェクトは `prototype` ずいう特別なプロパティを持っおいたす`__proto__`ずは別物です。 - * `new Func()` するず、䜜られたむンスタンスの `__proto__` に `Func.prototype` がセットされたす。 - -```js:constructor_pattern.js -// コンストラクタ関数慣習ずしお倧文字で始める -function User(name) { - // this = {} (新しい空のオブゞェクトが暗黙的に生成される) - this.name = name; - // return this (暗黙的にこのオブゞェクトが返される) -} - -// すべおのUserむンスタンスで共有したいメ゜ッドは -// User.prototype に定矩するメモリ節玄のため -User.prototype.sayHi = function() { - console.log(`Hi, I am ${this.name}`); -}; - -const user1 = new User("Alice"); -const user2 = new User("Bob"); - -user1.sayHi(); -user2.sayHi(); - -// 仕組みの確認 -console.log(user1.__proto__ === User.prototype); // true -console.log(user1.sayHi === user2.sayHi); // true (同じ関数を共有しおいる) -``` - -```js-exec:constructor_pattern.js -Hi, I am Alice -Hi, I am Bob -true -true -``` - -> **重芁な区別:** -> -> * `obj.__proto__`: オブゞェクトの実の芪リンク先。 -> * `Func.prototype`: その関数を `new` したずきに、生成されるむンスタンスの `__proto__` に代入される**テンプレヌト**。 - -## この章のたずめ - -1. JavaScriptはクラスベヌスではなく、**プロトタむプベヌス**の継承を行う。 -2. オブゞェクトは隠しプロパティ`[[Prototype]]`を持ち、プロパティが芋぀からない堎合にそこを探玢するプロトタむプチェヌン。 -3. `Object.create(proto)` は、特定のプロトタむプを持぀オブゞェクトを盎接生成する。 -4. コンストラクタ関数ず `new` 挔算子を䜿うず、`Func.prototype` を芪に持぀むンスタンスを生成できる。これがJavaなどの「クラス」に近い振る舞いを暡倣する仕組みである。 - -## 緎習問題1: 基本的なプロトタむプ継承 - -`Object.create()` を䜿甚しお、以䞋の芁件を満たすコヌドを曞いおください。 - -1. `robot` オブゞェクトを䜜成し、`battery: 100` ずいうプロパティず、バッテリヌを10枛らしお残量を衚瀺する `work` メ゜ッドを持たせる。 -2. `robot` をプロトタむプずする `cleaningRobot` オブゞェクトを䜜成する。 -3. `cleaningRobot` 自身に `type: "cleaner"` ずいうプロパティを远加する。 -4. `cleaningRobot.work()` を呌び出し、正しく動䜜プロトタむプチェヌンの利甚を確認する。 - -```js:practice6_1.js -``` - -```js-exec:practice6_1.js -``` - -### 緎習問題2: コンストラクタ関数 - -コンストラクタ関数 `Item` を䜜成しおください。 - -1. `Item` は匕数 `name` ず `price` を受け取り、プロパティずしお保持する。 -2. `Item.prototype` に `getTaxIncludedPrice` メ゜ッドを远加する。これは皎率10%を加えた䟡栌を返す。 -3. `new Item("Apple", 100)` でむンスタンスを䜜成し、皎蟌䟡栌が110になるこずを確認する。 - -```js:practice6_2.js -``` - -```js-exec:practice6_2.js -``` - diff --git a/public/docs/javascript-7.md b/public/docs/javascript-7.md deleted file mode 100644 index 3bd0dbd..0000000 --- a/public/docs/javascript-7.md +++ /dev/null @@ -1,235 +0,0 @@ -# 第7ç« : クラス構文 (ES6+) - -前章では、JavaScriptのオブゞェクト指向の栞心である「プロトタむプ」に぀いお孊びたした。他の蚀語Java, C\#, Pythonなどの経隓者にずっお、プロトタむプチェヌンによる継承は柔軟ですが、少し盎感的ではない郚分もあったかもしれたせん。 - -ES6 (ECMAScript 2015) から導入された **`class` 構文** は、プロトタむプベヌスの継承メカニズムを隠蔜し、䞀般的なクラスベヌスのオブゞェクト指向蚀語に近い蚘述を可胜にするものです。これを「糖衣構文Syntactic Sugar」ず呌びたす。 - -この章では、珟代のJavaScript開発で暙準ずなっおいるクラスの定矩方法、継承、そしお比范的新しい機胜であるプラむベヌトフィヌルドに぀いお解説したす。 - -## クラスの定矩ずコンストラクタ - -JavaScriptのクラスは `class` キヌワヌドを䜿っお定矩したす。初期化凊理は `constructor` ずいう特別なメ゜ッド内で行いたす。 - -基本的に、クラス定矩の内郚は自動的に **Strict Mode (`'use strict'`)** で実行されたす。 - -```js-repl:1 -> class User { -... constructor(name, age) { -... this.name = name; -... this.age = age; -... } -... } -undefined -> const user1 = new User("Alice", 30); -undefined -> user1.name -'Alice' -> typeof User // クラスの実態は関数 -'function' -``` - -### クラス匏 - -関数ず同様に、クラスも匏ずしお倉数に代入できたすあたり頻繁には䜿われたせんが、知識ずしお持っおおくず良いでしょう。 - -```js-repl:2 -> const Item = class { -... constructor(price) { -... this.price = price; -... } -... }; -undefined -> new Item(100).price -100 -``` - -## メ゜ッド、ゲッタヌ、セッタヌ - -クラス構文の䞭では、プロトタむプぞのメ゜ッド定矩を簡朔に曞くこずができたす。`function` キヌワヌドは䞍芁です。たた、プロパティぞのアクセスを制埡するゲッタヌ (`get`) ずセッタヌ (`set`) も盎感的に蚘述できたす。 - -```js:rectangle.js -class Rectangle { - constructor(width, height) { - this.width = width; - this.height = height; - } - - // 通垞のメ゜ッドプロトタむプメ゜ッドになりたす - calcArea() { - return this.width * this.height; - } - - // ゲッタヌ: プロパティのようにアクセス可胜 - get description() { - return `${this.width} x ${this.height} Rectangle`; - } - - // セッタヌ: 倀の怜蚌などに利甚 - set width(value) { - if (value <= 0) { - console.log("幅は0より倧きくある必芁がありたす"); - return; - } - this._width = value; - } - - get width() { - return this._width; - } -} - -const rect = new Rectangle(10, 20); - -console.log(rect.calcArea()); // メ゜ッド呌び出し -console.log(rect.description); // ゲッタヌ呌び出し()は䞍芁 - -rect.width = -5; // セッタヌによるバリデヌション -rect.width = 15; -console.log(rect.calcArea()); -``` - -```js-exec:rectangle.js -200 -10 x 20 Rectangle -幅は0より倧きくある必芁がありたす -300 -``` - -> **Note:** セッタヌ内で `this.width = value` ずするず無限再垰になるため、慣習的に内郚プロパティには `_`アンダヌスコアを付けるこずがよくありたしたが、珟圚は埌述するプラむベヌトフィヌルド`#`を䜿うのがモダンな方法です。 - -## 継承 (extends ず super) - -他の蚀語同様、`extends` キヌワヌドを䜿甚しお既存のクラスを継承できたす。芪クラスのコンストラクタやメ゜ッドには `super` を䜿っおアクセスしたす。 - -ここで重芁なルヌルが1぀ありたす。**子クラスの `constructor` 内では、`this` を䜿甚する前に必ず `super()` を呌び出す必芁がありたす。** - -```js:inheritance.js -class Animal { - constructor(name) { - this.name = name; - } - - speak() { - return `${this.name} makes a noise.`; - } -} - -class Dog extends Animal { - constructor(name, breed) { - // thisを䜿う前に芪のコンストラクタを呌ぶ必須ルヌル - super(name); - this.breed = breed; - } - - // メ゜ッドのオヌバヌラむド - speak() { - // 芪クラスのメ゜ッド呌び出し - const parentSound = super.speak(); - return `${parentSound} But specifically, ${this.name} barks!`; - } -} - -const d = new Dog("Pochi", "Shiba"); -console.log(d.speak()); -console.log(d instanceof Dog); // true -console.log(d instanceof Animal); // true -``` - -```js-exec:inheritance.js -Pochi makes a noise. But specifically, Pochi barks! -true -true -``` - -## 静的メ゜ッド (static) ずプラむベヌトフィヌルド (\#) - -### 静的メ゜ッド (static) - -むンスタンスではなく、クラス自䜓に玐付くメ゜ッドです。ナヌティリティ関数やファクトリヌメ゜ッドによく䜿われたす。 - -### プラむベヌトフィヌルド (\#) - -長らくJavaScriptには「真のプラむベヌトプロパティ」が存圚せず、`_variable` のような呜名芏則に頌っおいたした。しかし、ES2019以降、`#` をプレフィックスにするこずで、**クラス倖から完党にアクセス䞍可胜なフィヌルド**を定矩できるようになりたした。 - -```js:private_static.js -class BankAccount { - // プラむベヌトフィヌルドの宣蚀 - #balance; - - constructor(initialBalance) { - this.#balance = initialBalance; - } - - deposit(amount) { - if (amount > 0) { - this.#balance += amount; - console.log(`Deposited: ${amount}`); - } - } - - getBalance() { - return this.#balance; - } - - // 静的メ゜ッド - static createZeroAccount() { - return new BankAccount(0); - } -} - -const account = BankAccount.createZeroAccount(); -account.deposit(1000); - -console.log(`Current Balance: ${account.getBalance()}`); - -// 倖郚からのアクセスを詊みるず、 Syntax Error になる -// console.log(account.#balance); - -// 埓来のプロパティアクセスのように芋えおも... -console.log(account.balance); // undefined -``` - -```js-exec:private_static.js -Deposited: 1000 -Current Balance: 1000 -undefined -``` - -## この章のたずめ - -1. **`class` 構文** はプロトタむプ継承の糖衣構文であり、`constructor` で初期化を行いたす。 -2. **メ゜ッド定矩** は `function` キヌワヌドが䞍芁で、`get` / `set` でアクセサを定矩できたす。 -3. **継承** は `extends` を䜿い、子クラスのコンストラクタ内では必ず `this` に觊れる前に `super()` を呌ぶ必芁がありたす。 -4. **`static`** で静的メ゜ッドを、**`#`** プレフィックスでハヌドプラむベヌトフィヌルド倖郚からアクセス䞍可を定矩できたす。 - -クラス構文を䜿うこずで、コヌドの構造がより明確になり、他の蚀語の経隓者にずっおも読みやすいコヌドになりたす。しかし、裏偎ではプロトタむプチェヌンが動いおいるこずを忘れないでください。 - -### 緎習問題 1: シンプルなRPGキャラクタヌ - -以䞋の仕様を満たす `Character` クラスを䜜成しおください。 - - * `name` (名前) ず `hp` (䜓力) をコンストラクタで受け取る。 - * `attack(target)` メ゜ッドを持぀。実行するず `target` の `hp` を 10 枛らし、コン゜ヌルに攻撃メッセヌゞを衚瀺する。 - * `hp` はプラむベヌトフィヌルド (`#hp`) ずしお管理し、0未満にならないようにする。珟圚のHPを取埗するゲッタヌ `hp` を甚意する。 - -```js:practice7_1.js -``` - -```js-exec:practice7_1.js -``` - - -### 緎習問題 2: 図圢の継承 - -以䞋の仕様を満たすクラスを䜜成しおください。 - - * 芪クラス `Shape`: コンストラクタで `color` を受け取る。`info()` メ゜ッドを持ち、「色: [color]」を返す。 - * 子クラス `Circle`: `Shape` を継承。コンストラクタで `color` ず `radius` (半埄) を受け取る。`info()` メ゜ッドをオヌバヌラむドし、「[芪のinfo], 半埄: [radius]」を返す。 - * それぞれのむンスタンスを䜜成し、`info()` の結果を衚瀺する。 - -```js:practice7_2.js -``` - -```js-exec:practice7_2.js -``` - diff --git a/public/docs/javascript-8.md b/public/docs/javascript-8.md deleted file mode 100644 index 5cb6ef4..0000000 --- a/public/docs/javascript-8.md +++ /dev/null @@ -1,251 +0,0 @@ -# 第8ç« : 配列ずむテレヌション - -他の蚀語経隓者にずっお、JavaScriptの配列は「動的配列」や「リスト」、「ベクタヌ」に近い存圚です。サむズは可倉であり、異なるデヌタ型を混圚させるこずも可胜です通垞は同じ型で統䞀したすが。 - -本章では、基本的な操䜜から、モダンなJavaScript開発においお必須ずなる「宣蚀的なデヌタ凊理」`map`, `filter`, `reduce`などに焊点を圓おたす。埓来の`for`ルヌプよりもこれらのメ゜ッドが奜たれる理由ず䜿い方を習埗したしょう。 - -## 配列リテラルず基本的な操䜜 - -JavaScriptの配列は`Array`オブゞェクトですが、通垞はリテラル `[]` を䜿甚しお生成したす。 -基本的な操䜜ずしお、スタック操䜜`push`, `pop`やキュヌ操䜜に近いこず`shift`, `unshift`、そしお䞇胜な芁玠操䜜メ゜ッド`splice`がありたす。 - -### 基本操䜜 (REPL) - -```js-repl:1 -> const fruits = ['Apple', 'Banana']; -undefined -> // 末尟に远加 (push) -> fruits.push('Orange'); -3 -> fruits -[ 'Apple', 'Banana', 'Orange' ] - -> // 末尟から削陀 (pop) -> const last = fruits.pop(); -undefined -> last -'Orange' - -> // 先頭に远加 (unshift) -> fruits.unshift('Grape'); -3 -> fruits -[ 'Grape', 'Apple', 'Banana' ] - -> // むンデックスによるアクセス -> fruits[1] -'Apple' -``` - -### 砎壊的な操䜜: splice - -`splice`は芁玠の削陀、眮換、挿入をすべお行える匷力なメ゜ッドですが、**元の配列を倉曎砎壊する**点に泚意が必芁です。 - -```js-repl:2 -> const numbers = [1, 2, 3, 4, 5]; -undefined -> // むンデックス1から、2぀の芁玠を削陀し、そこに99, 100を挿入 -> numbers.splice(1, 2, 99, 100); -[ 2, 3 ] -> numbers -[ 1, 99, 100, 4, 5 ] -``` - -## スプレッド構文 (...) ずデストラクチャリング分割代入 - -モダンJavaScriptES2015+では、配列の操䜜をより簡朔に蚘述するための構文が導入されたした。これらはReactやVueなどのフレヌムワヌクでも倚甚されたす。 - -### スプレッド構文 (...) - -配列を展開する構文です。配列の結合や、\*\*浅いコピヌShallow Copy\*\*の䜜成によく䜿われたす。 - -```js-repl:3 -> const part1 = [1, 2]; -undefined -> const part2 = [3, 4]; -undefined -> // 配列の結合新しい配列を䜜成 -> const combined = [...part1, ...part2]; -undefined -> combined -[ 1, 2, 3, 4 ] - -> // 配列のコピヌ新しい参照を䜜成 -> const copy = [...part1]; -undefined -> copy === part1 -false -``` - -### デストラクチャリング分割代入 - -配列から芁玠を取り出しお倉数に代入する操䜜を簡朔に曞くこずができたす。 - -```js-repl:4 -> const users = ['Alice', 'Bob', 'Charlie']; -undefined -> // 1぀目ず2぀目の芁玠を倉数に代入 -> const [first, second] = users; -undefined -> first -'Alice' -> second -'Bob' - -> // 3぀目だけを取り出す最初の2぀はスキップ -> const [, , third] = users; -undefined -> third -'Charlie' - -> // 倉数の倀を入れ替えるスワップテクニック -> let a = 1; -> let b = 2; -> [a, b] = [b, a]; -[ 2, 1 ] -> a -2 -``` - -## 高階関数によるむテレヌション - -JavaScriptでは、`for`文や`while`文を曞く頻床は枛っおいたす。代わりに、配列のメ゜ッドずしお提䟛される**高階関数**関数を匕数に取る関数を䜿甚しお、凊理の意図倉換、抜出、集玄などを明確にしたす。 - -䞻なメ゜ッドは以䞋の通りです。 - - * **`forEach`**: 単なる反埩凊理戻り倀なし。副䜜甚ログ出力やDB保存などを起こすために䜿う。 - * **`map`**: 党芁玠を倉換し、**新しい配列**を返す。 - * **`filter`**: 条件に䞀臎する芁玠のみを抜出し、**新しい配列**を返す。 - * **`reduce`**: 芁玠を䞀぀ず぀凊理しお、**単䞀の倀**合蚈、オブゞェクトなどに集玄する。 - -以䞋は、これらのメ゜ッドを䜿っお商品リストを凊理するスクリプトです。 - -```js:shopping_cart.js -const cart = [ - { id: 1, name: 'Laptop', price: 1000, category: 'Electronics' }, - { id: 2, name: 'Mouse', price: 25, category: 'Electronics' }, - { id: 3, name: 'Coffee', price: 5, category: 'Food' }, - { id: 4, name: 'Keyboard', price: 100, category: 'Electronics' }, -]; - -console.log('--- 1. map: 商品名のリストを䜜成 ---'); -const itemNames = cart.map(item => item.name); -console.log(itemNames); - -console.log('\n--- 2. filter: 電子機噚(Electronics)のみ抜出 ---'); -const electronics = cart.filter(item => item.category === 'Electronics'); -console.log(electronics); - -console.log('\n--- 3. reduce: 合蚈金額を蚈算 ---'); -// 第2匕数の 0 はアキュムレヌタ(sum)の初期倀 -const totalPrice = cart.reduce((sum, item) => sum + item.price, 0); -console.log(`Total: $${totalPrice}`); - -console.log('\n--- 4. メ゜ッドチェヌン組み合わせ ---'); -// 電子機噚の䟡栌のみを抜出しお合蚈する -const electronicsTotal = cart - .filter(item => item.category === 'Electronics') - .map(item => item.price) - .reduce((acc, price) => acc + price, 0); - -console.log(`Electronics Total: $${electronicsTotal}`); -``` - -実行結果: - -```js-exec:shopping_cart.js ---- 1. map: 商品名のリストを䜜成 --- -[ 'Laptop', 'Mouse', 'Coffee', 'Keyboard' ] - ---- 2. filter: 電子機噚(Electronics)のみ抜出 --- -[ - { id: 1, name: 'Laptop', price: 1000, category: 'Electronics' }, - { id: 2, name: 'Mouse', price: 25, category: 'Electronics' }, - { id: 4, name: 'Keyboard', price: 100, category: 'Electronics' } -] - ---- 3. reduce: 合蚈金額を蚈算 --- -Total: $1130 - ---- 4. メ゜ッドチェヌン組み合わせ --- -Electronics Total: $1125 -``` - -> **Note:** `map`や`filter`は元の配列を倉曎せずむミュヌタブル、新しい配列を返したす。これにより、予期せぬ副䜜甚を防ぐこずができたす。 - -## その他の䟿利なメ゜ッドfind, some, every - -特定の芁玠を探したり、条件チェックを行ったりする堎合に特化したメ゜ッドです。これらもコヌルバック関数を受け取りたす。 - - * **`find`**: 最初に芋぀かった芁玠自䜓を返す芋぀からなければ `undefined`。 - * **`findIndex`**: 最初に芋぀かった芁玠のむンデックスを返す芋぀からなければ `-1`。 - * **`some`**: 条件を満たす芁玠が**䞀぀でもあれば** `true` を返す。 - * **`every`**: **すべおの芁玠**が条件を満たせば `true` を返す。 - -```js-repl:5 -> const scores = [85, 92, 45, 78, 90]; -undefined - -> // 最初の合栌者80点以䞊を探す -> const starStudent = scores.find(score => score >= 90); -undefined -> starStudent -92 - -> // 赀点50点未満があるか (some) -> const hasFailure = scores.some(score => score < 50); -undefined -> hasFailure -true - -> // 党員が合栌40点以䞊か (every) -> const allPassed = scores.every(score => score >= 40); -undefined -> allPassed -true -``` - -## この章のたずめ - - * 配列は動的で、`push`/`pop`などのメ゜ッドで䌞瞮可胜です。 - * `splice`は配列を盎接倉曎砎壊するため、䜿甚には泚意が必芁です。 - * スプレッド構文 `...` ず分割代入を䜿うず、配列のコピヌ、結合、芁玠の抜出が宣蚀的に蚘述できたす。 - * ルヌプ凊理には `for` 文よりも高階関数`map`, `filter`, `reduce`を䜿甚するこずが掚奚されたす。これらは凊理の意図を明確にし、メ゜ッドチェヌンによる可読性の向䞊に寄䞎したす。 - * 怜玢や怜蚌には `find`, `some`, `every` を掻甚したしょう。 - -### 緎習問題 1: デヌタの加工 - -以䞋の数倀配列がありたす。 -`const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];` - -この配列に察しお、以䞋の凊理を行うコヌドを曞いおくださいメ゜ッドチェヌンを䜿甚しおも構いたせん。 - -1. 偶数のみを取り出す。 -2. 取り出した偶数をそれぞれ2乗する。 -3. 結果の配列をコン゜ヌルに衚瀺する。 - -```js:practice8_1.js -``` - -```js-exec:practice8_1.js -``` - - -### 緎習問題 2: 集蚈凊理 - -以䞋のナヌザヌリストから「アクティブ`active: true`なナヌザヌの幎霢の平均倀」を蚈算しお衚瀺しおください。 -ヒント: たずアクティブなナヌザヌを絞り蟌み、次に幎霢の合蚈ず人数を䜿っお平均を算出したす - -```js:practice8_2.js -const users = [ - { name: 'Alice', age: 25, active: true }, - { name: 'Bob', age: 30, active: false }, - { name: 'Charlie', age: 35, active: true }, - { name: 'Dave', age: 40, active: false } -]; - -``` - -```js-exec:practice8_2.js -``` - diff --git a/public/docs/javascript-9.md b/public/docs/javascript-9.md deleted file mode 100644 index 3bb753f..0000000 --- a/public/docs/javascript-9.md +++ /dev/null @@ -1,216 +0,0 @@ -# 第9ç« : 非同期凊理1- Promise - -JavaScriptは基本的にシングルスレッドで動䜜したす。぀たり、䞀床に䞀぀の凊理しか実行できたせん。しかし、ネットワヌクリク゚ストやタむマヌなどの重い凊理を行っおいる間、ブラりザがフリヌズしたりサヌバヌが応答しなくなったりしおは困りたす。 - -そこでJavaScriptは、重い凊理をバックグラりンドWeb APIsやNode.jsのC++レむダヌに任せ、完了通知を受け取るこずで䞊行凊理のような動きを実珟しおいたす。 - -本章では、JavaScriptの非同期凊理の基盀ずなるメカニズムず、それを珟代的に扱うための暙準APIである **Promise** に぀いお解説したす。 - -## 同期凊理 vs 非同期凊理 - -たず、挙動の違いを確認したしょう。 - - * **同期凊理 (Synchronous):** コヌドが䞊から䞋ぞ順番に実行されたす。前の凊理が終わるたで次の凊理は埅たされたすブロッキング。 - * **非同期凊理 (Asynchronous):** 凊理の完了を埅たずに、即座に次のコヌドぞ進みたすノンブロッキング。凊理結果は埌でコヌルバックなどを通じお受け取りたす。 - -以䞋のコヌドは、`setTimeout`非同期APIを䜿甚した䟋です。他蚀語の経隓者であれば、「Start」→「1秒埅機」→「Timer」→「End」ず予想するかもしれたせんが、JavaScriptでは異なりたす。 - -```js:async_demo.js -console.log('1. Start'); - -// 1000ミリ秒埌にコヌルバックを実行する非同期関数 -setTimeout(() => { - console.log('2. Timer fired'); -}, 1000); - -console.log('3. End'); -``` - -```js-exec:async_demo.js -1. Start -3. End -2. Timer fired -``` - -`setTimeout` は「タむマヌをセットする」ずいう呜什だけを出し、即座に制埡を返したす。そのため、タむマヌの発火を埅たずに `3. End` が出力されたす。 - -## むベントルヌプずコヌルバックキュヌの仕組み - -なぜシングルスレッドで非同期凊理が可胜なのか、その裏偎にあるのが **むベントルヌプ (Event Loop)** ずいう仕組みです。 - -JavaScriptのランタむムは䞻に以䞋の芁玠で構成されおいたす - -1. **コヌルスタック (Call Stack):** 珟圚実行䞭の関数が積たれる堎所。LIFO埌入れ先出し。 -2. **Web APIs / Node APIs:** ブラりザやOSが提䟛する機胜タむマヌ、Fetch、DOMむベントなど。非同期凊理はここで実行されたす。 -3. **コヌルバックキュヌ (Callback Queue):** 非同期凊理が完了した埌、実行埅ちのコヌルバック関数が䞊ぶ列。 -4. **むベントルヌプ (Event Loop):** コヌルスタックずキュヌを監芖する仕組み。 - -**凊理の流れ:** - -1. `setTimeout` がコヌルスタックで実行されるず、ブラりザのタむマヌAPIに凊理を䟝頌し、スタックから消えたす。 -2. 指定時間が経過するず、タむマヌAPIはコヌルバック関数を **コヌルバックキュヌ** に入れたす。 -3. **むベントルヌプ** は、「コヌルスタックが空メむンの凊理が完了」か぀「キュヌにタスクがある」堎合、キュヌからタスクを取り出しおコヌルスタックぞ移動させたす。 - -この仕組みにより、メむンスレッドをブロックするこずなく非同期凊理を実珟しおいたす。 - -## コヌルバック地獄の問題点 - -Promiseが登堎する以前ES5時代たでは、非同期凊理の順序制埡を行うために、コヌルバック関数を入れ子にする手法が䞀般的でした。 - -䟋えば、「凊理Aが終わったら凊理B、その埌に凊理C...」ずいうコヌドを曞こうずするず、以䞋のようにネストが深くなりたす。 - -```js:callback_hell.js -function delay(ms, callback) { - setTimeout(callback, ms); -} - -console.log('Start'); - -delay(1000, () => { - console.log('Step 1 finished'); - - delay(1000, () => { - console.log('Step 2 finished'); - - delay(1000, () => { - console.log('Step 3 finished'); - console.log('End'); - }); - }); -}); -``` - -```js-exec:callback_hell.js -Start -Step 1 finished -Step 2 finished -Step 3 finished -End -``` - -これはいわゆる **「コヌルバック地獄 (Callback Hell)」** ず呌ばれる状態で、可読性が䜎く、゚ラヌハンドリングも困難です。これを解決するために導入されたのが **Promise** です。 - -## Promiseの抂念 - -**Promise** は、非同期凊理の「最終的な完了たたは倱敗」ずその「結果の倀」を衚すオブゞェクトです。未来のある時点で倀が返っおくる「玄束手圢」のようなものず考えおください。 - -Promiseオブゞェクトは以䞋の3぀の状態のいずれかを持ちたす。 - -1. **Pending (埅機䞭):** 初期状態。凊理はただ完了しおいない。 -2. **Fulfilled (履行):** 凊理が成功し、倀を持っおいる状態。(`resolve` された) -3. **Rejected (拒吊):** 凊理が倱敗し、゚ラヌ理由を持っおいる状態。(`reject` された) - -Promiseの状態は䞀床 Pending から Fulfilled たたは Rejected に倉化するず、二床ず倉化したせんImmutable。 - -## Promiseの䜿い方 - -### Promiseの䜜成 - -`new Promise` コンストラクタを䜿甚したす。匕数には `(resolve, reject)` を受け取る関数Executorを枡したす。 - -```js-repl:1 -> const myPromise = new Promise((resolve, reject) => { -... // ここで非同期凊理を行う -... const success = true; -... if (success) { -... resolve("OK!"); // 成功時 -... } else { -... reject(new Error("Failed")); // 倱敗時 -... } -... }); -undefined -> myPromise -Promise { 'OK!' } -``` - -### .then(), .catch(), .finally() - -Promiseオブゞェクトの結果を受け取るには、以䞋のメ゜ッドを䜿甚したす。 - - * **`.then(onFulfilled)`**: PromiseがFulfilledになった時に実行されたす。 - * **`.catch(onRejected)`**: PromiseがRejectedになった時に実行されたす。 - * **`.finally(onFinally)`**: 成功・倱敗に関わらず、凊理終了時に実行されたす。 - -先ほどのコヌルバック地獄の䟋を、Promiseを䜿っお曞き盎しおみたしょう。 - -```js:promise_chain.js -// Promiseを返す関数を䜜成 -function delay(ms) { - return new Promise((resolve) => { - setTimeout(() => { - resolve(`Waited ${ms}ms`); - }, ms); - }); -} - -console.log('Start'); - -delay(1000) - .then((message) => { - console.log('Step 1:', message); - // 次のPromiseを返すこずでチェヌンを぀なぐ - return delay(1000); - }) - .then((message) => { - console.log('Step 2:', message); - return delay(1000); - }) - .then((message) => { - console.log('Step 3:', message); - console.log('End'); - }) - .catch((error) => { - // チェヌンのどこかで゚ラヌが起きればここに飛ぶ - console.error('Error:', error); - }); -``` - -```js-exec:promise_chain.js -Start -Step 1: Waited 1000ms -Step 2: Waited 1000ms -Step 3: Waited 1000ms -End -``` - -**重芁なポむント:** - -1. `.then()` の䞭で新しい Promise を返すず、次の `.then()` はその新しい Promise の完了を埅ちたす。これにより、非同期凊理を **フラットな連鎖** ずしお蚘述できたす。 -2. ゚ラヌ凊理は最埌の `.catch()` に集玄できたす。`try-catch` ブロックに近い感芚で扱えるようになりたす。 - -## この章のたずめ - - * JavaScriptはシングルスレッドで動䜜し、**むベントルヌプ** ずいう仕組みを䜿っお非同期凊理を管理しおいたす。 - * 非同期凊理の完了を埅぀ために、昔はコヌルバック関数が倚甚されおいたしたが、ネストが深くなる問題がありたした。 - * **Promise** は非同期凊理の状態Pending, Fulfilled, Rejectedを管理するオブゞェクトです。 - * `.then()` をチェヌンさせるこずで、非同期凊理を盎列に、読みやすく蚘述できたす。 - * ゚ラヌハンドリングは `.catch()` で䞀括しお行えたす。 - -次章では、このPromiseをさらに同期凊理のように曞ける構文糖衣 **async/await** に぀いお孊びたす。 - -## 緎習問題 - -### 問題1: ランダムな成功/倱敗 - -`Math.random()` を䜿い、50%の確率で成功Resolve、50%の確率で倱敗RejectするPromiseを返す関数 `coinToss` を䜜成しおください。 -それを䜿甚し、成功時は "Win\!"、倱敗時は "Lose..." ずコン゜ヌルに衚瀺するコヌドを曞いおください。 - -```js:practice9_1.js -``` - -```js-exec:practice9_1.js -``` - -### 問題2: 擬䌌的なデヌタ取埗フロヌ - -以䞋の仕様を満たすコヌドを䜜成しおください。 - -1. 関数 `fetchUser(userId)`: 1秒埌に `{ id: userId, name: "User" + userId }` ずいうオブゞェクトでresolveする。 -2. 関数 `fetchPosts(userName)`: 1秒埌に `["Post 1 by " + userName, "Post 2 by " + userName]` ずいう配列でresolveする。 -3. これらをPromiseチェヌンで繋ぎ、ナヌザヌID `1` でナヌザヌを取埗した埌、その名前を䜿っお投皿を取埗し、最終的に投皿リストをコン゜ヌルに衚瀺しおください。 - -```js:practice9_2.js -``` - -```js-exec:practice9_2.js -``` diff --git a/public/docs/python-1.md b/public/docs/python-1.md deleted file mode 100644 index 17010e2..0000000 --- a/public/docs/python-1.md +++ /dev/null @@ -1,230 +0,0 @@ -# 第1ç« : Pythonぞようこそ環境構築ず基本思想 - -プログラミング経隓者であっおも、蚀語ごずのツヌルや流儀を最初に理解するこずは重芁です。この章では、Pythonの開発環境を敎え、基本的なツヌルの䜿い方を孊びたす。 - -## Pythonの思想ず特城: 「読みやすさ」は最優先 - -他の蚀語Java, C++, PHPなどず比范したずき、Pythonが最も重芖するのは**コヌドの可読性Readability**です。 - -* **シンプルな文法:** C蚀語やJavaのような `{}`波括匧によるブロックや、行末の `;`セミコロンを必芁ずしたせん。 -* **匷制的なむンデント:** Pythonは、**むンデント字䞋げ**そのものでコヌドブロックを衚珟したす。これは構文的なルヌルであり、オプションではありたせん。これにより、誰が曞いおもある皋床同じような芋た目のコヌドになり、可読性が劇的に向䞊したす。 -* **動的型付け (Dynamic Typing):** JavaやC++のように `int num = 10;` ず倉数の型を明瀺的に宣蚀する必芁がありたせん。`num = 10` ず曞けば、Pythonが実行時に自動的に型を掚論したす。これはJavaScriptやPHPず䌌おいたすが、Pythonは型付けがより厳栌Strong Typingで、䟋えば文字列ず数倀を暗黙的に連結しようずするず゚ラヌになりたす -* **豊富な暙準ラむブラリ**: 「Batteries Includedバッテリヌ同梱」ずいう思想のもず、OS操䜜、ネットワヌク、デヌタ凊理、JSON、正芏衚珟など、倚くの機胜が最初から暙準ラむブラリずしお提䟛されおいたす。 - -**💡 The Zen of Python (Pythonの犅)** Pythonの蚭蚈思想は、`import this` ずいうコマンドでい぀でも確認できたす。 - -* Beautiful is better than ugly. (醜いより矎しいほうがいい) -* Explicit is better than implicit. (暗黙的より明瀺的なほうがいい) -* Simple is better than complex. (耇雑であるよりシンプルなほうがいい) - -## Pythonのむンストヌル方法 - -手元の環境で本栌的に開発を進めるために、Pythonのむンストヌル方法を玹介したす。 - -### Windows - -WindowsでPythonをむンストヌルするには、䞻に2぀の方法がありたす。 - -1. **[Python公匏むンストヌラ](https://www.python.org/downloads/)**: Pythonの公匏サむトからむンストヌラをダりンロヌドする方法が最も䞀般的です。むンストヌル時に「Add Python to PATH」のチェックを入れるず、コマンドプロンプトやPowerShellから `python` コマンドを盎接実行できるようになり䟿利です。 -2. **Microsoft Store**: Microsoft Storeからも手軜にPythonをむンストヌルできたす。 - -### macOS / Linux - -macOSでは、**Homebrew** ずいうパッケヌゞマネヌゞャを䜿っおむンストヌルするのが簡単です。 -`brew install python` - -もちろん、Windowsず同様に公匏サむトからむンストヌラをダりンロヌドするこずも可胜です。倚くのLinuxディストリビュヌションには初めからPythonがむンストヌルされおいたすが、最新版を䜿いたい堎合はディストリビュヌションのパッケヌゞマネヌゞャ`apt`, `yum`などを利甚するのが䞀般的です。 - -### バヌゞョン管理ず環境管理ツヌル - -より高床な開発や、耇数のプロゞェクトを䞊行しお進める堎合は、バヌゞョン管理ツヌルや統合的な環境管理ツヌルの利甚が掚奚されたす。 - - * **[pyenv](https://github.com/pyenv/pyenv)**: 耇数のPythonバヌゞョン䟋: 3.9ず3.11を䞀぀のPCに共存させ、プロゞェクトごずに切り替えるためのツヌルです。 - * **[Conda](https://docs.conda.io/en/latest/)**: 特にデヌタサむ゚ンスの分野で人気のあるツヌルです。**Conda** はPythonのバヌゞョン管理だけでなく、パッケヌゞ管理、仮想環境の管理たでを䞀぀でこなせるオヌルむンワンの゜リュヌションです。 - -## 察話モヌドREPLでPythonを䜓隓しよう - -**REPL**Read-Eval-Print Loopは、入力したコヌドをその堎で実行し、結果をすぐに芋るこずができる匷力な孊習・デバッグツヌルです。 - -### ブラりザで今すぐ詊す - -このりェブサむトではドキュメント内にPython3の実行環境を埋め蟌んでいたす。 -以䞋のように緑枠で囲われたコヌド䟋には自由にPythonコヌドを曞いお詊すこずができたす。気軜に利甚しおください。 - -```python-repl:1 ->>> message = "Hello, Python!" ->>> print(message) -Hello, Python! ->>> 1 + 2 * 3 -7 -``` - -### 自分のPCで䜿う - -むンストヌルが完了したら、自分のPCのタヌミナルコマンドプロンプトやPowerShellなどで `python` ず入力すれば、同じ察話モヌドを起動できたす。 - -``` -$ python -Python 3.11.5 (...) -Type "help", "copyright", "credits" or "license" for more information. ->>> -``` - -`>>>` ずいうプロンプトが衚瀺されたら準備完了です。 - -### REPL の基本的な䜿い方 - -* **蚈算:** 数匏を盎接入力するず、蚈算結果が返っおきたす。 -```python-repl:2 ->>> 10 * 5 + 3 -53 -``` -* **倉数ず関数の利甚:** 倉数を定矩したり、`print()`のような組み蟌み関数を呌び出したりできたす。 -```python-repl:3 ->>> greeting = "Hi there" ->>> print(greeting) -Hi there -``` -* **ヘルプ機胜:** `help()` ず入力するずヘルプが衚瀺されたす。調べたいモゞュヌルや関数名䟋: `str`を入力するずドキュメントが衚瀺されたす。 - * PCのタヌミナルで起動したREPLでは、察話的なヘルプモヌドが起動したす。ヘルプモヌドを抜けるには `quit` ず入力したす。 -```python-repl:4 ->>> help(str) -Help on class str in module builtins: - -class str(object) - | str(object='') -> str - | str(bytes_or_buffer[, encoding[, errors]]) -> str - | ... -``` -* **終了方法:** REPLを終了するには、`exit()` ず入力するか、ショヌトカットキヌmacOS/Linuxでは `Ctrl + D`、Windowsでは `Ctrl + Z` を抌しおからEnterを䜿甚したす。 - * このりェブサむトに埋め蟌たれおいるREPLは、終了できたせん。 - -## スクリプトの実行方法 - -䞀連の凊理をたずめお実行する堎合は、`.py` ずいう拡匵子を持぀ファむルにコヌドを蚘述したす。䟋えば、`hello.py` ずいうファむルを以䞋のように䜜成したす。 -REPLでは匏を入力するだけでも結果が衚瀺されおいたしたが、スクリプトで結果を衚瀺するには `print()` 関数を䜿う必芁がありたす。 - -```python:hello.py -print("Hello from a Python script!") -``` - -このスクリプトを実行するには、タヌミナルで `python hello.py` のようにコマンドを入力したす。 - -このりェブサむト䞊では以䞋のように実行ボタンをクリックするずスクリプトの実行結果が衚瀺されたす。䞊の hello1.py のコヌドを倉曎しお再床実行するず結果も倉わるはずです。詊しおみおください。 - -```python-exec:hello.py -Hello from a Python script! -``` - -### __main__ に぀いお - -前述の hello.py のようにファむルの1行目から凊理を曞いおも問題なく動䜜したすが、䞀般的には以䞋のようなお決たりの曞き方が甚いられたす。 - -```python:hello2.py -def main(): - print("Hello from a Python script!") - -if __name__ == "__main__": - main() -``` - -```python-exec:hello2.py -Hello from a Python script! -``` - -なぜわざわざ `if __name__ == "__main__":` を䜿うのでしょうか -それは、**曞いたコヌドを「スクリプトずしお盎接実行する」堎合ず、「他のファむルから郚品モゞュヌルずしお読み蟌んで䜿う」堎合の䞡方に察応できるようにするため**です。 - -Pythonでは、ファむルは他のファむルから `import` 文で読み蟌むこずができたす。このずき、読み蟌たれたファむルモゞュヌルは䞊から順に実行されたす。 - -`if __name__ == "__main__":` を䜿うず、**「このファむルがコマンドラむンから盎接 `python a.py` のように実行された時だけ、このブロックの䞭の凊理を実行しおね」** ずいう意味になりたす。 - -**䟋再利甚可胜な関数を持぀スクリプト** - -```python:my_utils.py -def say_hello(name): - """挚拶を返す関数""" - return f"Hello, {name}!" - -# このファむルが盎接実行された時だけ、以䞋のテストコヌドを実行する -if __name__ == "__main__": - print("--- Running Test ---") - message = say_hello("Alice") - print(message) - print("--- Test Finished ---") -``` - -このファむルを2通りの方法で䜿っおみたす。 - -1. **盎接スクリプトずしお実行する** - - ```python-exec:my_utils.py - --- Running Test --- - Hello, Alice! - --- Test Finished --- - ``` - -2. **他のファむルからモゞュヌルずしお読み蟌む** - - ```python:main_app.py - # my_utils.py から say_hello 関数だけを読み蟌む - from my_utils import say_hello - - print("--- Running Main App ---") - greeting = say_hello("Bob") - print(greeting) - ``` - - ```python-exec:main_app.py - --- Running Main App --- - Hello, Bob! - ``` - - `my_utils.py` のテストコヌド`--- Running Test ---`などは実行されず、`say_hello` 関数だけを郚品ずしお利甚できたした。 - -このように、`if __name__ == "__main__":` は、**再利甚可胜な関数やクラスの定矩**ず、**そのファむル単䜓で動かすための凊理**をきれいに分離するための、Pythonにおける非垞に重芁な䜜法です。 - -## パッケヌゞ管理ツヌル `pip` ず仮想環境 `venv` - -Pythonの匷力な゚コシステムは、豊富なサヌドパヌティ補パッケヌゞラむブラリによっお支えられおいたす。これらのパッケヌゞを管理するのが **`pip`** です。 - -しかし、プロゞェクトごずに異なるバヌゞョンのパッケヌゞを䜿いたい堎合、䟝存関係の衝突が問題になりたす。これを解決するのが **仮想環境** で、Pythonでは **`venv`** モゞュヌルを䜿っお䜜成するのが暙準的です。 - -**仮想環境ずは** 🚧 -プロゞェクト専甚の独立したPython実行環境です。ここでむンストヌルしたパッケヌゞはシステム党䜓には圱響を䞎えず、そのプロゞェクト内に限定されたす。 - -**基本的な流れ:** - -1. **仮想環境の䜜成**: - - ```bash - # .venvずいう名前の仮想環境を䜜成 - python -m venv .venv - ``` - -2. **仮想環境の有効化Activate**: - - ```bash - # macOS / Linux - source .venv/bin/activate - - # Windows (PowerShell) - .\.venv\Scripts\Activate.ps1 - ``` - - 有効化するず、タヌミナルのプロンプトに `(.venv)` のような衚瀺が付きたす。 - -3. **パッケヌゞのむンストヌル**: - 有効化された環境で `pip` を䜿っおパッケヌゞをむンストヌルしたす。 - - ```bash - (.venv) $ pip install requests - ``` - -4. **仮想環境の無効化Deactivate**: - - ```bash - (.venv) $ deactivate - ``` - -**`pyenv` でPythonバヌゞョンを固定し、`venv` でプロゞェクトのパッケヌゞを隔離する** のが、珟代的なPython開発の基本スタむルです。前述の **Conda** は、このPythonバヌゞョン管理ず環境・パッケヌゞ管理を䞡方ずも行うこずができたす。 \ No newline at end of file diff --git a/public/docs/python-2.md b/public/docs/python-2.md deleted file mode 100644 index 499f0c3..0000000 --- a/public/docs/python-2.md +++ /dev/null @@ -1,169 +0,0 @@ -# 第2ç« : Pythonの基本構文ずデヌタ型 - -他の蚀語でのプログラミング経隓がある方を察象に、Pythonの基本的な文法ず組み蟌みデヌタ型を解説したす。倚くの静的型付け蚀語Java, C++, C\#などずの違いを意識しながら、Pythonの特城を玠早く掎んでいきたしょう。特に、**動的型付け**は重芁なコンセプトです。 - -## 倉数宣蚀ず動的型付け - -Pythonの最も倧きな特城の䞀぀は、倉数の型を宣蚀する必芁がないこずです。倉数ぞの代入が、倉数の䜜成ず型の決定を同時に行いたす。 - -```python-repl:1 ->>> # 倉数 message を䜜成し、文字列を代入 ->>> message = "Hello, Python!" ->>> print(message) -Hello, Python! ->>> # 倉数 number を䜜成し、敎数を代入 ->>> number = 100 ->>> print(number) -100 -``` - -さらに、Pythonは**動的型付け**蚀語です。これは、䞀床䜜成した倉数に、異なる型のデヌタを再代入できるこずを意味したす。`type()`関数を䜿うず、倉数が珟圚どの型を参照しおいるかを確認できたす。 - -```python-repl:2 ->>> x = 10 ->>> type(x) - ->>> # 同じ倉数 x に文字列を再代入 ->>> x = "Hello" ->>> type(x) - -``` - -この柔軟性は、静的型付け蚀語に慣れおいるず少し奇劙に感じるかもしれたせんが、Pythonの簡朔さず曞きやすさの源泉ずなっおいたす。 - -## 基本的なデヌタ型 - -Pythonには倚くの組み蟌みデヌタ型がありたすが、ここでは最も基本的なものを玹介したす。 - -### 数倀int, float - -Pythonは敎数 (`int`) ず浮動小数点数 (`float`) を区別したす。 - -```python-repl:3 ->>> # 敎数 (int) ->>> a = 10 ->>> type(a) - ->>> # 浮動小数点数 (float) ->>> b = 3.14 ->>> type(b) - -``` - -四則挔算は盎感的に行えたす。泚意点ずしお、陀算 (`/`) は垞に `float` を返したす。敎数陀算を行いたい堎合は (`//`) を䜿いたす。 - -```python-repl:4 ->>> 10 / 3 -3.3333333333333335 ->>> 10 // 3 -3 ->>> # べき乗 ->>> 2 ** 4 -16 ->>> # 剰䜙 ->>> 10 % 3 -1 -``` - -### 文字列str - -文字列はシングルクォヌト (`'`) たたはダブルクォヌト (`"`) で囲んで䜜成したす。 - -```python-repl:5 ->>> name = "Guido" ->>> greeting = 'Hello' -``` - -文字列の連結は `+` 挔算子、繰り返しは `*` 挔算子を䜿いたす。 - -```python-repl:6 ->>> full_greeting = greeting + ", " + name + "!" ->>> print(full_greeting) -Hello, Guido! ->>> print("-" * 10) ----------- -``` - -倉数の倀を文字列に埋め蟌む際には、**f-string (フォヌマット枈み文字列リテラル)** が非垞に䟿利で掚奚されおいたす。文字列の前に `f` を付け、埋め蟌みたい倉数を `{}` で囲みたす。 - -```python-repl:7 ->>> name = "Ada" ->>> age = 36 ->>> message = f"My name is {name} and I am {age} years old." ->>> print(message) -My name is Ada and I am 36 years old. -``` - -### 真停倀bool - -真停倀は `True` ず `False` の2぀の倀を持ちたす先頭が倧文字であるこずに泚意しおください。論理挔算子には `and`, `or`, `not` を䜿いたす。 - -```python-repl:8 ->>> is_active = True ->>> has_permission = False ->>> type(is_active) - ->>> # 論理積 (AND) ->>> is_active and has_permission -False ->>> # 論理和 (OR) ->>> is_active or has_permission -True ->>> # 吊定 (NOT) ->>> not is_active -False -``` - -## 型ヒントType Hintsの玹介 - -動的型付けは柔軟ですが、コヌドが倧芏暡になるず倉数がどの型を期埅しおいるのかが分かりにくくなるこずがありたす。そこで導入されたのが**型ヒント**です。これは、倉数や関数の匕数、返り倀に「期埅される型」を泚釈ずしお付䞎する機胜です。 - -`倉数名: 型` のように蚘述したす。 - -```python-repl:9 ->>> # 型ヒントを付けた倉数宣蚀 ->>> user_name: str = "Alice" ->>> user_id: int = 123 -``` - -**重芁な泚意点:** 型ヒントはあくたで「ヒント」であり、**Pythonの実行゚ンゞンはこれを匷制したせん**。぀たり、型ヒントず異なる型の倀を代入しおも゚ラヌにはなりたせん。 - -```python-repl:10 ->>> user_id: int = 123 ->>> type(user_id) - ->>> # int型ずヒントを付けたが、文字列を代入できおしたう ->>> user_id = "abc-789" ->>> type(user_id) - -``` - -型ヒントは、コヌドの可読性を高めたり、MyPyのような静的解析ツヌルや統合開発環境IDEがコヌドのバグを事前に発芋したりするために利甚されたす。 - -## この章のたずめ - - * Pythonでは倉数の型宣蚀は䞍芁で、倀の代入によっお型が自動的に決たる**動的型付け**。 - * 基本的なデヌタ型ずしお**数倀** (`int`, `float`)、**文字列** (`str`)、**真停倀** (`bool`) がある。 - * 文字列に倉数を埋め蟌むには、簡朔で匷力な **f-string** を䜿うのが䞀般的。 - * **型ヒント** (`倉数名: 型`) は、コヌドの可読性を向䞊させるための泚釈であり、実行時に型の匷制力はない。 - -### 緎習問題1 - -`item_name` ずいう倉数に商品名文字列、`price` ずいう倉数に䟡栌敎数、`stock` ずいう倉数に圚庫数敎数をそれぞれ代入しおください。その埌、f-stringを䜿っお「商品: [商品名], 䟡栌: [䟡栌]円, 圚庫: [圚庫数]個」ずいう圢匏の文字列にし、 `print()` で出力するコヌドを曞いおみたしょう。 - -```python:practice2_1.py -``` - -```python-exec:practice2_1.py -(出力䟋) 商品: 高性胜マりス, 䟡栌: 4500円, 圚庫: 2個 -``` - -### 緎習問題2 - -`is_adult` ずいう倉数に `bool` 型の型ヒントを付けお `True` を代入し、`type()` で型を確認しおください。その埌、同じ倉数に数倀の `20` を代入し、再床 `type()` で型を確認しおください。この結果から、型ヒントが実行時の動䜜にどのような圱響を䞎えるあるいは䞎えないか考察しおみたしょう。 - -```python:practice2_2.py -``` - -```python-exec:practice2_2.py -``` diff --git a/public/docs/python-3.md b/public/docs/python-3.md deleted file mode 100644 index a09126d..0000000 --- a/public/docs/python-3.md +++ /dev/null @@ -1,299 +0,0 @@ -# 第3ç« : Pythonを䜿いこなすリスト、タプル、蟞曞、セット - -Pythonのプログラミングにおいお、デヌタを効率的に扱う胜力は非垞に重芁です。この章では、Pythonに組み蟌たれおいる匷力なコレクションデヌタ構造である**リスト**、**タプル**、**蟞曞**、**セット**を孊びたす。これらのデヌタ構造は、他の蚀語における配列、ハッシュマップ、集合などず䌌おいたすが、Pythonならではの䟿利な特性やメ゜ッドを持っおいたす。これらを理解し、䜿いこなすこずが「Pythonらしい」コヌドを曞くための第䞀歩です。 - -## リスト (List)ミュヌタブルなシヌケンス - -リストは、耇数の芁玠を順序付けお栌玍できるコレクションです。他の蚀語における「動的配列」に最も近い存圚です。 - - * **ミュヌタブル (Mutable)**: 䜜成埌に芁玠の远加、倉曎、削陀が可胜です。 - * **順序あり (Ordered)**: 芁玠は栌玍された順序を保持したす。 - * **倚様な芁玠**: 数倀、文字列、さらには他のリストなど、異なるデヌタ型の芁玠を混圚させるこずができたす。 - -**基本的な䜿い方 (REPL実行䟋)** - -```python-repl:1 ->>> # リストの䜜成 ->>> fruits = ['apple', 'banana', 'cherry'] ->>> fruits -['apple', 'banana', 'cherry'] - ->>> # 芁玠ぞのアクセス (むンデックスは0から) ->>> fruits[1] -'banana' - ->>> # 芁玠の倉曎 ->>> fruits[0] = 'apricot' ->>> fruits -['apricot', 'banana', 'cherry'] - ->>> # 芁玠の远加 (末尟に) ->>> fruits.append('mango') ->>> fruits -['apricot', 'banana', 'cherry', 'mango'] - ->>> # 芁玠の削陀 (指定したむンデックス) ->>> removed_fruit = fruits.pop(1) ->>> removed_fruit -'banana' ->>> fruits -['apricot', 'cherry', 'mango'] -``` - -リストは非垞に柔軟性が高く、Pythonで最も頻繁に䜿われるデヌタ構造の䞀぀です。 - -## タプル (Tuple)むミュヌタブルなシヌケンス - -タプルはリストず非垞によく䌌おいたすが、最倧の違いは**むミュヌタブル (Immutable)**、぀たり䞀床䜜成したら倉曎できない点です。 - - * **むミュヌタブル (Immutable)**: 芁玠の倉曎、远加、削陀はできたせん。 - * **順序あり (Ordered)**: リスト同様、順序を保持したす。 - -**なぜタプルを䜿うのか** 🀔 - -1. **安党なデヌタ**: 倉曎されたくないデヌタを安党に保持できたす䟋: 関数の匕数、定数セット。 -2. **パフォヌマンス**: 䞀般的にリストよりわずかに高速で、メモリ効率が良いずされおいたす。 -3. **蟞曞のキヌずしお䜿甚可胜**: ミュヌタブルなリストは蟞曞のキヌになれたせんが、むミュヌタブルなタプルはキヌずしお䜿えたす。 - -**基本的な䜿い方 (REPL実行䟋)** - -```python-repl:2 ->>> # タプルの䜜成 (䞞括匧を䜿甚) ->>> coordinates = (10, 20) ->>> coordinates -(10, 20) - ->>> # 芁玠ぞのアクセス ->>> coordinates[0] -10 - ->>> # 倉曎しようずするず゚ラヌが発生する ->>> coordinates[0] = 5 -Traceback (most recent call last): - File "", line 1, in -TypeError: 'tuple' object does not support item assignment - ->>> # アンパッキング (耇数の倉数に芁玠を䞀床に代入) ->>> x, y = coordinates ->>> x -10 ->>> y -20 -``` - -## 蟞曞 (Dictionary)キヌず倀のペア - -蟞曞は、他の蚀語の**ハッシュマップ**や**連想配列**に盞圓したす。順序ではなく、䞀意な「キヌ」を䜿っお「倀」にアクセスしたす。 - - * **キヌず倀のペア**: `key: value` の圢匏でデヌタを栌玍したす。 - * **䞀意なキヌ**: キヌは蟞曞内で重耇しおはいけたせん。 - * **順序**: Python 3.7以降では、芁玠が远加された順序が保持されたす。 - * **ミュヌタブル**: 芁玠の远加、倉曎、削陀が可胜です。 - -**基本的な䜿い方 (REPL実行䟋)** - -```python-repl:3 ->>> # 蟞曞の䜜成 ->>> person = {'name': 'Taro Yamada', 'age': 30, 'city': 'Tokyo'} ->>> person -{'name': 'Taro Yamada', 'age': 30, 'city': 'Tokyo'} - ->>> # 倀ぞのアクセス (キヌを䜿甚) ->>> person['name'] -'Taro Yamada' - ->>> # 倀の倉曎 ->>> person['age'] = 31 ->>> person['age'] -31 - ->>> # 新しいキヌず倀のペアの远加 ->>> person['job'] = 'Engineer' ->>> person -{'name': 'Taro Yamada', 'age': 31, 'city': 'Tokyo', 'job': 'Engineer'} - ->>> # キヌず倀のペアをたずめお取埗 ->>> person.items() -dict_items([('name', 'Taro Yamada'), ('age', 31), ('city', 'Tokyo'), ('job', 'Engineer')]) -``` - -## セット (Set)ナニヌクな芁玠のコレクション - -セットは、**順序がなく、重耇した芁玠を持たない**コレクションです。数孊の「集合」の抂念に近く、和集合や積集合ずいった集合挔算を高速に行えたす。 - - * **ナニヌクな芁玠**: 同じ芁玠を耇数含めるこずはできたせん。 - * **順序なし (Unordered)**: 芁玠の栌玍順は保蚌されたせん。 - * **ミュヌタブル**: 芁玠の远加、削陀は可胜です。 - -**䜿いどころ** - - * リストなどから重耇した芁玠を効率的に削陀したい堎合。 - * 二぀のコレクションに共通する芁玠積集合や、党おの芁玠和集合を求めたい堎合。 - -**基本的な䜿い方 (REPL実行䟋)** - -```python-repl:4 ->>> # セットの䜜成 (重耇した4は自動的に無芖される) ->>> numbers = {1, 2, 3, 4, 4, 5} ->>> numbers -{1, 2, 3, 4, 5} - ->>> # 芁玠の远加 ->>> numbers.add(6) ->>> numbers -{1, 2, 3, 4, 5, 6} - ->>> # 重耇削陀ぞの応甚 ->>> my_list = ['a', 'b', 'c', 'a', 'b'] ->>> unique_elements = set(my_list) ->>> unique_elements -{'c', 'a', 'b'} - ->>> # 集合挔算 ->>> set_a = {1, 2, 3, 4} ->>> set_b = {3, 4, 5, 6} - ->>> # 和集合 (A ∪ B) ->>> set_a | set_b -{1, 2, 3, 4, 5, 6} - ->>> # 積集合 (A ∩ B) ->>> set_a & set_b -{3, 4} -``` - -## スラむシングによる郚分的な芁玠の取埗 - -スラむシングは、リストやタプルのようなシヌケンスから、郚分的な芁玠を効率的に取り出すための非垞に匷力な機胜です。構文は `[start:stop:step]` です。 - -**REPL実行䟋** - -```python-repl:5 ->>> numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - ->>> # むンデックス1から4の手前たで ->>> numbers[1:4] -[1, 2, 3] - ->>> # 最初からむンデックス5の手前たで ->>> numbers[:5] -[0, 1, 2, 3, 4] - ->>> # むンデックス6から最埌たで ->>> numbers[6:] -[6, 7, 8, 9] - ->>> # 2぀おきに芁玠を取埗 ->>> numbers[::2] -[0, 2, 4, 6, 8] - ->>> # 逆順にする ->>> numbers[::-1] -[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] -``` - -## 内包衚蚘 (Comprehensions)による効率的な生成 - -内包衚蚘は、既存のむテラブルから新しいリスト、蟞曞、セットを簡朔か぀効率的に生成するためのPythonらしい構文です。`for`ルヌプを䜿うよりも短く、可読性が高いコヌドを曞くこずができたす。 - -**リスト内包衚蚘** - -`for`ルヌプで曞く堎合ず、リスト内包衚蚘で曞く堎合を比范しおみたしょう。 - -```python-repl:6 ->>> # forルヌプの堎合 ->>> squares_loop = [] ->>> for i in range(10): -... squares_loop.append(i * i) -... ->>> squares_loop -[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] - ->>> # リスト内包衚蚘の堎合 (簡朔) ->>> squares_comp = [i * i for i in range(10)] ->>> squares_comp -[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] - ->>> # 条件付きも可胜 (偶数のみ2乗) ->>> even_squares = [i * i for i in range(10) if i % 2 == 0] ->>> even_squares -[0, 4, 16, 36, 64] -``` - -**蟞曞内包衚蚘** - -```python-repl:7 ->>> # 数倀をキヌ、その2乗を倀ずする蟞曞を䜜成 ->>> square_dict = {x: x*x for x in range(5)} ->>> square_dict -{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} -``` - -**セット内包衚蚘** - -```python-repl:8 ->>> # リスト内のナニヌクな数倀の2乗のセットを䜜成 ->>> numbers = [1, 2, 2, 3, 4, 4, 5] ->>> square_set = {x*x for x in numbers} ->>> square_set -{1, 4, 9, 16, 25} -``` - -## この章のたずめ - -この章では、Pythonでデヌタを扱うための基本的な4぀のコレクションを孊びたした。それぞれの特性を理解し、状況に応じお適切に䜿い分けるこずが重芁です。 - -| デヌタ構造 | 構文䟋 | 倉曎可胜性 | 順序 | 重耇 | 䞻な甚途 | -| :--- | :--- | :--- | :--- | :--- | :--- | -| **リスト (List)** | `[1, 'a', 2]` | **可胜** (ミュヌタブル) | **あり** | 蚱可 | 順序があり、倉曎が必芁な芁玠の集たり。 | -| **タプル (Tuple)** | `(1, 'a', 2)` | **䞍可胜** (むミュヌタブル) | **あり** | 蚱可 | 倉曎しないさせたくないデヌタの集たり、蟞曞のキヌ。 | -| **蟞曞 (Dictionary)** | `{'key': 'value'}` | **可胜** (ミュヌタブル) | **あり** (Python 3.7+) | キヌは䞍蚱可 | キヌず倀のペアでデヌタを管理。 | -| **セット (Set)** | `{1, 'a', 2}` | **可胜** (ミュヌタブル) | **なし** | 䞍蚱可 | 重耇を陀き、芁玠の存圚確認や集合挔算を高速に行う。 | - -加えお、**スラむシング**を䜿えばシヌケンスリストやタプルから郚分的な芁玠を柔軟に取埗でき、**内包衚蚘**を利甚すれば、これらのコレクションを䞀行で効率的か぀Pythonらしく生成できたす。これらのツヌルは、あなたのコヌドをより簡朔で匷力なものにしおくれるでしょう。 - -### 緎習問題1: 商品のフィルタリング - -ある店舗の商品のリストがありたす。このリストから、䟡栌が500円以䞊の商品だけを抜出し、その名前だけを新しいリストに栌玍しおください。 - -**ヒント:** -リスト内包衚蚘ず、蟞曞の倀にアクセスする方法 (`product['price']`) を組み合わせ、`if` 条件を远加しおみたしょう。 - -```python:practice3_1.py -products = [ - {'name': 'Apple', 'price': 150}, - {'name': 'Banana', 'price': 100}, - {'name': 'Melon', 'price': 600}, - {'name': 'Orange', 'price': 120}, - {'name': 'Grape', 'price': 550} -] - -``` - -```python-exec:practice3_1.py -(出力䟋) ['Melon', 'Grape'] -``` - -### 緎習問題2: クラブ掻動のメンバヌ分析 - -2぀のクラブ掻動、「数孊クラブ」ず「科孊クラブ」のメンバヌリストがありたす。セット集合の機胜を䜿っお、以䞋のメンバヌリストを䜜成しおください。 - -a. 䞡方のクラブに所属しおいるメンバヌ -b. 少なくずもどちらか䞀方のクラブに所属しおいる党メンバヌ -c. 数孊クラブにのみ所属しおいるメンバヌ - -**ヒント:** -セットの積集合 (`&`)、和集合 (`|`)、差集合 (`-`) 挔算子を䜿いたす。 - -```python:practice3_2.py -math_club = {'Alice', 'Bob', 'Charlie', 'David'} -science_club = {'Charlie', 'David', 'Eve', 'Frank'} - -``` - -```python-exec:practice3_2.py -(出力䟋) -a. {'Charlie', 'David'} -b. {'Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'} -c. {'Alice', 'Bob'} -``` diff --git a/public/docs/python-4.md b/public/docs/python-4.md deleted file mode 100644 index 6994738..0000000 --- a/public/docs/python-4.md +++ /dev/null @@ -1,284 +0,0 @@ -# 第4ç« : 制埡構文ず関数Pythonらしい曞き方 - -この章では、Pythonの基本的な制埡構文条件分岐、ルヌプず関数の定矩方法に぀いお孊びたす。他の蚀語にも同様の機胜はありたすが、特に`for`ルヌプの振る舞いや、柔軟な匕数の枡し方はPythonの倧きな特城です。これらの「Pythonらしい」曞き方をマスタヌするこずで、より簡朔で読みやすいコヌドを曞けるようになりたす。 - -## if/elif/elseによる条件分岐 - -Pythonの条件分岐は`if`、`elif`else ifの略、`else`を䜿っお蚘述したす。C蚀語やJavaのような波括匧`{}`は䜿わず、**コロン`:`ずむンデント通垞は半角スペヌス4぀**でコヌドブロックを衚珟するのが最倧の特城です。 - -```python-repl:1 ->>> score = 85 ->>> if score >= 90: -... print('優') -... elif score >= 80: -... print('良') -... elif score >= 70: -... print('可') -... else: -... print('䞍可') -... -良 -``` - -条件匏に`and`や`or`、`not`ずいった論理挔算子も䜿甚できたす。 - -```python-repl:2 ->>> temp = 25 ->>> is_sunny = True ->>> if temp > 20 and is_sunny: -... print("お出かけ日和です") -... -お出かけ日和です -``` - -## forルヌプずrange()、enumerate() - -Pythonの`for`ルヌプは、他の蚀語の`for (int i = 0; i < 5; i++)`ずいったカりンタ倉数を䜿うスタむルずは少し異なりたす。リストやタプル、文字列などの**むテラブル反埩可胜オブゞェクト**から芁玠を1぀ず぀取り出しお凊理を実行したす。これは、Javaの拡匵for文やC\#の`foreach`に䌌おいたす。 - -```python-repl:3 ->>> fruits = ['apple', 'banana', 'cherry'] ->>> for fruit in fruits: -... print(f"I like {fruit}") -... -I like apple -I like banana -I like cherry -``` - -### `range()` 関数 - -決たった回数のルヌプを実行したい堎合は、`range()`関数が䟿利です。`range(n)`は0からn-1たでの連続した数倀を生成したす。 - -```python-repl:4 ->>> for i in range(5): -... print(i) -... -0 -1 -2 -3 -4 -``` - -### `enumerate()` 関数 - -ルヌプ凊理の䞭で、芁玠のむンデックス番号ず倀の䞡方を䜿いたい堎合がありたす。そのような時は`enumerate()`関数を䜿うず、コヌドが非垞にスッキリしたす。これは非垞にPythonらしい曞き方の䞀぀です。 - -```python-repl:5 ->>> fruits = ['apple', 'banana', 'cherry'] ->>> for i, fruit in enumerate(fruits): -... print(f"Index: {i}, Value: {fruit}") -... -Index: 0, Value: apple -Index: 1, Value: banana -Index: 2, Value: cherry -``` - -## whileルヌプ - -`while`ルヌプは、指定された条件が`True`である間、凊理を繰り返したす。ルヌプを途䞭で抜けたい堎合は`break`を、珟圚の回の凊理をスキップしお次の回に進みたい堎合は`continue`を䜿甚したす。 - -```python-repl:6 ->>> n = 0 ->>> while n < 5: -... print(n) -... n += 1 -... -0 -1 -2 -3 -4 -``` - -## 関数の定矩 (def) - -関数は`def`キヌワヌドを䜿っお定矩したす。ここでもコヌドブロックはコロン`:`ずむンデントで瀺したす。倀は`return`キヌワヌドで返したす。 - -```python-repl:7 ->>> def greet(name): -... """指定された名前で挚拶を返す関数""" # これはDocstringず呌ばれるドキュメント文字列です -... return f"Hello, {name}!" -... ->>> message = greet("Alice") ->>> print(message) -Hello, Alice! -``` - -匕数ず返り倀に**型アノテヌション型ヒント**を付けるこずもできたす。これはコヌドの可読性を高め、静的解析ツヌルによるバグの発芋を助けたすが、実行時の動䜜に盎接圱響を䞎えるものではありたせん。 -型アノテヌションは `匕数名: 型` のように蚘述し、返り倀の型は `-> 型:` のように蚘述したす。 - -```python-repl:8 ->>> # typingモゞュヌルからList型をむンポヌト ->>> from typing import List ->>> def greet(name: str) -> str: -... """指定された名前で挚拶を返す関数""" -... return f"Hello, {name}!" -... ->>> message = greet("Alice") ->>> print(message) -Hello, Alice! -``` - -## 匕数の枡し方䜍眮匕数、キヌワヌド匕数、デフォルト匕数倀 - -Pythonの関数は、非垞に柔軟な匕数の枡し方ができたす。型アノテヌションず組み合わせるこずで、どのような型の匕数を期埅しおいるかがより明確になりたす。 - - * **䜍眮匕数 (Positional Arguments):** 最も基本的な枡し方で、定矩された順序で倀を枡したす。 - * **キヌワヌド匕数 (Keyword Arguments):** `匕数名=倀`の圢匏で枡したす。順序を問わないため、可読性が向䞊したす。 - * **デフォルト匕数倀 (Default Argument Values):** 関数を定矩する際に匕数にデフォルト倀を蚭定できたす。呌び出し時にその匕数が省略されるず、デフォルト倀が䜿われたす。 - -```python-repl:9 ->>> def describe_pet(animal_type: str, pet_name: str, owner_name: str = "Taro") -> None: -... # この関数は䜕も倀を返さないため、返り倀の型は None ずなりたす -... print(f"私には {animal_type} がいたす。") -... print(f"名前は {pet_name} で、飌い䞻は {owner_name} です。") -... ->>> # 䜍眮匕数のみで呌び出し ->>> describe_pet("ハムスタヌ", "ゞャンボ") -私には ハムスタヌ がいたす。 -名前は ゞャンボ で、飌い䞻は Taro です。 ->>> # キヌワヌド匕数で呌び出し順序を逆にしおもOK ->>> describe_pet(pet_name="ポチ", animal_type="犬") -私には 犬 がいたす。 -名前は ポチ で、飌い䞻は Taro です。 ->>> # デフォルト匕数を持぀匕数を指定しお呌び出し ->>> describe_pet("猫", "ミケ", "Hanako") -私には 猫 がいたす。 -名前は ミケ で、飌い䞻は Hanako です。 -``` - -**泚意点:** デフォルト匕数を持぀匕数は、持たない匕数の埌に定矩する必芁がありたす。 - -## 可倉長匕数 (*args, **kwargs) - -関数の匕数の数が可倉である堎合に察応するための仕組みです。型アノテヌションを䜿う堎合は、`typing`モゞュヌルから`Any`などをむンポヌトするず䟿利です。 - -### `*args` - -任意の数の**䜍眮匕数**をタプルずしお受け取りたす。型アノテヌションでは `*args: 型` のように衚珟したす。 - -```python-repl:10 ->>> def sum_all(*numbers: int) -> int: -... print(f"受け取ったタプル: {numbers}") -... total = 0 -... for num in numbers: -... total += num -... return total -... ->>> print(sum_all(1, 2, 3)) -受け取ったタプル: (1, 2, 3) -6 ->>> print(sum_all(10, 20, 30, 40, 50)) -受け取ったタプル: (10, 20, 30, 40, 50) -150 -``` - -### `**kwargs` - -任意の数の**キヌワヌド匕数**を蟞曞ずしお受け取りたす。型アノテヌションでは `**kwargs: 型` のように衚珟したす。どのような型の倀も受け付ける堎合は `Any` を䜿いたす。 - -```python-repl:11 ->>> from typing import Any ->>> def print_profile(**user_info: Any) -> None: -... print(f"受け取った蟞曞: {user_info}") -... for key, value in user_info.items(): -... print(f"{key}: {value}") -... ->>> print_profile(name="Sato", age=28, city="Tokyo") -受け取った蟞曞: {'name': 'Sato', 'age': 28, 'city': 'Tokyo'} -name: Sato -age: 28 -city: Tokyo -``` - -## ラムダ匏Lambda expressions - -`lambda`キヌワヌドを䜿うず、名前のない小さな**無名関数**を定矩できたす。 - -構文: `lambda 匕数: 匏` - -```python-repl:12 ->>> # 通垞の関数で2぀の数を足す ->>> def add(x: int, y: int) -> int: -... return x + y -... ->>> # ラムダ匏で同じ凊理を定矩 ->>> add_lambda = lambda x, y: x + y ->>> print(add_lambda(3, 5)) -8 ->>> # sorted関数のキヌずしお利甚する䟋 ->>> students = [('Taro', 80), ('Jiro', 95), ('Saburo', 75)] ->>> # 成瞟タプルの2番目の芁玠で゜ヌトする ->>> sorted_students = sorted(students, key=lambda student: student[1], reverse=True) ->>> print(sorted_students) -[('Jiro', 95), ('Taro', 80), ('Saburo', 75)] -``` - -## この章のたずめ - -この章では、Pythonの制埡構文ず関数の基本を孊びたした。他の蚀語の経隓がある方にずっお、特に以䞋の点はPythonの特城ずしお重芁です。 - - * **むンデントが構文の䞀郚**: 波括匧`{}`の代わりにむンデントでコヌドブロックを定矩するため、自然ず誰が曞いおも読みやすいコヌドスタむルになりたす。 - * **`for`ルヌプはむテラブルを巡る**: `for item in collection:` の圢が基本です。むンデックスが必芁な堎合は、`for i, item in enumerate(collection):` のように`enumerate()`を䜿うのがPythonらしい曞き方です。 - * **柔軟な関数匕数**: **キヌワヌド匕数**、**デフォルト匕数倀**、そしお**可倉長匕数 (`*args`, `**kwargs`)** を䜿いこなすこずで、非垞に柔軟で再利甚性の高い関数を䜜成できたす。 - * **型アノテヌション**: 匕数や返り倀に型ヒントを付けるこずで、関数の意図が明確になり、コヌドの信頌性が向䞊したす。 - * **ラムダ匏**: ちょっずした凊理をその堎で関数ずしお枡したい堎合に、`lambda`はコヌドを簡朔に保぀のに圹立ちたす。 - -これらの機胜を理解し䜿いこなすこずが、より効率的で「Pythonicパむ゜ニック」なコヌドを曞くための第䞀歩ずなりたす。 - -### 緎習問題1: 偶数ずそのむンデックスの発芋 - -数倀のリストが䞎えられたずき、そのリストに含たれる**偶数**ずその**むンデックス䜍眮番号**だけを出力するプログラムを曞いおください。 - -**ヒント:** - - * `for`ルヌプず`enumerate()`を組み合わせたす。 - * 数倀が偶数かどうかは、`%`剰䜙挔算子を䜿っお、2で割った䜙りが0になるかで刀定できたす (`number % 2 == 0`)。 - -```python:practice4_1.py -numbers: list[int] = [8, 15, 22, 37, 40, 51, 68] - -``` - -```python-exec:practice4_1.py -(出力䟋) -むンデックス: 0, 倀: 8 -むンデックス: 2, 倀: 22 -むンデックス: 4, 倀: 40 -むンデックス: 6, 倀: 68 -``` - -### 緎習問題2: ナヌザヌプロフィヌル䜜成関数 - -ナヌザヌのプロフィヌル情報を出力する関数 `create_profile` を䜜成しおください。匕数ず返り倀には型アノテヌションを付けおください。 - -**芁件:** - -1. `name`名前は`str`型で、必須の匕数ずしたす。 -2. `age`幎霢ず `city`郜垂は`str`型で、キヌワヌド匕数ずしお任意に受け取れるようにしたす。もし指定されなかった堎合は、幎霢は「秘密」、郜垂は「䞍明」ず衚瀺されるようにしおください。 -3. この関数は倀を返さないものずしたす。 -4. 関数を呌び出し、異なるパタヌンでプロフィヌルが出力されるこずを確認しおください。 - -**ヒント:** - - * `age`ず`city`にはデフォルト匕数倀を蚭定したす。 - * 倀を返さない関数の返り倀の型アノテヌションは `-> None` です。 - -```python:practice4_2.py -def create_profile( -``` - -```python-exec:practice4_2.py -(出力䟋) ---- プロフィヌル --- -名前: Tanaka -幎霢: 秘密 -郜垂: 䞍明 --------------------- ---- プロフィヌル --- -名前: Sato -幎霢: 32 -郜垂: Osaka --------------------- -``` diff --git a/public/docs/python-5.md b/public/docs/python-5.md deleted file mode 100644 index d5f8744..0000000 --- a/public/docs/python-5.md +++ /dev/null @@ -1,333 +0,0 @@ -# 第5ç« : コヌドの敎理術モゞュヌルずパッケヌゞ - -プログラミングを進めおいくず、コヌドは必然的に長くなり、䞀぀のファむルで管理するのが難しくなっおきたす。機胜ごずにファむルを分割し、再利甚しやすく、メンテナンスしやすい構造にするこずが、効率的な開発の鍵ずなりたす。この章では、Pythonでコヌドを敎理するための**モゞュヌル**ず**パッケヌゞ**ずいう仕組み、そしおPythonの匷力な歊噚である**暙準ラむブラリ**の掻甚方法に぀いお孊びたす。 - -## モゞュヌルコヌドを郚品化する - -Pythonでは、**1぀の `.py` ファむルが1぀のモゞュヌル**ずしお扱われたす。モゞュヌルを䜿うこずで、関連する関数やクラスを䞀぀のファむルにたずめ、他のプログラムから再利甚可胜な「郚品」ずしお扱うこずができたす。これは、他の蚀語におけるラむブラリや゜ヌスファむルのむンポヌト機胜に䌌おいたす。 - -### `import`文の基本 - -モゞュヌルを利甚するには `import` 文を䜿いたす。Pythonには倚くの䟿利なモゞュヌルが暙準で甚意されおいたすこれらを**暙準ラむブラリ**ず呌びたす。䟋えば、数孊的な蚈算を行う `math` モゞュヌルを䜿っおみたしょう。 - -```python-repl:1 ->>> # mathモゞュヌルをむンポヌト ->>> import math ->>> # mathモゞュヌル内の倉数や関数を利甚する ->>> print(math.pi) # 円呚率π -3.141592653589793 ->>> print(math.sqrt(16)) # 16の平方根 -4.0 -``` - -出力: - -``` -3.141592653589793 -4.0 -``` - -毎回 `math.` ず曞くのが面倒な堎合は、いく぀かの曞き方がありたす。 - - * **`from ... import ...`**: モゞュヌルから特定の関数や倉数だけを取り蟌む - - ```python-repl:2 - >>> from math import pi, sqrt - >>> - >>> print(pi) # 盎接piを参照できる - 3.141592653589793 - >>> print(sqrt(16)) # 盎接sqrtを参照できる - 4.0 - ``` - - * **`as` (別名)**: モゞュヌルに別名を぀けお利甚する - - ```python-repl:3 - >>> import math as m - >>> - >>> print(m.pi) - 3.141592653589793 - >>> print(m.sqrt(16)) - 4.0 - ``` - -> **泚意** ⚠: `from math import *` のようにアスタリスク (`*`) を䜿うず、そのモゞュヌルのすべおの名前関数、倉数、クラスが珟圚の名前空間にむンポヌトされたす。䞀芋䟿利に芋えたすが、どの名前がどこから来たのか分からなくなり、意図しない名前の䞊曞きを匕き起こす可胜性があるため、**特別な理由がない限り避けるべき**です。 - -### 自䜜モゞュヌルの䜜成ず利甚 - -自分でモゞュヌルを䜜成するのも簡単です。関連する関数をたずめた `.py` ファむルを䜜成するだけです。ここからは耇数のファむルが必芁になるため、再びスクリプトファむルで説明したす。 - -1. **`utils.py` の䜜成**: - たず、䟿利な関数をたずめた `utils.py` ずいうファむルを䜜成したす。 - - ```python:utils.py - def say_hello(name): - """指定された名前で挚拶を返す""" - return f"Hello, {name}!" - - def get_list_average(numbers): - """数倀リストの平均を蚈算する""" - if not numbers: - return 0 - return sum(numbers) / len(numbers) - - # このファむルが盎接実行された堎合にのみ以䞋のコヌドを実行 - if __name__ == "__main__": - print("This is a utility module.") - print(say_hello("World")) - avg = get_list_average([10, 20, 30]) - print(f"Average: {avg}") - ``` - - ```python-exec:utils.py - This is a utility module. - Hello, World! - Average: 20.0 - ``` - - > **`if __name__ == "__main__":` の重芁性** - > この蚘述はPythonの定型句です。 - - > * スクリプトが**盎接実行された**堎合、そのスクリプトの `__name__` ずいう特殊倉数は `"__main__"` になりたす。 - > * スクリプトが**モゞュヌルずしお `import` された**堎合、`__name__` はファむル名この堎合は `"utils"`になりたす。 - > これにより、モゞュヌルずしおむンポヌトされた際には実行したくないテストコヌドやデモコヌドを蚘述するこずができたす。他蚀語経隓者にずっおは、プログラムの「゚ントリヌポむント」を定矩する `main` 関数のような圹割ず考えるず分かりやすいでしょう。 - -2. **`main.py` からの利甚**: - 次に、`utils.py` ず同じディレクトリに `main.py` を䜜成し、`utils` モゞュヌルをむンポヌトしお䜿いたす。 - - ```python:main.py - # 自䜜のutilsモゞュヌルをむンポヌト - import utils - - greeting = utils.say_hello("Alice") - print(greeting) - - scores = [88, 92, 75, 100] - average_score = utils.get_list_average(scores) - print(f"Your average score is: {average_score}") - ``` - - ```python-exec:main.py - Hello, Alice! - Your average score is: 88.75 - ``` - -このように、機胜ごずにファむルを分割するこずで、コヌドの芋通しが良くなり、再利甚も簡単になりたす。 - - -## パッケヌゞモゞュヌルをたずめる - -プロゞェクトがさらに倧きくなるず、倚数のモゞュヌルを管理する必芁が出おきたす。**パッケヌゞ**は、耇数のモゞュヌルをディレクトリ構造で階局的に管理するための仕組みです。 - -### パッケヌゞの抂念ず `__init__.py` - -パッケヌゞは、簡単に蚀うず**モゞュヌルが入ったディレクトリ**です。Pythonにそのディレクトリをパッケヌゞずしお認識させるために、`__init__.py` ずいう名前のファむルを眮きたす近幎のPythonでは必須ではありたせんが、互換性や明瀺性のために眮くのが䞀般的です。 - -以䞋のようなディレクトリ構造を考えおみたしょう。 - -``` -my_project/ -├── main.py -└── my_app/ - ├── __init__.py - ├── models.py - └── services.py -``` - - * `my_app` がパッケヌゞ名になりたす。 - * `__init__.py` は空でも構いたせん。このファむルが存圚するこずで、`my_app` ディレクトリは単なるフォルダではなく、Pythonのパッケヌゞずしお扱われたす。 - * `models.py` ず `services.py` が、`my_app` パッケヌゞに含たれるモゞュヌルです。 - -`main.py` からこれらのモゞュヌルをむンポヌトするには、`パッケヌゞ名.モゞュヌル名` のように蚘述したす。 - -```python -# パッケヌゞ内のモゞュヌルをむンポヌト -from my_app import services - -# servicesモゞュヌル内の関数を実行 (仮の関数) -# user_data = services.fetch_user_data(user_id=123) -# print(user_data) -``` - -`__init__.py` には、パッケヌゞがむンポヌトされた際の初期化凊理を蚘述するこずもできたす。䟋えば、特定のモゞュヌルから関数をパッケヌゞのトップレベルにむンポヌトしおおくず、利甚偎でより短い蚘述でアクセスできるようになりたす。 - -```python -# my_app/__init__.py - -# servicesモゞュヌルからfetch_user_data関数をむンポヌト -from .services import fetch_user_data - -print("my_app package has been initialized.") -``` - -このようにしおおくず、`main.py` から以䞋のように盎接関数をむンポヌトできたす。 - -```python -# main.py - -# __init__.pyで蚭定したおかげで、短いパスでむンポヌトできる -from my_app import fetch_user_data - -user_data = fetch_user_data(user_id=123) -print(user_data) -``` - -## 暙準ラむブラリPythonに備わった匷力なツヌル矀 - -Pythonの倧きな魅力の䞀぀は、その「**バッテリヌ同梱 (Batteries Included)**」ずいう哲孊です。これは、Pythonをむンストヌルしただけで、远加のむンストヌルなしにすぐに䜿える膚倧で匷力な**暙準ラむブラリ**が付属しおいるこずを意味したす。 - -### 暙準ラむブラリの探玢 - -どんなラむブラリがあるかを知るには、公匏ドキュメントが最も信頌できたす。 - - * [**The Python Standard Library — Python 3.x documentation**](https://docs.python.org/3/library/index.html) - -たた、REPLの `help()` や `dir()` を䜿うず、モゞュヌルの内容を簡単に確認できたす。 - -```python-repl:4 ->>> import datetime ->>> # datetimeモゞュヌルが持぀属性や関数のリストを衚瀺 ->>> dir(datetime) -['MAXYEAR', 'MINYEAR', '__all__', '__builtins__', ..., 'date', 'datetime', 'time', 'timedelta', 'timezone', 'tzinfo'] ->>> ->>> # dateクラスのヘルプドキュメントを衚瀺 ->>> help(datetime.date) -Help on class date in module datetime: - -class date(builtins.object) - | date(year, month, day) --> a date object - | - | Methods defined here: -(ヘルプ情報が続く) ... -``` - -### よく䜿われる暙準ラむブラリの䟋 - -ここでは、日垞的によく䜿われる暙準ラむブラリをいく぀か玹介したす。 - - * **`os`**: オペレヌティングシステムず察話するための機胜を提䟛したす。ファむルやディレクトリの操䜜、環境倉数の取埗などができたす。 - - ```python-repl:5 - >>> import os - >>> # カレントディレクトリのファむル䞀芧を取埗 - >>> os.listdir('.') - ['hello.py', 'utils.py', 'main.py'] - >>> # OSに䟝存しない安党なパスの結合 - >>> os.path.join('data', 'file.txt') # Windowsなら 'data\\file.txt' - 'data/file.txt' - ``` - - * **`sys`**: Pythonむンタプリタ自䜓を制埡するための機胜を提䟛したす。コマンドラむン匕数の取埗や、Pythonの怜玢パスの確認などができたす。 - - ```python-repl:6 - >>> import sys - >>> # Pythonのバヌゞョンを衚瀺 - >>> sys.version # 環境により異なりたす - '3.11.4 (main, Jun 7 2023, 10:13:09) [GCC 12.3.0]' - ``` - - * **`datetime`**: 日付や時刻を扱うための機胜を提䟛したす。 - - ```python-repl:7 - >>> import datetime - >>> # 珟圚の日時を取埗 (実行時刻による) - >>> now = datetime.datetime.now() - >>> print(now) - 2025-08-12 18:26:06.123456 - >>> # 日時をフォヌマットしお文字列にする - >>> now.strftime('%Y-%m-%d %H:%M:%S') - '2025-08-12 18:26:06' - ``` - - * **`json`**: Web APIなどで広く䜿われおいるデヌタ圢匏であるJSONを扱うための機胜を提䟛したす。 - - ```python-repl:8 - >>> import json - >>> # Pythonの蟞曞型デヌタ - >>> user = {"id": 1, "name": "Ken", "email": "ken@example.com"} - >>> # 蟞曞型をJSON圢匏の文字列に倉換 (dumps: dump string) - >>> json_string = json.dumps(user, indent=2) - >>> print(json_string) - { - "id": 1, - "name": "Ken", - "email": "ken@example.com" - } - >>> # JSON圢匏の文字列をPythonの蟞曞型に倉換 (loads: load string) - >>> loaded_user = json.loads(json_string) - >>> loaded_user['name'] - 'Ken' - ``` - -これらの他にも、正芏衚珟を扱う `re`、乱数を生成する `random`、HTTPリク゚ストを送信する `urllib.request` など、数え切れないほどの䟿利なモゞュヌルが暙準で提䟛されおいたす。䜕かを実装したいず思ったら、たずは「Python 暙準ラむブラリ 〇〇」で怜玢しおみるず、車茪の再発明を防ぐこずができたす。 - -## この章のたずめ - -この章では、Pythonのコヌドが耇雑になるに぀れお重芁性を増す、敎理ず再利甚のテクニックを孊びたした。ここで孊んだ抂念は、小さなスクリプトから倧芏暡なアプリケヌションたで、あらゆるレベルのPythonプログラミングで圹立ちたす。 - - * **モゞュヌル**: 1぀の `.py` ファむルは1぀の**モゞュヌル**です。関連する関数やクラスをモゞュヌルにたずめるこずで、コヌドを論理的な単䜍に分割できたす。他のファむルからは `import` 文を䜿っおその機胜を再利甚できたす。 - * **パッケヌゞ**: **パッケヌゞ**は、耇数のモゞュヌルを階局的なディレクトリ構造で管理する仕組みです。これにより、倧芏暡なプロゞェクトでも名前の衝突を避け、関連するコヌドをたずめお敎理するこずができたす。 - * **暙準ラむブラリ**: Pythonには「**バッテリヌ同梱**」ずいう思想があり、`datetime` (日時)、`os` (OS機胜)、`json` (デヌタ圢匏) など、すぐに䜿える䟿利なモゞュヌルが豊富に揃っおいたす。これらを掻甚するこずで、開発を倧幅に効率化できたす。 - -### 緎習問題1: 蚈算モゞュヌルを䜜ろう 🔢 - -四則挔算を行うための自䜜モゞュヌルを䜜成し、別のファむルから利甚しおみたしょう。 - -1. `calculator.py` ずいうファむルを䜜成し、以䞋の4぀の関数を定矩しおください。 - * `add(a, b)`: aずbの和を返す - * `subtract(a, b)`: aずbの差を返す - * `multiply(a, b)`: aずbの積を返す - * `divide(a, b)`: aをbで割った商を返す。ただし、`b` が `0` の堎合は「れロで割るこずはできたせん」ずいう文字列を返すようにしおください。 -2. `practice5_1.py` ずいうファむルを䜜成し、䜜成した `calculator` モゞュヌルをむンポヌトしたす。 -3. `practice5_1.py` の䞭で、`calculator` モゞュヌルの各関数を少なくずも1回ず぀呌び出し、結果を `print` 関数で衚瀺しおください。 - -```python:calculator.py -def add(a, b): - -``` - -```python:practice5_1.py -``` - -```python-exec:practice5_1.py -(出力䟋) -10 + 5 = 15 -10 - 5 = 5 -10 * 5 = 50 -10 / 2 = 5.0 -10 / 0 = れロで割るこずはできたせん -``` - -### 緎習問題2日報デヌタをJSONで䜜成しよう 📝 - -暙準ラむブラリの `datetime` ず `json` を䜿っお、簡単な日報デヌタを䜜成するプログラムを曞いおみたしょう。 - -1. Pythonスクリプトを䜜成したす。 -2. `datetime` モゞュヌルを䜿っお、**珟圚の日付**を `YYYY-MM-DD` 圢匏の文字列ずしお取埗したす。 -3. 以䞋の情報を含むPythonの蟞曞を䜜成したす。 - * `author`: あなたの名前 (文字列) - * `date`: 手順2で取埗した日付文字列 - * `tasks`: その日に行ったタスクのリスト (䟋: `["䌚議", "資料䜜成", "メヌル返信"]`) -4. `json` モゞュヌルを䜿い、手順3で䜜成した蟞曞を人間が読みやすい圢匏 (むンデント付き) のJSON文字列に倉換したす。 -5. 倉換埌のJSON文字列を `print` 関数で衚瀺しおください。 - -**ヒント**: `datetime.datetime.now()` で珟圚時刻を取埗し、`.strftime('%Y-%m-%d')` メ゜ッドで日付をフォヌマットできたす。`json.dumps()` の `indent` 匕数を指定するず、出力がきれになりたす。 - -```python:practice5_2.py -import datetime -import json -``` - -```python-exec:practice5_2.py -(出力䟋) -{ - "author": "山田 倪郎", - "date": "2025-08-17", - "tasks": [ - "Pythonのモゞュヌル孊習", - "緎習問題の実装", - "チヌムミヌティング" - ], - "status": "完了" -} -``` diff --git a/public/docs/python-6.md b/public/docs/python-6.md deleted file mode 100644 index c1c3b22..0000000 --- a/public/docs/python-6.md +++ /dev/null @@ -1,312 +0,0 @@ -# 第6ç« : Pythonicなオブゞェクト指向プログラミング - -Pythonのオブゞェクト指向プログラミングOOPは、他の蚀語ず考え方は䌌おいたすが、よりシンプルで柔軟な構文を持っおいたす。この章では、クラスの定矩から継承、そしおPython特有の「マゞックメ゜ッド」たで、その基本を孊びたす。 - -## `class`の定矩ずむンスタンス化 - -Pythonでは、`class`キヌワヌドを䜿っおクラスを定矩したす。JavaやC++のように波括匧`{}`は䜿わず、むンデントでブロックを瀺したす。非垞にシンプルです。 - -クラスを定矩したら、関数を呌び出すように`クラス名()`ず曞くこずで、そのクラスの**むンスタンス**オブゞェクトを生成できたす。 - -```python:dog1.py -class Dog: - pass # passは䜕もしないこずを瀺す文 - -# Dogクラスのむンスタンスを䜜成 -my_dog = Dog() - -print(my_dog) -``` - -```python-exec:dog1.py -<__main__.Dog object at 0x10e85a4d0> -``` - -## コンストラクタ (`__init__`) ず `self` - -Pythonのクラスでは、`__init__`ずいう名前の特殊なメ゜ッドがコンストラクタの圹割を果たしたす。このメ゜ッドは、クラスがむンスタンス化される際に自動的に呌び出されたす。 - -メ゜ッドの最初の匕数には`self`を曞くのが慣習です。これはむンスタンス自身ぞの参照であり、JavaやC++の`this`に盞圓したす。ただし、Pythonでは`self`を明瀺的に匕数ずしお蚘述する必芁がありたす。 - -```python:dog2.py -class Dog: - # むンスタンス生成時に呌び出されるコンストラクタ - def __init__(self, name, breed): - print(f"{name}ずいう名前の犬が䜜成されたした。") - # self.倉数名 の圢でむンスタンス倉数を定矩 - self.name = name - self.breed = breed - -# むンスタンス化する際に__init__のself以倖の匕数を枡すず、 -# `__init__`メ゜ッドが `self`に`my_dog`むンスタンス、`name`に`"ポチ"`、`breed`に`"柎犬"`を受け取っお実行される -my_dog = Dog("ポチ", "柎犬") - -# むンスタンス倉数にアクセス -print(f"名前: {my_dog.name}") -print(f"犬皮: {my_dog.breed}") -``` - -```python-exec:dog2.py -ポチずいう名前の犬が䜜成されたした。 -名前: ポチ -犬皮: 柎犬 -``` - -## むンスタンス倉数ずクラス倉数 - -Pythonのクラスには、2皮類の倉数がありたす。 - - * **むンスタンス倉数**: `self.倉数名`のように`__init__`内などで定矩され、**各むンスタンスに固有**の倀を持ちたす。䞊の䟋の`name`や`age`がこれにあたりたす。 - * **クラス倉数**: クラス定矩の盎䞋に曞かれ、そのクラスから䜜られた**党おのむンスタンスで共有**されたす。 - -```python:dog3.py -class Dog: - # このクラスから䜜られるむンスタンス党おで共有されるクラス倉数 - species = "むヌ科" - - def __init__(self, name): - # このむンスタンス固有のむンスタンス倉数 - self.name = name - -dog1 = Dog("ポチ") -dog2 = Dog("ハチ") - -# むンスタンス倉数ぞのアクセス -print(f"{dog1.name}も{dog2.name}も、") - -# クラス倉数ぞのアクセス (むンスタンス経由でもクラス経由でも可胜) -print(f"皮は同じく {dog1.species} です。") -print(f"Dogクラスの皮は {Dog.species} です。") - -# クラス倉数を倉曎するず、党おのむンスタンスに圱響が及ぶ -Dog.species = "ネコ科" -print(f"{dog1.name}の皮は {dog1.species}") -print(f"{dog2.name}の皮は {dog2.species}") -``` - -```python-exec:dog3.py -ポチもハチも、 -皮は同じく むヌ科 です。 -Dogクラスの皮は むヌ科 です。 -ポチの皮は ネコ科 -ハチの皮は ネコ科 -``` - -## メ゜ッドの定矩 - -クラス内で定矩される関数をメ゜ッドず呌びたす。むンスタンスのデヌタむンスタンス倉数を操䜜するために䜿甚したす。 -メ゜ッドを定矩する際も、最初の匕数には必ず`self`を指定する必芁がありたす。これにより、メ゜ッド内から`self`を通じおむンスタンス倉数にアクセスできたす。 - -```python:dog4.py -class Dog: - def __init__(self, name): - self.name = name - - # barkずいうメ゜ッドを定矩 - # selfを介しおむンスタンス倉数nameにアクセスする - def bark(self): - return f"{self.name}: ワン" - -my_dog = Dog("ポチ") -print(my_dog.bark()) # メ゜ッドの呌び出し -``` - -```python-exec:dog4.py -ポチ: ワン -``` - -### クラスメンバヌの型アノテヌション - -型安党性を高めるために、クラス倉数やむンスタンス倉数にも型アノテヌション型ヒントを付けるこずができたす。 - - * **クラス倉数**: `倉数名: 型 = 倀` のように蚘述したす。 - * **むンスタンス倉数**: `__init__`内で `self.倉数名: 型 = 倀` のように蚘述するか、クラス盎䞋で `倉数名: 型` ず宣蚀だけしおおくこずもできたす。 - -```python:dog5.py -class Dog: - # クラス倉数の型アノテヌション - species: str = "むヌ科" - - # むンスタンス倉数の型を宣蚀 - name: str - age: int - - def __init__(self, name: str, age: int): - self.name = name - self.age = age - - # メ゜ッドの戻り倀の型アノテヌション - def bark(self) -> str: - return f"{self.name}: ワン" - -my_dog = Dog("ポチ", 3) -``` - -```python-exec:dog5.py -``` - -## 継承 - -あるクラスの機胜を匕き継いだ新しいクラスを䜜成するこずを継承ず呌びたす。Pythonでは、クラス定矩の際に`()`内に芪クラス基底クラスを指定するこずで継承を行いたす。 - -子クラス掟生クラスは芪クラスのメ゜ッドや倉数を党お利甚でき、必芁に応じお䞊曞きオヌバヌラむドするこずも可胜です。芪クラスのメ゜ッドを呌び出したい堎合は`super()`を䜿いたす。 - -```python:dog6.py -# 芪クラス -class Animal: - def __init__(self, name: str): - print("Animalの__init__が呌ばれたした") - self.name = name - - def eat(self) -> str: - return f"{self.name}は食事䞭です。" - - def speak(self) -> str: - return "..." - -# Animalクラスを継承した子クラス -class Dog(Animal): - def __init__(self, name: str, breed: str): - print("Dogの__init__が呌ばれたした") - # super()で芪クラスの__init__を呌び出し、nameを初期化 - super().__init__(name) - self.breed = breed # Dogクラス独自のむンスタンス倉数を远加 - - # 芪のメ゜ッドをオヌバヌラむド - def speak(self) -> str: - return f"{self.name}: ワン" - - -dog = Dog("ポチ", "柎犬") - -# 芪クラスのメ゜ッドも䜿える -print(dog.eat()) -# オヌバヌラむドしたメ゜ッドが呌ばれる -print(dog.speak()) -``` - -```python-exec:dog6.py -Dogの__init__が呌ばれたした -Animalの__init__が呌ばれたした -ポチは食事䞭です。 -ポチ: ワン -``` - -## 基本的なマゞックメ゜ッド (`__str__`, `__repr__`) - -`__init__`のように、アンダヌスコア2぀で囲たれた特殊なメ゜ッドを**マゞックメ゜ッド**たたは**ダンダヌメ゜ッド**ず呌びたす。これらを定矩するこずで、Pythonの組み蟌み関数の挙動をカスタマむズできたす。 - - * `__str__(self)` - * `print()`関数や`str()`でオブゞェクトを文字列に倉換する際に呌び出されたす。 - * 目的は、**人間にずっお読みやすい**、非公匏な文字列衚珟を返すこずです。 - * `__repr__(self)` - * `repr()`関数で呌び出されるほか、`__str__`が定矩されおいない堎合の`print()`や、むンタラクティブシェルでオブゞェクトを評䟡した際に䜿われたす。 - * 目的は、**曖昧さのない**、公匏な文字列衚珟を返すこずです。理想的には、その文字列を評䟡するず同じオブゞェクトを再䜜成できるような衚珟䟋: `MyClass(arg1=1, arg2='B')`が望たしいです。 - -```python:dog7.py -class Dog: - def __init__(self, name, age): - self.name = name - self.age = age - - # print()で衚瀺したずきの振る舞いを定矩 - def __str__(self): - return f"名前: {self.name}, 幎霢: {self.age}" - - # REPLでの評䟡やrepr()での振る舞いを定矩 - def __repr__(self): - return f"Dog(name='{self.name}', age={self.age})" - -dog = Dog("ポチ", 3) - -# print()は__str__を呌び出す -print(dog) - -# str()も__str__を呌び出す -print(str(dog)) - -# repr()は__repr__を呌び出す -print(repr(dog)) - -# REPLやJupyter Notebookなどで倉数をそのたた評䟡するず__repr__が衚瀺される -# >>> dog -# Dog(name='ポチ', age=3) -``` - -```python-exec:dog7.py -名前: ポチ, 幎霢: 3 -名前: ポチ, 幎霢: 3 -Dog(name='ポチ', age=3) -``` - -## この章のたずめ - - * **クラス定矩**: `class ClassName:` で定矩する。 - * **コンストラクタ**: `__init__(self, ...)` メ゜ッドで、むンスタンス化の際に初期化凊理を行う。 - * **`self`**: むンスタンス自身を指す参照。メ゜ッドの第䞀匕数ずしお必ず蚘述する。 - * **倉数**: むンスタンスごずに持぀**むンスタンス倉数**ず、党むンスタンスで共有する**クラス倉数**がある。 - * **継承**: `class Child(Parent):` でクラスの機胜を匕き継ぐ。芪のメ゜ッドは`super()`で呌び出せる。 - * **マゞックメ゜ッド**: `__str__`や`__repr__`などを定矩するこずで、オブゞェクトの振る舞いをカスタマむズできる。 - -## この章のたずめ - -この章では、Pythonにおけるオブゞェクト指向プログラミングの基本を孊びたした。 - - * **クラスずむンスタンス**: `class`キヌワヌドでクラスずいう「蚭蚈図」を定矩し、`クラス名()`でむンスタンスずいう「実䜓」を䜜成したす。 - * **`__init__`ず`self`**: `__init__`はむンスタンス化の際に呌ばれるコンストラクタです。第䞀匕数の`self`はむンスタンス自身を指し、`self.倉数名`の圢でむンスタンスごずにナニヌクな**むンスタンス倉数**を定矩したす。 - * **クラス倉数**: クラス盎䞋に定矩され、党おのむンスタンスで共有される倉数です。 - * **メ゜ッド**: クラス内で定矩される関数で、むンスタンスの振る舞いを衚したす。メ゜ッドの第䞀匕数も必ず`self`です。 - * **継承**: `class 子クラス(芪クラス):`ず曞くこずで、芪クラスの機胜を匕き継いだ新しいクラスを䜜成できたす。`super()`を䜿うこずで、芪クラスのメ゜ッドを呌び出せたす。 - * **マゞックメ゜ッド**: `__str__`や`__repr__`のように`__`で囲たれた特殊なメ゜ッドで、`print()`などの組み蟌み関数の挙動をカスタマむズできたす。 - -PythonのOOPは、JavaやC++に比べおシンプルで盎感的な構文が特城です。しかし、その裏偎にある「すべおがオブゞェクトである」ずいう思想は䞀貫しおおり、非垞に匷力なプログラミングパラダむムです。 - -### 緎習問題1: `Book`クラスの䜜成 - -曞籍の情報を管理する`Book`クラスを䜜成しおください。 - -**芁件:** - -1. むンスタンス化する際に、`title`タむトルず`author`著者を匕数で受け取る。 -2. `info()`ずいうメ゜ッドを持ち、呌び出すず`「{タむトル}」- {著者}`ずいう圢匏の文字列を返す。 -3. `print()`でむンスタンスを盎接衚瀺した際に、`info()`メ゜ッドず同じ文字列が衚瀺されるようにする。 - -```python:practice6_1.py -class Book: - - -if __name__ == "__main__": - harry_potter = Book("ハリヌ・ポッタヌず賢者の石", "J.K. ロヌリング") - print(harry_potter.info()) - print(harry_potter) -``` - -```python-exec:practice6_1.py -「ハリヌ・ポッタヌず賢者の石」- J.K. ロヌリング -「ハリヌ・ポッタヌず賢者の石」- J.K. ロヌリング -``` - -#### 緎習問題2: 継承を䜿った`EBook`クラスの䜜成 - -問題1で䜜成した`Book`クラスを継承しお、電子曞籍を衚す`EBook`クラスを䜜成しおください。 - -**芁件:** - -1. `Book`クラスを継承する。 -2. むンスタンス化の際に、`title`、`author`に加えお`file_size`ファむルサむズ、MB単䜍も匕数で受け取る。 -3. `info()`メ゜ッドを**オヌバヌラむド**し、呌び出すず`「{タむトル}」- {著者} (ファむルサむズ: {file_size}MB)`ずいう圢匏の文字列を返すように倉曎する。 - -```python:practice6_2.py -from practice6_1 import Book - -class EBook(Book): - - -if __name__ == "__main__": - ebook_version = EBook("Python実践入門", "掌田 接耶乃", 24) - print(ebook_version.info()) -``` - -```python-exec:practice6_2.py -「Python実践入門」- 掌田 接耶乃 (ファむルサむズ: 24MB) -``` diff --git a/public/docs/python-7.md b/public/docs/python-7.md deleted file mode 100644 index ed69636..0000000 --- a/public/docs/python-7.md +++ /dev/null @@ -1,277 +0,0 @@ -# 第7ç« : ファむルの入出力ずコンテキストマネヌゞャ - -この章では、テキストファむルやJSON、CSVファむルの読み曞きずいった、実践的なファむル操䜜を孊びたす。特に、リ゜ヌス管理を安党か぀簡朔に行うための **`with`** 文コンテキストマネヌゞャは、Pythonプログラミングにおいお必須の知識です。 - -## `open()`関数によるファむルのオヌプン - -Pythonでファむルを操䜜するには、たず組み蟌み関数の **`open()`** を䜿っおファむルオブゞェクトを取埗したす。`open()` は少なくずも2぀の匕数、ファむルパスずモヌドを取りたす。 - - * **ファむルパス**: 操䜜したいファむルぞのパス䟋: `'data.txt'`。 - * **モヌド**: ファむルをどのように開くかを指定する文字列。 - * `'r'`: 読み蟌み専甚デフォルト - * `'w'`: 曞き蟌み専甚ファむルが存圚すれば䞊曞き - * `'a'`: 远蚘ファむルの末尟に曞き足す - * `'x'`: 新芏䜜成しお曞き蟌みファむルが存圚するず゚ラヌ - * `'+'` を付けるず読み曞き䞡甚になりたす䟋: `'r+'`, `'w+'`。 - * `'b'` を付けるずバむナリモヌドになりたす䟋: `'rb'`, `'wb'`。 - -```python-repl:1 ->>> # 'w' モヌドでファむルを開くたたは新芏䜜成する ->>> f = open('spam.txt', 'w', encoding='utf-8') ->>> f -<_io.TextIOWrapper name='spam.txt' mode='w' encoding='utf-8'> ->>> # ファむルを䜿い終わったら必ず閉じる ->>> f.close() -``` - -**`encoding='utf-8'`** は、特に日本語のような非ASCII文字を扱う際に重芁です。文字化けを防ぐため、テキストファむルを扱う際ぱンコヌディングを明瀺的に指定するこずを匷く掚奚したす。ファむルを閉じる **`close()`** メ゜ッドを呌び出すたで、ファむルリ゜ヌスはプログラムによっお確保されたたたになりたす。 - - -## テキストファむルの読み曞き - -ファむルオブゞェクトのメ゜ッドを䜿っお、ファむルの内容を操䜜したす。 - -### 曞き蟌み - -**`write()`** メ゜ッドは、文字列をファむルに曞き蟌みたす。このメ゜ッドは曞き蟌んだ文字数を返したす。 - -```python-repl:2 ->>> f = open('test.txt', 'w', encoding='utf-8') ->>> f.write('こんにちは、䞖界\n') -9 ->>> f.write('これは2行目です。\n') -9 ->>> f.close() -``` - -`write()` は自動的には改行しないため、必芁であれば自分で改行コヌド `\n` を远加したす。 - -```text-readonly:test.txt -こんにちは、䞖界 -これは2行目です。 -``` - -### 読み蟌み - -ファむルからデヌタを読み蟌むには、いく぀かの方法がありたす。 - - * **`read()`**: ファむルの内容党䜓を䞀぀の文字列ずしお読み蟌みたす。 - * **`readline()`**: ファむルから1行だけを読み蟌み、文字列ずしお返したす。 - * **`readlines()`**: ファむルのすべおの行を読み蟌み、各行を芁玠ずするリストで返したす。 - -```python-repl:3 ->>> # 先ほど曞き蟌んだファむルを読み蟌む ->>> f = open('test.txt', 'r', encoding='utf-8') ->>> content = f.read() ->>> print(content) -こんにちは、䞖界 -これは2行目です。 - ->>> f.close() - ->>> # readline() を䜿っお1行ず぀読む ->>> f = open('test.txt', 'r', encoding='utf-8') ->>> f.readline() -'こんにちは、䞖界\n' ->>> f.readline() -'これは2行目です。\n' ->>> f.readline() # ファむルの終端に達するず空文字列を返す -'' ->>> f.close() -``` - - -## `with`文による安党なファむル操䜜コンテキストマネヌゞャ - -ファむルを `open()` したら `close()` する必芁がありたすが、凊理䞭に䟋倖が発生するず `close()` が呌ばれない可胜性がありたす。これを確実に、そしお簡朔に曞く方法が **`with`** 文です。 - -**`with`** 文のブロックを抜けるず、ファむルオブゞェクトは自動的に `close()` されたす。゚ラヌが発生した堎合でも同様です。これは「コンテキストマネヌゞャ」ずいう仕組みによっお実珟されおおり、ファむル操䜜の暙準的な方法です。 - -```python-repl:4 ->>> # with文を䜿った曞き蟌み ->>> with open('spam.txt', 'w', encoding='utf-8') as f: -... f.write('withブロックを䜿っおいたす。\n') -... f.write('ブロックを抜けるず自動で閉じられたす。\n') -... ->>> # ブロックの倖ではファむルは閉じおいる ->>> f.closed -True - ->>> # with文を䜿った読み蟌み ->>> with open('spam.txt', 'r', encoding='utf-8') as f: -... data = f.read() -... ->>> print(data) -withブロックを䜿っおいたす。 -ブロックを抜けるず自動で閉じられたす。 - -``` - -このように、`with` 文を䜿えば `close()` の呌び出しを忘れる心配がなく、コヌドもすっきりしたす。今埌は垞に `with` 文を䜿っおファむルを扱うようにしたしょう。 - -```text-readonly:spam.txt -withブロックを䜿っおいたす。 -ブロックを抜けるず自動で閉じられたす。 -``` - -## `json`モゞュヌルを䜿ったJSONの操䜜 - -**JSON (JavaScript Object Notation)** は、デヌタ亀換フォヌマットずしお広く䜿われおいたす。Pythonの暙準ラむブラリである **`json`** モゞュヌルを䜿うず、Pythonのオブゞェクト蟞曞やリストなどをJSON圢匏のデヌタに、たたはその逆に倉換できたす。 - - * **`json.dump(obj, fp)`**: Pythonオブゞェクト `obj` をJSON圢匏でファむルオブゞェクト `fp` に曞き蟌みたす。 - * **`json.load(fp)`**: JSON圢匏のファむルオブゞェクト `fp` からデヌタを読み蟌み、Pythonオブゞェクトに倉換したす。 - - - -```python-repl:5 ->>> import json - ->>> # 曞き蟌むデヌタPythonの蟞曞 ->>> data = { -... "name": "Taro Yamada", -... "age": 30, -... "is_student": False, -... "courses": ["Python", "Machine Learning"] -... } - ->>> # with文を䜿っおJSONファむルに曞き蟌む ->>> with open('user.json', 'w', encoding='utf-8') as f: -... # ensure_ascii=Falseで日本語をそのたた出力 -... json.dump(data, f, indent=4, ensure_ascii=False) -... - ->>> # JSONファむルから読み蟌む ->>> with open('user.json', 'r', encoding='utf-8') as f: -... loaded_data = json.load(f) -... ->>> loaded_data -{'name': 'Taro Yamada', 'age': 30, 'is_student': False, 'courses': ['Python', 'Machine Learning']} ->>> loaded_data['name'] -'Taro Yamada' -``` - -`json.dump()` の `indent=4` は、人間が読みやすいように4スペヌスのむンデントを付けお出力するオプションです。`ensure_ascii=False` は、日本語などの非ASCII文字をそのたたの文字で出力するために指定したす。 - -```json-readonly:user.json -{ - "name": "Taro Yamada", - "age": 30, - "is_student": false, - "courses": [ - "Python", - "Machine Learning" - ] -} -``` - -## `csv`モゞュヌルを䜿ったCSVの操䜜 - -**CSV (Comma-Separated Values)** は、スプレッドシヌトやデヌタベヌスでよく䜿われる衚圢匏のデヌタを保存するためのフォヌマットです。**`csv`** モゞュヌルを䜿うず、CSVファむルの読み曞きが簡単になりたす。 - -### CSVファむルぞの曞き蟌み - -**`csv.writer()`** を䜿っおラむタヌオブゞェクトを䜜成し、**`writerow()`** (1行) や **`writerows()`** (耇数行) メ゜ッドでデヌタを曞き蟌みたす。 - -```python-repl:6 ->>> import csv - ->>> # 曞き蟌むデヌタリストのリスト ->>> data_to_write = [ -... ["ID", "Name", "Score"], -... [1, "Alice", 95], -... [2, "Bob", 88], -... [3, "Charlie", 76] -... ] - ->>> # newline='' はWindowsでの䞍芁な空行を防ぐためのおたじない ->>> with open('scores.csv', 'w', newline='', encoding='utf-8') as f: -... writer = csv.writer(f) -... writer.writerows(data_to_write) -... -``` - -```csv-readonly:scores.csv -ID,Name,Score -1,Alice,95 -2,Bob,88 -3,Charlie,76 -``` - -### CSVファむルの読み蟌み - -**`csv.reader()`** を䜿っおリヌダヌオブゞェクトを䜜成したす。このオブゞェクトをルヌプで回すこずで、1行ず぀リストずしおデヌタを取埗できたす。 - -```python-repl:7 ->>> import csv - ->>> with open('scores.csv', 'r', newline='', encoding='-utf-8') as f: -... reader = csv.reader(f) -... # リヌダヌオブゞェクトはむテレヌタなのでforルヌプで回せる -... for row in reader: -... print(row) -... -['ID', 'Name', 'Score'] -['1', 'Alice', '95'] -['2', 'Bob', '88'] -['3', 'Charlie', '76'] -``` - -泚意点ずしお、`csv`モゞュヌルはすべおのデヌタを文字列ずしお読み蟌みたす。数倀ずしお扱いたい堎合は、自分で `int()` や `float()` を䜿っお型倉換する必芁がありたす。 - - -## この章のたずめ - -この章では、Pythonを䜿った基本的なファむルの入出力に぀いお孊びたした。 - - - **`open()` 関数**: ファむルを開き、ファむルオブゞェクトを取埗するための基本です。モヌド (`'r'`, `'w'`, `'a'`) ず゚ンコヌディング (`'utf-8'`) の指定が重芁です。 - - **ファむルメ゜ッド**: **`.read()`**, **`.readline()`**, **`.write()`** ずいったメ゜ッドを䜿っお、ファむルの内容を操䜜したす。 - - **`with` 文**: ファむルを自動的に閉じるための最も安党で掚奚される方法です。**コンテキストマネヌゞャ**の仕組みにより、埌片付けが確実に行われたす。 - - **`json` モゞュヌル**: Pythonの蟞曞やリストを、広く䜿われおいるデヌタ圢匏であるJSONずしお読み曞きするために䜿甚したす。**`json.dump()`** ず **`json.load()`** が䞭心的な関数です。 - - **`csv` モゞュヌル**: カンマ区切りの衚圢匏デヌタを扱うためのモゞュヌルです。**`csv.writer()`** ず **`csv.reader()`** を䜿っお、行単䜍での読み曞きを簡単に行えたす。 - -ファむル操䜜は、プログラムの蚭定を保存したり、凊理結果を蚘録したり、他のシステムずデヌタをやり取りしたりするなど、あらゆるアプリケヌションで必芁ずなる基本的なスキルです。 - -### 緎習問題1: ナヌザヌ情報の曞き出しず読み蟌み - -1. 以䞋の情報を持぀ナヌザヌのデヌタを、Pythonの蟞曞ずしお䜜成しおください。 - * `id`: 101 - * `name`: "Sato Kenji" - * `email`: "kenji.satoexample.com" -2. この蟞曞を、`with` 文ず `json` モゞュヌルを䜿っお `user_profile.json` ずいう名前のファむルに曞き出しおください。その際、人間が読みやすいようにむンデントを付けおください。 -3. 曞き出した `user_profile.json` ファむルを読み蟌み、内容をコン゜ヌルに衚瀺しおください。 - -```python:practice7_1.py -``` - -```python-exec:practice7_1.py -(出力䟋) {'id': 101, 'name': 'Sato Kenji', 'email': 'kenji.sato@example.com'} -``` - -```json-readonly:user_profile.json -``` - -### 緎習問題2: 売䞊デヌタのCSV集蚈 - -あなたは店舗の売䞊デヌタCSV圢匏を凊理する必芁がありたす。以䞋の手順でプログラムを䜜成しおください。 - -1. `sales.csv` ファむルを読み蟌みモヌドで開きたす。 -2. `csv.reader` を䜿っおデヌタを1行ず぀読み蟌み、ヘッダヌ行1行目は無芖しおください。 -3. 各商品の「䟡栌」ず「数量」を掛け合わせ、その行の売䞊金額を蚈算したす。 -4. すべおの商品の合蚈売䞊金額を蚈算し、最埌に「合蚈売䞊: XXXX円」ずいう圢匏でコン゜ヌルに出力しおください。 - -**ヒント:** `csv` モゞュヌルで読み蟌んだ倀はすべお文字列型です。蚈算する前に `int()` を䜿っお敎数型に倉換する必芁がありたす。 - -```csv-readonly:sales.csv -商品,䟡栌,数量 -リンゎ,120,3 -バナナ,80,5 -オレンゞ,150,2 -ブドり,300,1 -``` - -```python:practice7_2.py -``` - -```python-exec:practice7_2.py -(出力䟋) 合蚈売䞊: 1360円 -``` diff --git a/public/docs/python-8.md b/public/docs/python-8.md deleted file mode 100644 index 91618b5..0000000 --- a/public/docs/python-8.md +++ /dev/null @@ -1,219 +0,0 @@ -# 第8ç« : ゚ラヌずの付き合い方䟋倖凊理 - -プログラムの実行䞭に予期せぬ問題が発生するず、Pythonは「䟋倖 (exception)」を送出しお凊理を䞭断したす。これらの゚ラヌを攟眮するずプログラムはクラッシュしおしたいたすが、「䟋倖凊理」の仕組みを䜿うこずで、゚ラヌを優雅に捉えお察凊できたす。この章では、その方法を孊びたす。 - -## `try...except`による䟋倖の捕捉 - -他の蚀語の `try...catch` ず同様に、Pythonでは `try...except` ブロックを䜿いたす。゚ラヌが発生する可胜性のあるコヌドを `try` ブロックに蚘述し、゚ラヌが発生した際の凊理を `except` ブロックに蚘述したす。 - -䟋えば、`0` で割り算をするず `ZeroDivisionError` ずいう䟋倖が発生したす。 - -```python-repl:1 ->>> 10 / 0 -Traceback (most recent call last): - File "", line 1, in -ZeroDivisionError: division by zero -``` - -この゚ラヌを `try...except` で捕捉しおみたしょう。 - -```python-repl:2 ->>> try: -... result = 10 / 0 -... except ZeroDivisionError: -... print("゚ラヌ: 0で割るこずはできたせん。") -... -゚ラヌ: 0で割るこずはできたせん。 -``` - -`try` ブロック内で `ZeroDivisionError` が発生したため、プログラムはクラッシュせずに `except` ブロック内の凊理が実行されたした。 - -## 耇数の䟋倖を凊理する方法 - -`try` ブロック内では、耇数の皮類の゚ラヌが発生する可胜性がありたす。䟋えば、ナヌザヌの入力を数倀に倉換しようずしお倱敗した堎合は `ValueError` が発生したす。 - -耇数の䟋倖を凊理するには、2぀の方法がありたす。 - -**1. `except` ブロックを耇数蚘述する** - -゚ラヌの皮類ごずに異なる凊理を行いたい堎合に適しおいたす。 - -```python-repl:3 ->>> def calculate(a, b): -... try: -... a = int(a) -... b = int(b) -... result = a / b -... print(f"蚈算結果: {result}") -... except ValueError: -... print("゚ラヌ: 数倀を入力しおください。") -... except ZeroDivisionError: -... print("゚ラヌ: 0で割るこずはできたせん。") -... ->>> calculate(10, 2) -蚈算結果: 5.0 ->>> calculate(10, 0) -゚ラヌ: 0で割るこずはできたせん。 ->>> calculate('ten', 2) -゚ラヌ: 数倀を入力しおください。 -``` - -**2. 1぀の `except` ブロックでタプルを䜿っおたずめる** - -耇数の䟋倖に察しお同じ凊理を行いたい堎合に䟿利です。 - -```python-repl:4 ->>> def calculate_v2(a, b): -... try: -... a = int(a) -... b = int(b) -... result = a / b -... print(f"蚈算結果: {result}") -... except (ValueError, ZeroDivisionError) as e: -... print(f"入力゚ラヌが発生したした: {e}") -... ->>> calculate_v2(20, 0) -入力゚ラヌが発生したした: division by zero ->>> calculate_v2('twenty', 5) -入力゚ラヌが発生したした: invalid literal for int() with base 10: 'twenty' -``` - -`as e` のように曞くこずで、発生した䟋倖オブゞェクトそのものを倉数 `e` で受け取るこずができたす。これにより、具䜓的な゚ラヌメッセヌゞを衚瀺できたす。 - -## 独自䟋倖の送出 (`raise`) - -特定の条件を満たした堎合に、意図的に䟋倖を発生させたいこずがありたす。その堎合は `raise` 文を䜿いたす。 - -䟋えば、負の倀を受け付けない関数を考えおみたしょう。 - -```python-repl:5 ->>> def process_positive_number(num): -... if num < 0: -... raise ValueError("負の倀は凊理できたせん。") -... print(f"{num}を凊理したした。") -... ->>> process_positive_number(100) -100を凊理したした。 ->>> process_positive_number(-5) -Traceback (most recent call last): - File "", line 1, in - File "", line 3, in process_positive_number -ValueError: 負の倀は凊理できたせん。 -``` - -このように、`raise` を䜿うこずで、関数の事前条件などを満たさない堎合に、プログラムの実行を䞭断しお呌び出し元に゚ラヌを通知できたす。 - -## `else`ず`finally`節の圹割 - -`try...except` ブロックには、`else` ず `finally` ずいう2぀のオプションの節を远加できたす。 - - * **`else` 節**: `try` ブロックで**䟋倖が発生しなかった堎合**にのみ実行されたす。 - * **`finally` 節**: 䟋倖の有無に**関わらず、必ず最埌に**実行されたす。ファむルクロヌズやデヌタベヌス接続の切断など、埌片付け凊理に最適です。 - -すべおの節を䜿った䟋を芋おみたしょう。 - -```python-repl:6 ->>> def divider(a, b): -... print(f"--- {a} / {b} の蚈算を開始したす ---") -... try: -... result = a / b -... except ZeroDivisionError: -... print("゚ラヌ: 0による陀算です。") -... else: -... # 䟋倖が発生しなかった堎合に実行 -... print(f"蚈算成功 結果: {result}") -... finally: -... # 垞に最埌に実行 -... print("--- 蚈算を終了したす ---") -... ->>> # 成功するケヌス ->>> divider(10, 2) ---- 10 / 2 の蚈算を開始したす --- -蚈算成功 結果: 5.0 ---- 蚈算を終了したす --- - ->>> # 䟋倖が発生するケヌス ->>> divider(10, 0) ---- 10 / 0 の蚈算を開始したす --- -゚ラヌ: 0による陀算です。 ---- 蚈算を終了したす --- -``` - -この䟋から、実行フロヌが明確にわかりたす。 - - * 成功ケヌスでは `try` -\> `else` -\> `finally` の順に実行されたす。 - * 倱敗ケヌスでは `try` -\> `except` -\> `finally` の順に実行されたす。 - -`finally` 節は、`try` ブロック内で `return` が実行される堎合でも、その `return` の盎前に実行されるこずが保蚌されおいたす。これにより、リ゜ヌスの解攟挏れなどを防ぐこずができたす。 - -## この章のたずめ - -この章では、Pythonにおける゚ラヌ凊理の基本を孊びたした。重芁なポむントを振り返りたしょう。 - - * **䟋倖**: Pythonでは、゚ラヌは「䟋倖」オブゞェクトずしお扱われたす。䟋倖が発生するず、プログラムの実行は䞭断されたす。 - * `try...except`: 䟋倖が発生する可胜性のあるコヌドを `try` ブロックで囲み、`except` ブロックで捕捉するこずで、プログラムのクラッシュを防ぎ、゚ラヌに応じた凊理を実行できたす。 - * **耇数の䟋倖凊理**: `except` ブロックを耇数蚘述したり、タプルでたずめたりするこずで、さたざたな皮類の゚ラヌに柔軟に察応できたす。 - * `raise`: 特定の条件で意図的に䟋倖を発生させ、プログラムに異垞な状態を通知したす。 - * `else` ず `finally`: `try` ブロックが成功した堎合の凊理を `else` に、成功・倱敗にかかわらず必ず実行したい埌片付け凊理を `finally` に蚘述するこずで、より堅牢なコヌドを曞くこずができたす。 - -䟋倖凊理をマスタヌするこずは、予期せぬ入力や状況に匷い、安定したプログラムを䜜成するための重芁なステップです。 - -### 緎習問題1: 安党なリスト芁玠の取埗 - -リストずむンデックスを受け取り、そのむンデックスに察応する芁玠を返す `safe_get(my_list, index)` ずいう関数を䜜成しおください。 - -**芁件:** - -1. むンデックスがリストの範囲倖の堎合 (`IndexError`)、「指定されたむンデックスは範囲倖です。」ず衚瀺しおください。 -2. むンデックスが敎数でない堎合 (`TypeError`)、「むンデックスは敎数で指定しおください。」ず衚瀺しおください。 -3. 正垞に芁玠を取埗できた堎合は、その芁玠を返しおください。 - -```python:practice8_1.py -def safe_get(my_list, index): - - -data = ['apple', 'banana', 'cherry'] -print(safe_get(data, 1)) -print(safe_get(data, 3)) -print(safe_get(data, 'zero')) -``` - -```python-exec:practice8_1.py -(出力䟋) -banana -指定されたむンデックスは範囲倖です。 -むンデックスは敎数で指定しおください。 -``` - -### 緎習問題2: ナヌザヌ幎霢の怜蚌 - -ナヌザヌの幎霢を入力ずしお受け取り、18歳以䞊であれば「あなたは成人です。」ず衚瀺する `check_age(age_str)` ずいう関数を䜜成しおください。 - -**芁件:** - -1. 関数内郚で、受け取った文字列を敎数に倉換しおください。倉換できない堎合 (`ValueError`) は、`ValueError` を `raise` しお、「有効な数倀を入力しおください。」ずいうメッセヌゞを䌝えおください。 -2. 倉換した数倀が負の倀である堎合、`ValueError` を `raise` しお、「幎霢に負の倀は指定できたせん。」ずいうメッセヌゞを䌝えおください。 -3. 幎霢が0歳から17歳たでの堎合は、「あなたは未成幎です。」ず衚瀺しおください。 -4. 関数の呌び出し偎で、`raise` された䟋倖も捕捉できるようにしおください。 - -```python:practice8_2.py -def check_age(age_str): - - -# 正垞ケヌス -print(check_age("20")) -print(check_age("15")) - -# 䟋倖ケヌス -print(check_age("abc")) -print(check_age("-5")) -``` - -```python-exec:practice8_2.py -(出力䟋) -あなたは成人です。 -あなたは未成幎です。 -Traceback (most recent call last): - ... -ValueError: 有効な数倀を入力しおください。 -``` diff --git a/public/docs/python-9.md b/public/docs/python-9.md deleted file mode 100644 index 11e00cc..0000000 --- a/public/docs/python-9.md +++ /dev/null @@ -1,231 +0,0 @@ -# 第9ç« : さらに先ぞゞェネレヌタずデコレヌタ - -この章では、より高床でPythonらしいコヌドを曞くための匷力な機胜、**ゞェネレヌタ**ず**デコレヌタ**を孊びたす。これらの機胜を䜿いこなすこずで、メモリ効率の良いデヌタ凊理を実装したり、既存の関数の振る舞いを゚レガントに倉曎したりできるようになりたす。 - -## むテレヌタずむテラブル - -Pythonの`for`ルヌプは非垞にシンプルで匷力ですが、その裏偎では**むテレヌションプロトコル**ずいう仕組みが動いおいたす。これを理解するこずが、ゞェネレヌタを孊ぶ䞊での第䞀歩です。 - - * **むテラブル (Iterable)**: `for`ルヌプで繰り返し凊理が可胜なオブゞェクトのこずです。リスト、タプル、蟞曞、文字列などがこれにあたりたす。内郚に `__iter__()` メ゜ッドを持぀オブゞェクトず定矩されたす。 - * **むテレヌタ (Iterator)**: 「次の倀」を返す `__next__()` メ゜ッドを持ち、倀を䞀぀ず぀取り出すためのオブゞェクトです。むテレヌタは䞀床最埌たで進むず、それ以䞊倀を取り出すこずはできたせん。 - -`for`ルヌプは、たずむテラブルオブゞェクトの `__iter__()` を呌び出しおむテレヌタを取埗し、次にそのむテレヌタの `__next__()` を繰り返し呌び出しお芁玠を䞀぀ず぀取り出しおいたす。 - -REPLで動きを芋おみたしょう。`iter()`関数でむテレヌタを取埗し、`next()`関数で芁玠を取り出したす。 - -```python-repl:1 ->>> my_list = [1, 2, 3] ->>> my_iterator = iter(my_list) ->>> type(my_iterator) - - ->>> next(my_iterator) -1 ->>> next(my_iterator) -2 ->>> next(my_iterator) -3 ->>> next(my_iterator) -Traceback (most recent call last): - File "", line 1, in -StopIteration -``` - -最埌の`next()`呌び出しで `StopIteration` ずいう䟋倖が発生しおいるのがわかりたす。`for`ルヌプはこの䟋倖を怜知しお、ルヌプを自動的に終了しおくれたす。 - -## ゞェネレヌタ関数ずyieldキヌワヌド - -むテレヌタを自䜜するには、クラスに `__iter__()` ず `__next__()` を実装する必芁がありたすが、少し手間がかかりたす。そこで登堎するのが**ゞェネレヌタ**です。ゞェネレヌタは、むテレヌタを簡単に䜜成するための特別な関数です。 - -ゞェネレヌタ関数は、通垞の関数ず䌌おいたすが、倀を返すのに`return`の代わりに`yield`を䜿いたす。 - - * **`yield`の働き**: `yield`は倀を返すだけでなく、その時点で関数の実行を**䞀時停止**し、関数の状態ロヌカル倉数などを保存したす。次に`next()`が呌ばれるず、停止した堎所から凊理を再開したす。 - -これにより、巚倧なデヌタセットを扱う際に、党おのデヌタを䞀床にメモリに読み蟌む必芁がなくなりたす。必芁な時に必芁な分だけデヌタを生成するため、非垞にメモリ効率が良いコヌドが曞けたす。 - -フィボナッチ数列を生成するゞェネレヌタの䟋を芋おみたしょう。 - -```python-repl:2 ->>> def fib_generator(n): -... a, b = 0, 1 -... count = 0 -... while count < n: -... yield a -... a, b = b, a + b -... count += 1 -... ->>> f = fib_generator(5) ->>> type(f) - - ->>> next(f) -0 ->>> next(f) -1 ->>> next(f) -1 ->>> next(f) -2 ->>> next(f) -3 ->>> next(f) -Traceback (most recent call last): - File "", line 1, in -StopIteration - -# ゞェネレヌタはもちろんforルヌプで䜿うこずができたす ->>> for num in fib_generator(8): -... print(num, end=' ') -... -0 1 1 2 3 5 8 13 -``` - -## ゞェネレヌタ匏 - -リスト内包衚蚘に䌌た構文で、より簡朔にゞェネレヌタを䜜成する方法が**ゞェネレヌタ匏**です。リスト内包衚蚘の `[]` を `()` に倉えるだけで䜜れたす。 - -リスト内包衚蚘はリストオブゞェクトを生成するため、芁玠数が倚いずメモリを倧量に消費したす。䞀方、ゞェネレヌタ匏はゞェネレヌタオブゞェクトを返すため、遅延評䟡必芁になるたで蚈算しないが行われ、メモリ䜿甚量を抑えられたす。 - -```python-repl:3 -# リスト内包衚蚘 ->>> list_comp = [i * 2 for i in range(5)] ->>> list_comp -[0, 2, 4, 6, 8] ->>> type(list_comp) - - -# ゞェネレヌタ匏 ->>> gen_exp = (i * 2 for i in range(5)) ->>> gen_exp - at 0x...> ->>> type(gen_exp) - - ->>> next(gen_exp) -0 ->>> next(gen_exp) -2 ->>> list(gen_exp) # 残りの芁玠をリストに倉換 -[4, 6, 8] -``` - -巚倧なファむルの各行を凊理する堎合など、ゞェネレヌタ匏は非垞に有効です。 - -## デコレヌタの抂念ず基本的な䜜り方 - -**デコレヌタ**は、既存の関数のコヌドを䞀切倉曎せずに、その関数に新しい機胜を远加装食するための仕組みです。これは、関数を受け取っお、新しい関数を返す**高階関数**ずしお実装されたす。 - -ログ出力、実行時間の蚈枬、認蚌チェックなど、耇数の関数に共通しお適甚したい「暪断的な関心事」を扱うのに非垞に䟿利です。 - -### 基本的な䜜り方 - -デコレヌタの基本的な構造は、関数を入れ子にするこずです。 - -1. 倖偎の関数デコレヌタ関数は、装食したい察象の関数を匕数ずしお受け取りたす。 -2. 内偎の関数ラッパヌ関数で、受け取った関数を呌び出す前埌に、远加したい凊理を蚘述したす。 -3. 倖偎の関数は、この内偎の関数を返したす。 - -関数の実行前埌にメッセヌゞを衚瀺する簡単なデコレヌタを芋おみたしょう。 - -```python-repl:4 ->>> def my_decorator(func): -... def wrapper(): -... print("--- 凊理を開始したす ---") -... func() -... print("--- 凊理が完了したした ---") -... return wrapper -... - ->>> def say_hello(): -... print("こんにちは") -... - -# デコレヌトされた新しい関数を䜜成 ->>> decorated_hello = my_decorator(say_hello) ->>> decorated_hello() ---- 凊理を開始したす --- -こんにちは ---- 凊理が完了したした --- -``` - -この曞き方をより簡単にするための構文が `@`アットマヌク、シンタックスシュガヌです。 - -```python-repl:5 ->>> @my_decorator -... def say_goodbye(): -... print("さようなら") -... - ->>> say_goodbye() ---- 凊理を開始したす --- -さようなら ---- 凊理が完了したした --- -``` - -`@my_decorator` は、`say_goodbye = my_decorator(say_goodbye)` ず同じ意味になりたす。こちらのほうが盎感的で、Pythonのコヌドで広く䜿われおいたす。 - -ゞェネレヌタずデコレヌタは、最初は少し耇雑に感じるかもしれたせんが、䜿いこなせばよりクリヌンで効率的なPythonコヌドを曞くための匷力な歊噚ずなりたす。ぜひ積極的に掻甚しおみおください。 - -はい、承知いたしたした。先に䜜成したチュヌトリアルの末尟に远加する「この章のたずめ」ず「緎習問題」を䜜成したす。 - -## この章のたずめ - -この章では、Pythonプログラミングをさらに高いレベルぞ匕き䞊げるための2぀の匷力な抂念を孊びたした。 - - * **ゞェネレヌタ**: `yield`キヌワヌドを䜿うこずで、メモリ効率に優れたむテレヌタを簡単に䜜成できるこずを孊びたした。ゞェネレヌタ関数やゞェネレヌタ匏を䜿うこずで、巚倧なデヌタストリヌムや無限シヌケンスを、必芁な分だけ蚈算しながら扱うこずができたす。これは、パフォヌマンスが重芁なアプリケヌションにおいお䞍可欠なテクニックです。 - - * **デコレヌタ**: `@`シンタックスを甚いるこずで、既存の関数の゜ヌスコヌドを倉曎するこずなく、機胜を远加・倉曎できるこずを孊びたした。デコレヌタは、ロギング、実行時間蚈枬、アクセス制埡ずいった暪断的な関心事を分離し、コヌドの再利甚性を高め、DRY (Don't Repeat Yourself) の原則を維持するのに圹立ちたす。 - -これらの機胜を䜿いこなすこずは、単に高床な文法を芚えるだけでなく、Pythonの蚭蚈思想を理解し、より「PythonらしいPythonic」コヌドを曞くための重芁なステップです。 - -### 緎習問題1: カりントダりンゞェネレヌタ - -`countdown(start)` ずいうゞェネレヌタ関数を䜜成しおください。この関数は、匕数で䞎えられた `start` の数倀から1たで、1ず぀枛っおいく数倀を順番に `yield` したす。䟋えば `countdown(3)` は、`3`, `2`, `1` の順に倀を生成したす。 - -```python:practice9_1.py -def countdown(start): - - -# 動䜜確認 -cd_gen = countdown(5) -for i in cd_gen: - print(i) -``` - -```python-exec:practice9_1.py -(出力䟋) -5 -4 -3 -2 -1 -``` - -### 問題2: 実行時間蚈枬デコレヌタ - -関数の実行時間を蚈枬し、"実行時間: X.XXXX秒" のように衚瀺するデコレヌタ `@measure_time` を䜜成しおください。このデコレヌタを、少し時間のかかる凊理を行う関数に適甚しお、動䜜を確認しおみたしょう。 - -**ヒント**: 時間の蚈枬には `time` モゞュヌルが䜿えたす。凊理の開始前ず終了埌で `time.time()` を呌び出し、その差分を蚈算したす。 - -```python:practice9_2.py -import time - -def measure_time(func): - - -# 動䜜確認甚の時間のかかる関数 -@measure_time -def slow_function(n): - print(f"{n}たで数えたす...") - time.sleep(n) # n秒間凊理を停止 - print("完了") - -slow_function(2) -``` - -```python-exec:practice9_2.py -(出力䟋) -2たで数えたす... -完了 -実行時間: 2.0021秒 -``` diff --git a/public/docs/ruby-1.md b/public/docs/ruby-1.md deleted file mode 100644 index 4d10219..0000000 --- a/public/docs/ruby-1.md +++ /dev/null @@ -1,147 +0,0 @@ -# 第1ç« : Rubyの䞖界ぞようこそ - 環境構築ず第䞀歩 - -Rubyぞようこそ 他の蚀語でのプログラミング経隓をお持ちのあなたなら、Rubyの持぀柔軟性ず「開発者の楜しさ」をすぐに感じ取れるはずです。この章では、Rubyの基本的な哲孊に觊れ、あなたのマシンに開発環境をセットアップし、最初のコヌドを実行したす。 - -## Rubyの哲孊ず特城 - -Rubyは、た぀もずゆきひろMatz氏によっお開発された、**シンプルさ**ず**生産性**を重芖した動的オブゞェクト指向蚀語です。 - - * **すべおがオブゞェクト (Everything is an Object)** - JavaやPythonでは`int`や`float`などのプリミティブ型がオブゞェクトずは別に存圚したすが、Rubyでは**すべおがメ゜ッドを持぀オブゞェクト**です。`5`のような数倀や`"hello"`のような文字列はもちろん、`nil`nullに盞圓や`true`/`false`さえもオブゞェクトです。 - - ```ruby-repl:1 - irb(main):001> 5.class - => Integer - irb(main):002> "hello".upcase - => "HELLO" - irb(main):003> nil.nil? - => true - ``` - - * **開発者を楜したせる (MINASWAN)** - Rubyの蚭蚈思想の栞は、プログラマがストレスなく、楜しくコヌディングできるこずを最適化する点にありたす。これはしばしば「**MINASWAN** (Matz Is Nice And So We Are Nice)」ずいうコミュニティの暙語にも衚れおいたす。蚀語仕様が厳栌さよりも「驚き最小の原則」や衚珟力を優先するこずがありたす。 - - * **柔軟性ず衚珟力** - Rubyは非垞に柔軟で、既存のクラスを埌から倉曎するオヌプンクラスこずや、コヌドによっおコヌドを操䜜するメタプログラミングが容易です。これにより、Ruby on Railsのような匷力なフレヌムワヌクや、RSpecのようなDSLドメむン固有蚀語が生たれおいたす。 - - -## 他蚀語ずの簡単な比范 - -あなたの経隓蚀語ずRubyを少し比べおみたしょう。 - - * **Pythonistaぞ**: - - * むンデントは構文的な意味を持ちたせん単なる可読性のため。 - * ブロックコヌドのたずたりは`:`ずむンデントではなく、`do...end`キヌワヌド、たたは`{...}`ブレヌスで定矩したす。 - * メ゜ッド呌び出しの䞞括匧`()`は、曖昧さがなければ省略可胜です。`print "hello"`のように曞けたす。 - - * **Java/C\# Developerぞ**: - - * Rubyは静的型付けではなく**動的型付け**です。倉数の型宣蚀`int i = 10`は䞍芁で、`i = 10`ず曞くだけです。 - * コンパむルステップは䞍芁です。スクリプトずしお盎接実行されたす。 - * `public`, `private`, `protected`のアクセス修食子はありたすが、Javaなどずは少し動䜜が異なりたす特に`private`。 - - * **JavaScript Developerぞ**: - - * Rubyもクラスベヌスのオブゞェクト指向ですただし、内郚的にはJSのプロトタむプチェヌンに䌌た特異クラスの仕組みも持ちたす。 - * `this`の代わりに`self`を䜿いたすが、`self`のコンテキストはJSの`this`ほど耇雑に倉化せず、より盎感的です。 - * `true`, `false`, `nil` 以倖はすべお「Truthy真」ずしお扱われたす`0`や空文字列`""`も真です。 - -## 環境構築バヌゞョン管理ツヌルの導入 - -システムOSに最初から入っおいるRubyを盎接䜿うのではなく、**バヌゞョン管理ツヌル**`rbenv`や`RVM`を導入するこずを匷く掚奚したす。 - -プロゞェクトごずに異なるRubyバヌゞョン䟋: 2.7.x ず 3.3.xを簡単に切り替えるこずができ、システムをクリヌンに保おたす。 - -ここでは`rbenv`を䜿った䞀般的な流れを玹介したす。詳现なむンストヌル手順はOSによっお異なりたすので、`rbenv`のGitHubリポゞトリなどを参照しおください。 - -1. **rbenv ず ruby-build のむンストヌル**: - Homebrew (macOS) や apt/yum (Linux) など、お䜿いのパッケヌゞマネヌゞャでむンストヌルしたす。 - -2. **Rubyのむンストヌル**: - - ```bash - # むンストヌル可胜なバヌゞョン䞀芧を確認 - $ rbenv install -l - - # 最新の安定版䟋: 3.3.0をむンストヌル - $ rbenv install 3.3.0 - ``` - -3. **䜿甚するバヌゞョンの蚭定**: - - ```bash - # このPCでのデフォルトバヌゞョンずしお蚭定 - $ rbenv global 3.3.0 - - # バヌゞョンが切り替わったか確認 - $ ruby -v - ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23] - ``` - -## 察話型シェルirbの掻甚 - -Rubyのむンストヌルが完了したら、`irb` (Interactive Ruby) を起動しおみたしょう。これはRubyのREPL (Read-Eval-Print Loop) で、コヌド片を詊したり、ドキュメント代わりに䜿ったりするのに非垞に䟿利です。 - -タヌミナルで`irb`ず入力するこずで起動できたす。 - -このりェブサむトではドキュメント内にRubyの実行環境を埋め蟌んでいたす。 -以䞋のように青枠で囲われたコヌド䟋には自由にRubyコヌドを曞いお詊すこずができたす。 - -```ruby-repl:2 -irb(main):001> 10 * (5 + 3) -=> 80 -irb(main):002> "Ruby".length -=> 4 -irb(main):003> 3.times { puts "Welcome!" } -Welcome! -Welcome! -Welcome! -=> 3 -``` - -`=>` の右偎に衚瀺されおいるのが、匏の**評䟡結果返り倀**です。 - -`3.times`の䟋に泚目しおください。`puts "Welcome!"`が3回実行出力されおいたすが、`=> 3`ず衚瀺されおいたす。これは、`3.times`ずいうメ゜ッド自䜓の返り倀が`3`レシヌバである数倀であるこずを瀺しおいたす。Rubyではすべおの匏が倀を返すこずを芚えおおいおください。 - -## "Hello, World\!" ずスクリプトの実行 - -最埌に、定番の "Hello, World\!" を2通りの方法で実行しおみたしょう。 - -### irbでの実行 - -`puts`"put string"は、匕数を暙準出力タヌミナルに出力し、最埌に改行を远加するメ゜ッドです。 - -```ruby-repl:3 -irb(main):001> puts "Hello, World!" -Hello, World! -=> nil -``` - -`puts`メ゜ッド自䜓の返り倀は、垞に`nil`です。 - -### スクリプトファむルでの実行 - -゚ディタで`hello.rb`ずいう名前のファむルを䜜成したす。 - -```ruby:hello.rb -#!/usr/bin/env ruby -# 1行目はShebangシヌバンず蚀い、Unixç³»OSでスクリプトずしお盎接実行する際に䜿われたす。 - -# 倉数に文字列を代入 -message = "Hello from script file!" - -# 倉数の内容を出力 -puts message -``` - -このファむルを実行するには、タヌミナルで`ruby`コマンドの匕数にファむル名を枡したす。 - -このりェブサむト䞊では以䞋のように実行ボタンをクリックするずスクリプトの実行結果が衚瀺されたす。䞊の hello.rb のコヌドを倉曎しお再床実行するず結果も倉わるはずです。詊しおみおください。 - -```ruby-exec:hello.rb -Hello from script file! -``` - -おめでずうございたす これでRubyの䞖界ぞの第䞀歩を螏み出したした。 -次の章では、Rubyの基本的な構文、デヌタ型、そしお他の蚀語にはない特城的な「シンボル」に぀いお詳しく孊んでいきたす。 diff --git a/public/docs/ruby-10.md b/public/docs/ruby-10.md deleted file mode 100644 index d7a994c..0000000 --- a/public/docs/ruby-10.md +++ /dev/null @@ -1,292 +0,0 @@ -# 第10ç« : 暙準ラむブラリの掻甚 - -Rubyの匷力な点の䞀぀は、倚くの䞀般的なタスクを凊理するための豊富な「暙準ラむブラリ」が同梱されおいるこずです。これらは "batteries included"電池付属ずよく衚珟されたす。 - -他の蚀語で `import` や `include` を䜿うのず同様に、Rubyでは `require` を䜿っおこれらのラむブラリをロヌドしたす。ただし、`File` や `Time`、`Regexp` のようなコア機胜の倚くは、`require` なしで利甚可胜です。 - -この章では、特に䜿甚頻床の高い暙準ラむブラリの機胜を芋おいきたす。 - -## ファむル操䜜 (File, Dir, Pathname) - -ファむルシステムずのやり取りは、倚くのアプリケヌションで䞍可欠です。 - -### Fileクラスによる読み曞き - -`File` クラスは、ファむルに察する基本的な読み曞き操䜜を提䟛したす。 - -**ファむルの曞き蟌みず远蚘:** - -```ruby:file_io_example.rb -# 1. ファむルぞの曞き蟌み (䞊曞き) -# シンプルな方法は File.write です -File.write('sample.txt', "Hello, Ruby Standard Library!\n") - -# 2. ファむルぞの远蚘 -# mode: 'a' (append) オプションを指定したす -File.write('sample.txt', "This is a second line.\n", mode: 'a') - -puts "File 'sample.txt' created and updated." -``` - -```ruby-exec:file_io_example.rb -File 'sample.txt' created and updated. -``` - -```text-readonly:sample.txt -``` - -**ファむルの読み蟌み:** - -```ruby:file_read_example.rb -# 'sample.txt' が存圚するず仮定 - -# 1. ファむル党䜓を䞀床に読み蟌む -content = File.read('sample.txt') -puts "--- Reading all at once ---" -puts content - -# 2. 1行ず぀凊理する (倧きなファむルに効率的) -puts "\n--- Reading line by line ---" -File.foreach('sample.txt') do |line| - print "Line: #{line}" -end - -# 3. 凊理埌にファむルをクリヌンアップ -File.delete('sample.txt') -puts "\n\nFile 'sample.txt' deleted." -``` - -```ruby-exec:file_read_example.rb ---- Reading all at once --- -Hello, Ruby Standard Library! -This is a second line. - ---- Reading line by line --- -Line: Hello, Ruby Standard Library! -Line: This is a second line. - -File 'sample.txt' deleted. -``` - -### DirクラスずPathname - -`Dir` クラスはディレクトリの内容を操䜜するために䜿われたす。特に `Dir.glob` はワむルドカヌドを䜿っおファむルやディレクトリを怜玢するのに䟿利です。 - -しかし、パスの連結や解析を文字列ずしお扱うのは面倒です。`Pathname` ラむブラリは、パスをオブゞェクトずしお扱うための優れたむンタヌフェヌスを提䟛したす。 - -```ruby-repl:1 -irb(main):001:0> # Dir.glob はワむルドカヌドでファむルリストを取埗できたす -irb(main):002:0> Dir.glob('*.rb') # (irbを実行しおいるディレクトリによりたす) -=> [] - -irb(main):003:0> # Pathname を䜿うには require が必芁 -irb(main):004:0> require 'pathname' -=> true - -irb(main):005:0> # 文字列の代わりに Pathname オブゞェクトを䜜成 -irb(main):006:0> base_path = Pathname.new('/usr/local') -=> # - -irb(main):007:0> # + や / 挔算子で安党にパスを連結できたす -irb(main):008:0> lib_path = base_path + 'lib' -=> # -irb(main):009:0> bin_path = base_path / 'bin' -=> # - -irb(main):010:0> # パスの解析 -irb(main):011:0> file_path = Pathname.new('/var/log/app.log') -=> # -irb(main):012:0> file_path.basename # ファむル名 -=> # -irb(main):013:0> file_path.extname # 拡匵子 -=> ".log" -irb(main):014:0> file_path.dirname # 芪ディレクトリ -=> # -irb(main):015:0> file_path.absolute? # 絶察パスか -=> true -``` - -## 日付ず時刻 (Time, Date) - -Rubyには `Time`組み蟌みず `Date`芁 `require`の2぀の䞻芁な日時クラスがありたす。 - - * **Time:** 時刻タむムスタンプをナノ秒たでの粟床で扱いたす。 - * **Date:** 日付幎月日のみを扱い、カレンダヌ蚈算に特化しおいたす。 - -```ruby-repl:2 -irb(main):001:0> # Time (組み蟌み) -irb(main):002:0> now = Time.now -=> 2025-11-04 11:32:00 +0900 (JST) -irb(main):003:0> now.year -=> 2025 -irb(main):004:0> now.monday? -=> false -irb(main):005:0> now.to_i # UNIXタむムスタンプ -=> 1762309920 - -irb(main):006:0> # strftime (string format time) でフォヌマット -irb(main):007:0> now.strftime("%Y-%m-%d %H:%M:%S") -=> "2025-11-04 11:32:00" - -irb(main):008:0> # Date (require が必芁) -irb(main):009:0> require 'date' -=> true -irb(main):010:0> today = Date.today -=> # -irb(main):011:0> today.strftime("%A") # 曜日 -=> "Tuesday" - -irb(main):012:0> # 文字列からのパヌス -irb(main):013:0> christmas = Date.parse("2025-12-25") -=> # -irb(main):014:0> (christmas - today).to_i # あず䜕日 -=> 51 -``` - -## JSONのパヌスず生成 (json) - -珟代のWeb開発においおJSONの扱いは䞍可欠です。`json` ラむブラリは、JSON文字列ずRubyのHash/Arrayを盞互に倉換する機胜を提䟛したす。 - -```ruby-repl:3 -irb(main):001:0> require 'json' -=> true - -irb(main):002:0> # 1. JSON文字列 -> Rubyオブゞェクト (Hash) ぞのパヌス -irb(main):003:0> json_data = '{"user_id": 123, "name": "Alice", "tags": ["admin", "ruby"]}' -=> "{\"user_id\": 123, \"name\": \"Alice\", \"tags\": [\"admin\", \"ruby\"]}" - -irb(main):004:0> parsed_data = JSON.parse(json_data) -=> {"user_id"=>123, "name"=>"Alice", "tags"=>["admin", "ruby"]} -irb(main):005:0> parsed_data['name'] -=> "Alice" -irb(main):006:0> parsed_data['tags'] -=> ["admin", "ruby"] - -irb(main):007:0> # 2. Rubyオブゞェクト (Hash) -> JSON文字列 ぞの生成 -irb(main):008:0> ruby_hash = { -irb(main):009:1* status: "ok", -irb(main):010:1* data: { item_id: 987, price: 1500 } -irb(main):011:1* } -=> {:status=>"ok", :data=>{:item_id=>987, :price=>1500}} - -irb(main):012:0> # .to_json メ゜ッドが䟿利です -irb(main):013:0> json_output = ruby_hash.to_json -=> "{\"status\":\"ok\",\"data\":{\"item_id\":987,\"price\":1500}}" - -irb(main):014:0> # 人が読みやすいように敎圢 (pretty generate) -irb(main):015:0> puts JSON.pretty_generate(ruby_hash) -{ - "status": "ok", - "data": { - "item_id": 987, - "price": 1500 - } -} -=> nil -``` - -## 正芏衚珟 (Regexp) ず match - -Rubyの正芏衚珟 (Regexp) は、Perl互換の匷力なパタヌンマッチング機胜を提䟛したす。`/pattern/` リテラルで蚘述するのが䞀般的です。 - -### マッチの確認 (`=~` ず `match`) - - * `=~` 挔算子: マッチした䜍眮のむンデックス0から始たるを返すか、マッチしなければ `nil` を返したす。 - * `String#match`: `MatchData` オブゞェクトを返すか、マッチしなければ `nil` を返したす。`MatchData` は、キャプチャグルヌプ`()`で囲んだ郚分ぞのアクセスに䟿利です。 - -```ruby-repl:4 -irb(main):001:0> text = "User: alice@example.com (Alice Smith)" -=> "User: alice@example.com (Alice Smith)" - -irb(main):002:0> # =~ は䜍眮を返す -irb(main):003:0> text =~ /alice/ -=> 6 -irb(main):004:0> text =~ /bob/ -=> nil - -irb(main):005:0> # String#match は MatchData を返す -irb(main):006:0> # パタヌン: (ナヌザヌ名)@(ドメむン) -irb(main):007:0> match_data = text.match(/(\w+)@([\w\.]+)/) -=> # - -irb(main):008:0> # マッチしたオブゞェクトからキャプチャを取埗 -irb(main):009:0> match_data[0] # マッチ党䜓 -=> "alice@example.com" -irb(main):010:0> match_data[1] # 1番目の () -=> "alice" -irb(main):011:0> match_data[2] # 2番目の () -=> "example.com" -``` - -### 怜玢ず眮換 (`scan` ず `gsub`) - - * `String#scan`: マッチするすべおの郚分文字列をキャプチャグルヌプがあればその配列ずしお返したす。 - * `String#gsub`: マッチするすべおの郚分を眮換したす (Global SUBstitute)。 - -```ruby-repl:5 -irb(main):001:0> log = "ERROR: code 500. WARNING: code 404. ERROR: code 403." -=> "ERROR: code 500. WARNING: code 404. ERROR: code 403." - -irb(main):002:0> # scan: 'ERROR: code (数字)' にマッチする郚分をすべお探す -irb(main):003:0> log.scan(/ERROR: code (\d+)/) -=> [["500"], ["403"]] - -irb(main):004:0> # gsub: 'ERROR' を 'CRITICAL' に眮換する -irb(main):005:0> log.gsub("ERROR", "CRITICAL") -=> "CRITICAL: code 500. WARNING: code 404. CRITICAL: code 403." - -irb(main):006:0> # gsub はブロックず正芏衚珟を組み合わせお高床な眮換が可胜 -irb(main):007:0> # 数字コヌドを [] で囲む -irb(main):008:0> log.gsub(/code (\d+)/) do |match| -irb(main):009:1* # $1 は最埌のマッチの1番目のキャプチャグルヌプ -irb(main):010:1* "code [#{$1}]" -irb(main):011:1> end -=> "ERROR: code [500]. WARNING: code [404]. ERROR: code [403]." -``` - -## この章のたずめ - - * Rubyには、`require` でロヌドできる豊富な**暙準ラむブラリ**が付属しおいたす。 - * **File**クラスはファむルの読み曞きを、**Pathname**はパス操䜜をオブゞェクト指向的に行いたす。 - * **Time**は時刻を、**Date**は日付を扱いたす。`strftime` でフォヌマットできたす。 - * **json**ラむブラリは `JSON.parse`文字列→Hashず `to_json`Hash→文字列を提䟛したす。 - * **Regexp**`/pattern/`はパタヌンマッチングに䜿いたす。`String#match` で `MatchData` を取埗し、`scan` や `gsub` で怜玢・眮換を行いたす。 - -これらは暙準ラむブラリのごく䞀郚です。他にもCSVの凊理 (`csv`)、HTTP通信 (`net/http`)、テスト (`minitest`) など、倚くの機胜が提䟛されおいたす。 - -### 緎習問題1: JSON蚭定ファむルの読み曞き - -1. `config.json` ファむルを読み蟌み、内容をJSONパヌスしおRubyのHashに倉換しおください。 -2. そのHashの `logging` の倀を `true` に倉曎し、さらに `:updated_at` ずいうキヌで珟圚時刻文字列を远加しおください。 -3. 倉曎埌のHashをJSON文字列に倉換し、`config_updated.json` ずいう名前でファむルに保存しおください。読みやすさのために `JSON.pretty_generate` を䜿っおも構いたせん - -```json-readonly:config.json -{"app_name": "RubyApp", "version": "1.0", "logging": false} -``` - -```ruby:practice10_1.rb -``` - -```ruby-exec:practice10_1.rb -``` - -```json-readonly:config_updated.json -``` - -### 緎習問題2: ログファむルからの情報抜出 - -1. `system.log` ずいうファむルを1行ず぀読み蟌みたす。 -2. 正芏衚珟を䜿い、`[INFO]` で始たり、か぀ `logged in` ずいう文字列を含む行だけを怜出しおください。 -3. マッチした行から、IPアドレス`192.168.1.10` のような圢匏を正芏衚珟のキャプチャグルヌプを䜿っお抜出し、IPアドレスだけをコン゜ヌルに出力しおください。 - -```text-readonly:system.log -[INFO] 2025-11-04 User 'admin' logged in from 192.168.1.10 -[WARN] 2025-11-04 Failed login attempt for user 'guest' -[INFO] 2025-11-04 Service 'payment_gateway' started. -``` - -```ruby:practice10_2.rb -``` - -```ruby-exec:practice10_2.rb -``` diff --git a/public/docs/ruby-11.md b/public/docs/ruby-11.md deleted file mode 100644 index 4637bd6..0000000 --- a/public/docs/ruby-11.md +++ /dev/null @@ -1,358 +0,0 @@ -# 第11ç« : テスト文化入門 - Minitest - -Rubyは動的型付け蚀語であり、コンパむル時ではなく実行時に型が決たりたす。これは柔軟で高速な開発を可胜にする反面、型の䞍䞀臎などによる単玔なミスが実行時たで怜出されにくいずいう特性も持ちたす。 - -そのため、Rubyコミュニティでは「**テストは文化**」ず蚀われるほど、自動化されたテストを曞くこずが重芖されたす。テストは、コヌドが期埅通りに動䜜するこずを保蚌するだけでなく、未来の自分や他の開発者がコヌドをリファクタリング修正・改善する際の「安党網」ずしお機胜したす。 - -この章では、Rubyに暙準で添付されおいるテスティングフレヌムワヌク「Minitest」を䜿い、テストの基本的な曞き方ず文化を孊びたす。 - -## 暙準添付のテスティングフレヌムワヌク「Minitest」 - -Minitestは、Rubyに暙準で含たれおいる別途むンストヌル䞍芁軜量か぀高速なテストフレヌムワヌクです。 - -Ruby on Railsなどの䞻芁なフレヌムワヌクもデフォルトでMinitestを採甚しおおり、Rubyの゚コシステムで広く䜿われおいたす。RSpecずいう、よりDSLドメむン固有蚀語ラむクに蚘述できる人気のフレヌムワヌクもありたすが、たずは暙準のMinitestを理解するこずが基本ずなりたす。 - -Minitestは、`Minitest::Test` を継承する「Unitスタむル」ず、`describe` ブロックを䜿う「Specスタむル」の2皮類の曞き方を提䟛したすが、この章では最も基本的なUnitスタむルを孊びたす。 - -## テストファむルの䜜成ず実行 - -早速、簡単なクラスをテストしおみたしょう。 - -### 1\. テスト察象のクラスの䜜成 - -たず、テスト察象ずなる簡単な電卓クラスを䜜成したす。 - -```ruby:calculator.rb -# シンプルな電卓クラス -class Calculator - def add(a, b) - a + b - end - - def subtract(a, b) - a - b - end -end -``` - -### 2\. テストファむルの䜜成 - -Rubyの芏玄では、テストファむルは `test_` プレフィックス䟋: `test_calculator.rb`たたは `_test.rb` サフィックス䟋: `calculator_test.rb`で䜜成するのが䞀般的です。ここでは `test_calculator.rb` を䜜成したす。 - -テストファむルは、以䞋の芁玠で構成されたす。 - -1. `require 'minitest/autorun'` - * Minitestラむブラリを読み蟌み、ファむル実行時にテストが自動で走るようにしたす。 -2. `require_relative 'ファむル名'` - * テスト察象のファむル今回は `calculator.rb`を読み蟌みたす。 -3. `class クラス名 < Minitest::Test` - * テストクラスを定矩し、`Minitest::Test` を継承したす。 -4. `def test_メ゜ッド名` - * `test_` で始たるメ゜ッドを定矩したす。これが個々のテストケヌスずなりたす。 - -```ruby:test_calculator.rb -require 'minitest/autorun' -require_relative 'calculator' - -class CalculatorTest < Minitest::Test - # `test_` で始たるメ゜ッドがテストずしお実行される - def test_addition - # テスト察象のむンスタンスを䜜成 - calc = Calculator.new - - # 期埅倀 (Expected) - expected = 5 - # 実際の結果 (Actual) - actual = calc.add(2, 3) - - # アサヌション埌述 - # 期埅倀ず実際の結果が等しいこずを怜蚌する - assert_equal(expected, actual) - end - - def test_subtraction - calc = Calculator.new - # アサヌションは1行で曞くこずが倚い - assert_equal(1, calc.subtract(4, 3)) - end -end -``` - -### 3\. テストの実行 - -タヌミナルで、䜜成した**テストファむル**を実行したす。 - -```ruby-exec:test_calculator.rb -Run options: --seed 51740 - -# Running: - -.. - -Finished in 0.001099s, 1819.8362 runs/s, 1819.8362 assertions/s. - -2 runs, 2 assertions, 0 failures, 0 errors, 0 skips -``` - -実行結果のサマリに泚目しおください。 - - * `.`ドット: テストが成功Passしたこずを瀺したす。 - * `2 runs, 2 assertions`: 2぀のテスト`test_addition` ず `test_subtraction`が実行され、合蚈2回のアサヌション`assert_equal`が成功したこずを意味したす。 - * `0 failures, 0 errors`: 倱敗も゚ラヌもありたせん。 - -もしテストが倱敗するず、`F`Failureや `E`Errorが衚瀺され、詳现なレポヌトが出力されたす。 - -## アサヌションassert\_equal, assert 等の曞き方 - -アサヌションAssertion = 衚明、断蚀は、「この倀はこうあるべきだ」ず怜蚌するためのメ゜ッドです。Minitestは `Minitest::Test` を継承したクラス内で、様々なアサヌションメ゜ッドを提䟛したす。 - -### `assert_equal(expected, actual)` - -最もよく䜿うアサヌションです。「期埅倀expected」ず「実際の結果actual」が `==` で等しいこずを怜蚌したす。 - -> **⚠ 泚意:** 匕数の順序が重芁です。\*\*1番目が「期埅倀」、2番目が「実際の結果」\*\*です。逆にするず、倱敗時のメッセヌゞが非垞に分かりにくくなりたす。 - -```ruby-repl -irb> require 'minitest/assertions' -=> true -irb> include Minitest::Assertions -=> Object -irb> def assert_equal(expected, actual); super; end # irbで䜿うための蚭定 -=> :assert_equal - -irb> assert_equal 5, 2 + 3 -=> true - -irb> assert_equal 10, 2 + 3 -# Minitest::Assertion: <--- 倱敗Assertion Failed -# Expected: 10 -# Actual: 5 -``` - -### `assert(test)` - -`test` が **true**たたはtrueず評䟡される倀であるこずを怜蚌したす。停`false` たたは `nil`の堎合は倱敗したす。 - -```ruby-repl -irb> assert "hello".include?("e") -=> true -irb> assert [1, 2, 3].empty? -# Minitest::Assertion: Expected [] to be empty?. -``` - -### `refute(test)` - -`assert` の逆です。`test` が **false** たたは `nil` であるこずを怜蚌したす。 - -```ruby-repl -irb> refute [1, 2, 3].empty? -=> true -irb> refute "hello".include?("e") -# Minitest::Assertion: Expected "hello".include?("e") to be falsy. -``` - -### `assert_nil(obj)` - -`obj` が `nil` であるこずを怜蚌したす。 - -```ruby-repl -irb> a = nil -=> nil -irb> assert_nil a -=> true -``` - -### `assert_raises(Exception) { ... }` - -ブロック `{ ... }` を実行した結果、指定した䟋倖`Exception`が発生するこずを怜蚌したす。 - -これは、意図した゚ラヌ凊理が正しく動䜜するかをテストするのに非垞に重芁です。 - -```ruby:test_calculator_errors.rb -require 'minitest/autorun' - -class Calculator - def divide(a, b) - raise ZeroDivisionError, "Cannot divide by zero" if b == 0 - a / b - end -end - -class CalculatorErrorTest < Minitest::Test - def test_division_by_zero - calc = Calculator.new - - # ブロック内で ZeroDivisionError が発生するこずを期埅する - assert_raises(ZeroDivisionError) do - calc.divide(10, 0) - end - end -end -``` - -```ruby-exec:test_calculator_errors.rb -Run options: --seed 19800 - -# Running: - -. - -Finished in 0.000624s, 1602.5641 runs/s, 1602.5641 assertions/s. - -1 runs, 1 assertions, 0 failures, 0 errors, 0 skips -``` - -## 簡単なTDDテスト駆動開発の䜓隓 - -TDD (Test-Driven Development) は、機胜のコヌドを曞く前に、**たず倱敗するテストコヌドを曞く**開発手法です。TDDは以䞋の短いサむクルを繰り返したす。 - -1. **Red (レッド):** - * これから実装したい機胜に察する「倱敗するテスト」を曞きたす。 - * ただ機胜が存圚しないため、テストは圓然倱敗Redしたす。 -2. **Green (グリヌン):** - * そのテストをパスさせるための**最小限の**機胜コヌドを実装したす。 - * テストが成功GreenすればOKです。コヌドの綺麗さはただ問いたせん。 -3. **Refactor (リファクタリング):** - * テストが成功した状態を維持したたた、コヌドの重耇をなくしたり、可読性を䞊げたりする「リファクタリング」を行いたす。 - -`Calculator` クラスに、`multiply`掛け算メ゜ッドをTDDで远加しおみたしょう。 - -### 1\. Red: 倱敗するテストを曞く - -たず、`test_calculator.rb` に `multiply` のテストを远加したす。 - -```ruby:calculator.rb -# シンプルな電卓クラス -class Calculator - def add(a, b) - a + b - end - - def subtract(a, b) - a - b - end -end -``` - -```ruby:test_calculator_tdd.rb -require 'minitest/autorun' -require_relative 'calculator' # calculator.rb は add ず subtract のみ - -class CalculatorTest < Minitest::Test - def setup - # @calc をむンスタンス倉数にするず、各テストメ゜ッドで䜿える - @calc = Calculator.new - end - - def test_addition - assert_equal(5, @calc.add(2, 3)) - end - - def test_subtraction - assert_equal(1, @calc.subtract(4, 3)) - end - - # --- TDDサむクル スタヌト --- - - # 1. Red: たずテストを曞く - def test_multiplication - assert_equal(12, @calc.multiply(3, 4)) - end -end -``` - -この時点で `calculator.rb` に `multiply` メ゜ッドは存圚したせん。テストを実行したす。 - -```ruby-exec:test_calculator_tdd.rb -# (実行結果の抜粋) -... -Error: -CalculatorTest#test_multiplication: -NoMethodError: undefined method `multiply' for # -... -1 runs, 0 assertions, 0 failures, 1 errors, 0 skips -``` - -期埅通り、`NoMethodError` でテストが**゚ラヌ (E)** になりたした。これが「Red」の状態です。Failure (F) はアサヌションが期埅ず違った堎合、Error (E) はコヌド実行䞭に䟋倖が発生した堎合を指したす - -### 2\. Green: テストを通す最小限のコヌドを曞く - -次に、`calculator.rb` に以䞋のように `multiply` メ゜ッドを実装し、テストをパスGreenさせたす。 - -```ruby -class Calculator - def add(a, b) - a + b - end - - def subtract(a, b) - a - b - end - - # 2. Green: テストを通す最小限の実装 - def multiply(a, b) - a * b - end -end -``` - -`calculator.rb` を線集し、再びテストを実行するず、以䞋のようにすべおのテストが成功したす。「Green」の状態です。 - -```bash -$ ruby test_calculator_tdd.rb -... -Finished in ... -3 runs, 3 assertions, 0 failures, 0 errors, 0 skips -``` - -### 3\. Refactor: リファクタリング - -今回は実装が非垞にシンプルなのでリファクタリングの必芁はあたりありたせんが、もし `multiply` の実装が耇雑になったり、他のメ゜ッドずコヌドが重耇したりした堎合は、この「Green」のテストが成功しおいる状態で安心しおコヌドをクリヌンアップしたす。 - -TDDは、この「Red -\> Green -\> Refactor」のサむクルを高速で回すこずにより、バグの少ない、メンテンスしやすいコヌドを堅実に構築しおいく手法です。 - -## 📈 この章のたずめ - - * Rubyは動的型付け蚀語であるため、実行時の動䜜を保蚌する**テストが非垞に重芁**です。 - * **Minitest** はRubyに暙準添付された軜量なテスティングフレヌムワヌクです。 - * テストファむルは `require 'minitest/autorun'` し、`Minitest::Test` を継承したす。 - * テストメ゜ッドは `test_` プレフィックスで定矩したす。 - * `assert_equal(期埅倀, 実際の結果)` が最も基本的なアサヌションです。 - * `assert` (true怜蚌), `refute` (false怜蚌), `assert_raises` (䟋倖怜蚌) などもよく䜿われたす。 - * **TDD (テスト駆動開発)** は「Red (倱敗) -\> Green (成功) -\> Refactor (改善)」のサむクルで開発を進める手法です。 - -### 緎習問題1: Stringクラスのテスト - -`Minitest::Test` を䜿っお、Rubyの組み蟌みクラスである `String` の動䜜をテストする `test_string.rb` を䜜成しおください。以䞋の2぀のテストメ゜ッドを実装しおください。 - - * `test_string_length`: `"hello"` の `length` が `5` であるこずを `assert_equal` で怜蚌しおください。 - * `test_string_uppercase`: `"world"` を `upcase` した結果が `"WORLD"` であるこずを `assert_equal` で怜蚌しおください。 - -```ruby:test_string.rb -require 'minitest/autorun' - - -``` - -```ruby-exec:test_string.rb -``` - -### 緎習問題2: TDDでUserクラスを実装 - -TDDの「Red -\> Green」サむクルを䜓隓しおください。 - -1. Red`User` クラスに `first_name` ず `last_name` を枡しおむンスタンス化し、`full_name` メ゜ッドを呌ぶず `"First Last"` のように連結された文字列が返るこずを期埅するテスト `test_full_name` を含む `test_user.rb` を先に䜜成しおください。この時点では `user.rb` は空か、存圚しなくおも構いたせん -2. Greenテストがパスするように、`user.rb` に `User` クラスを実装しおください。`initialize` で名前を受け取り、`full_name` メ゜ッドで連結したす - - -```ruby:user.rb -``` - -```ruby:test_user.rb -require 'minitest/autorun' -require_relative 'user' - -``` - -```ruby-exec:test_user.rb -``` diff --git a/public/docs/ruby-12.md b/public/docs/ruby-12.md deleted file mode 100644 index 3c9004a..0000000 --- a/public/docs/ruby-12.md +++ /dev/null @@ -1,212 +0,0 @@ -# 第12ç« : メタプログラミング入門 - -Rubyの最も匷力であり、同時に最も特城的な偎面の䞀぀が「メタプログラミング」です。これは「コヌドがコヌドを曞くあるいは倉曎する」胜力を指したす。他の蚀語でコンパむル時やリフレクションAPIを通じお行っおいた操䜜の倚くを、Rubyでは実行時に盎接、か぀柔軟に行うこずができたす。 - -## Rubyの動的な性質 - -Rubyは非垞に動的な蚀語です。クラスは実行䞭に倉曎可胜であり、メ゜ッドの远加や削陀、䞊曞きがい぀でも行えたす。この章では、その動的な性質を利甚したメタプログラミングの基本的な手法を孊びたす。 - - * **オヌプンクラス**: Rubyでは、既存のクラス組み蟌みクラスさえもを埌から「開いお」メ゜ッドを远加・倉曎できたす。 - * **実行時**: 倚くの決定がコンパむル時ではなく実行時に行われたす。 - -これらの性質が、DRY (Don't Repeat Yourself) の原則を远求し、柔軟なDSLドメむン固有蚀語を構築するための基盀ずなりたす。 - -## send: メ゜ッドを動的に呌び出す - -通垞、メ゜ッドは `object.method_name` のようにドット`.`を䜿っお呌び出したす。しかし、呌び出したいメ゜ッド名が実行時たでわからない堎合、`send` メ゜ッドたたは `public_send`が圹立ちたす。 - -`send` は、第1匕数にメ゜ッド名を**シンボル**`:`たたは**文字列**で受け取り、残りの匕数をそのメ゜ッドに枡しお実行したす。 - -```ruby-repl -irb(main):001> "hello".send(:upcase) -=> "HELLO" -irb(main):002> "hello".send("length") -=> 5 -irb(main):003> 10.send(:+, 5) # 挔算子も内郚的にはメ゜ッドです -=> 15 -irb(main):004> -irb(main):004> method_to_call = :reverse -irb(main):005> "Ruby".send(method_to_call) -=> "ybuR" -``` - -> **泚意**: `send` は `private` メ゜ッドも呌び出すこずができたす。意図せず `private` メ゜ッドを呌び出さないように、通垞は `public_send` を䜿う方が安党です。 - -## define\_method: メ゜ッドを動的に定矩する - -メ゜ッドを動的に実行時に定矩したい堎合、`define_method` を䜿甚したす。これは䞻にクラスやモゞュヌルの定矩内で䜿われたす。 - -`define_method` は、第1匕数に定矩したいメ゜ッド名シンボルを、第2匕数にブロックProcやLambdaを取りたす。このブロックが、新しく定矩されるメ゜ッドの本䜓ずなりたす。 - -䟋えば、䌌たようなメ゜ッドを倚数定矩する必芁がある堎合に非垞に䟿利です。 - -```ruby:dynamic_greeter.rb -class DynamicGreeter - # 定矩したい挚拶のリスト - GREETINGS = { - hello: "Hello", - goodbye: "Goodbye", - hi: "Hi" - } - - GREETINGS.each do |name, prefix| - # define_methodを䜿っおメ゜ッドを動的に定矩する - define_method(name) do |target| - puts "#{prefix}, #{target}!" - end - end -end - -greeter = DynamicGreeter.new - -# 動的に定矩されたメ゜ッドを呌び出す -greeter.hello("World") -greeter.goodbye("Alice") -greeter.hi("Bob") -``` - -```ruby-exec:dynamic_greeter.rb -Hello, World! -Goodbye, Alice! -Hi, Bob! -``` - -## method\_missing: 存圚しないメ゜ッドぞの応答 - -オブゞェクトに察しお定矩されおいないメ゜ッドが呌び出されるず、Rubyは䟋倖`NoMethodError`を発生させる前に、`method_missing` ずいう特別なメ゜ッドを呌び出そうず詊みたす。 - -この `method_missing` を自分でオヌバヌラむドするこずで、定矩されおいないメ゜ッド呌び出しを「キャッチ」し、動的に凊理できたす。 - -`method_missing` は以䞋の匕数を受け取りたす。 - -1. 呌び出されようずしたメ゜ッド名シンボル -2. そのメ゜ッドに枡された匕数配列 -3. そのメ゜ッドに枡されたブロック存圚する堎合 - -```ruby:ghost_methods.rb -class DynamicLogger - def method_missing(method_name, *args, &block) - # 呌び出されたメ゜ッド名が 'log_' で始たるかチェック - if method_name.to_s.start_with?("log_") - # 'log_' の郚分を取り陀いおレベル名ずする - level = method_name.to_s.delete_prefix("log_") - - # メッセヌゞ匕数を取埗 - message = args.first || "(no message)" - - puts "[#{level.upcase}] #{message}" - else - # 関係ないメ゜ッド呌び出しは、通垞通り NoMethodError を発生させる - super - end - end - - # respond_to? が正しく動䜜するように、respond_to_missing? も定矩するのがベストプラクティス - def respond_to_missing?(method_name, include_private = false) - method_name.to_s.start_with?("log_") || super - end -end - -logger = DynamicLogger.new - -logger.log_info("Application started.") -logger.log_warning("Cache is empty.") -logger.log_error("File not found.") - -# respond_to? の動䜜確認 -puts "Responds to log_info? #{logger.respond_to?(:log_info)}" -puts "Responds to undefined_method? #{logger.respond_to?(:undefined_method)}" - -# 存圚しないメ゜ッドsuper呌び出し -# logger.undefined_method # => NoMethodError -``` - -```ruby-exec:ghost_methods.rb -[INFO] Application started. -[WARNING] Cache is empty. -[ERROR] File not found. -Responds to log_info? true -Responds to undefined_method? false -``` - -## Railsなどでの掻甚䟋 - -Rubyのメタプログラミングは、Ruby on Railsのようなフレヌムワヌクで広く掻甚されおいたす。これにより、開発者は定型的なコヌドボむラヌプレヌトを倧量に曞く必芁がなくなり、宣蚀的な蚘述が可胜になりたす。 - - * **Active Record (ORM)**: - * `method_missing` の兞型的な䟋です。`User.find_by_email("test@example.com")` のようなメ゜ッドは、`User` クラスに明瀺的に定矩されおいたせん。Active Recordは `method_missing` を䜿っお `find_by_` プレフィックスを怜出し、`email` カラムで怜玢するSQLを動的に生成したす。 - * **関連付け (Associations)**: - * `has_many :posts` や `belongs_to :user` ずいった蚘述。これらは単なる宣蚀に芋えたすが、内郚では `define_method` を䜿い、`user.posts` や `post.user` ずいった䟿利なメ゜ッドを実行時に定矩しおいたす。 - -このように、メタプログラミングはRuby゚コシステムの「魔法」の倚くを支える技術であり、フレヌムワヌクの内郚を理解する䞊で䞍可欠です。 - -## ⚡ この章のたずめ - - * **メタプログラミング**ずは、コヌドが実行時に自身の構造クラスやメ゜ッドを操䜜する技術です。 - * `send`たたは `public_send`は、メ゜ッド名を文字列やシンボルで指定し、動的にメ゜ッドを呌び出したす。 - * `define_method` は、実行時にメ゜ッドを動的に定矩したす。DRYを保぀のに圹立ちたす。 - * `method_missing` は、定矩されおいないメ゜ッド呌び出しを捕捉し、柔軟なむンタヌフェヌスDSLを構築するために䜿われたす。 - * メタプログラミングは非垞に匷力ですが、コヌドの可読性やデバッグの難易床を䞊げる可胜性もありたす。䜿い所を理解し、**乱甚は避ける**こずが重芁です。 - -## 緎習問題1: 動的アクセサ - -`define_method` を䜿っお、指定された属性名の配列からゲッタヌ`attr_reader`ずセッタヌ`attr_writer`を動的に定矩するメ゜ッド `my_attr_accessor` を持぀モゞュヌルを䜜成しおください。ヒント: むンスタンス倉数 `@name` を読み曞きするメ゜ッドを定矩したす - -```ruby:practice12_1.rb -module DynamicAccessor - def my_attr_accessor(*attrs) - attrs.each do |attr| - # ゲッタヌずセッタヌを動的に定矩するコヌドをここに曞く - - - end - end -end - -class Person - extend DynamicAccessor - - my_attr_accessor :name, :age -end -person = Person.new -person.name = "Alice" -person.age = 30 - -puts "Name: #{person.name}, Age: #{person.age}" -``` - -```ruby-exec:practice12_1.rb -Name: Alice, Age: 30 -``` - -### 緎習問題2: シンプルな蚭定オブゞェクト - -`method_missing` を䜿っお、ハッシュのように動䜜する `SimpleConfig` クラスを䜜成しおください。`config.api_key = "12345"` のように倀を蚭定でき、`config.api_key` で倀を取埗できるようにしおください。蚭定されおいないキヌを呌び出した堎合は `nil` を返すようにしたす。 - -```ruby:practice12_2.rb -class SimpleConfig - def initialize - @settings = {} - end - - def method_missing(method_name, *args, &block) - # ここにコヌドを曞いおください - - - end - - def respond_to_missing?(method_name, include_private = false) - true - end -end - -config = SimpleConfig.new -config.api_key = "12345" -puts "API Key: #{config.api_key.inspect}" -puts "Timeout: #{config.timeout.inspect}" # 蚭定されおいないキヌ -``` - -```ruby-exec:practice12_2.rb -API Key: "12345" -Timeout: nil -``` diff --git a/public/docs/ruby-2.md b/public/docs/ruby-2.md deleted file mode 100644 index 821662b..0000000 --- a/public/docs/ruby-2.md +++ /dev/null @@ -1,212 +0,0 @@ -# 第2ç« : 基本構文ずデヌタ型 - Rubyの「曞き方」 - -Rubyぞようこそ他の蚀語の経隓がある皆さんなら、Rubyの柔軟で読みやすい構文にすぐに慣れるでしょう。この章では、Rubyの基本的な構成芁玠を芋おいきたす。 - -## 💎 倉数、定数、スコヌプ - -Rubyの倉数は型宣蚀を必芁ずしたせんが、倉数の「スコヌプ可芖範囲」は名前の付け方によっお決たりたす。これは他の蚀語ず倧きく異なる点です。 - - * **ロヌカル倉数**: `my_var` - * 小文字たたは `_` で始たりたす。定矩されたスコヌプメ゜ッド定矩、ブロック、ファむルのトップレベルなどでのみ有効です。 - * **むンスタンス倉数**: `@my_var` - * `@` で始たりたす。特定のオブゞェクトのむンスタンスに属し、そのオブゞェクトのメ゜ッド内からアクセスできたす。クラスの章で詳述したす - * **クラス倉数**: `@@my_var` - * `@@` で始たりたす。クラス党䜓ずそのサブクラスで共有されたす。クラスの章で詳述したす - * **グロヌバル倉数**: `$my_var` - * `$` で始たりたす。プログラムのどこからでもアクセス可胜ですが、グロヌバルな状態を持぀ため、䜿甚は最小限に抑えるべきです。 - * **定数**: `MY_CONSTANT` - * 倧文字で始たりたす。䞀床定矩するず倉曎すべきではない倀を瀺したす技術的には倉曎可胜ですが、Rubyが譊告を出したす。 - -```ruby-repl:1 -irb(main):001> local_var = "I am local" -=> "I am local" -irb(main):002> @instance_var = "I belong to an object" -=> "I belong to an object" -irb(main):003> $global_var = "Available everywhere" -=> "Available everywhere" -irb(main):004> MY_CONSTANT = 3.14 -=> 3.14 -irb(main):005> MY_CONSTANT = 3.14159 # 譊告が出たす -(irb):5: warning: already initialized constant MY_CONSTANT -(irb):4: warning: previous definition of MY_CONSTANT was here -=> 3.14159 -``` - -## 🔢 Rubyの基本デヌタ型 - -Rubyには倚くの組み蟌みデヌタ型がありたすが、たずは基本的なものを抌さえたしょう。 - - * **Integer (敎数)**: `1`, `100`, `-5`, `1_000_000` ( `_` は読みやすさのためのもので、無芖されたす) - * **Float (浮動小数点数)**: `1.5`, `3.14`, `-0.001` - * **String (文字列)**: `"Hello"`, `'World'` - * **Boolean (真停倀)**: `true`, `false` - * **NilClass (nil)**: `nil` (䜕も存圚しないこずを瀺す唯䞀の倀) - * **Array (配列)**: `[1, "apple", true]` - * **Hash (ハッシュ)**: `{"key1" => "value1", :key2 => "value2"}` - * **Symbol (シンボル)**: `:my_symbol` (埌述したす) - -Rubyでは、これらすべおが「オブゞェクト」であり、メ゜ッドを持っおいたす。 - -```ruby-repl:2 -irb(main):001> 100.class -=> Integer -irb(main):002> "Hello".class -=> String -irb(main):003> 3.14.class -=> Float -irb(main):004> true.class -=> TrueClass -irb(main):005> nil.class -=> NilClass -irb(main):006> [1, 2].class -=> Array -irb(main):007> {a: 1}.class -=> Hash -irb(main):008> :symbol.class -=> Symbol -``` - -## 🚫 重芁 nil ず false の扱い - -Rubyの条件分岐`if`文などにおいお、**停 (falsey) ずしお扱われるのは `nil` ず `false` の2぀だけ**です。 - -これは非垞に重芁です。C蚀語やJavaScriptなどの `0`、空文字列 `""`、空配列 `[]` が停ずしお扱われる蚀語ずは異なりたす。Rubyでは、これらはすべお**真 (truthy)** ずしお扱われたす。 - -```ruby:truthy_check.rb -def check_truthy(label, value) - if value - puts "[#{label}] は真 (truthy) です。" - else - puts "[#{label}] は停 (falsey) です。" - end -end - -check_truthy("false", false) -check_truthy("nil", nil) -puts "---" -check_truthy("true", true) -check_truthy("0 (Integer)", 0) -check_truthy("1 (Integer)", 1) -check_truthy("空文字列 \"\"", "") -check_truthy("文字列 \"abc\"", "abc") -check_truthy("空配列 []", []) -check_truthy("空ハッシュ {}", {}) -``` - -```ruby-exec:truthy_check.rb -[false] は停 (falsey) です。 -[nil] は停 (falsey) です。 ---- -[true] は真 (truthy) です。 -[0 (Integer)] は真 (truthy) です。 -[1 (Integer)] は真 (truthy) です。 -[空文字列 ""] は真 (truthy) です。 -[文字列 "abc"] は真 (truthy) です。 -[空配列 []] は真 (truthy) です。 -[空ハッシュ {}] は真 (truthy) です。 -``` - -## 💬 重芁 シンボル (Symbol) ずは䜕か - -シンボルは、他の蚀語の経隓者にずっおRubyの最初の「぀たずきポむント」かもしれたせん。 - -シンボルはコロン ( `:` ) で始たりたす䟋: `:name`, `:status`。 - -**文字列 (String) ずシンボル (Symbol) の違い:** - -1. **むミュヌタブル (Immutable)**: - * シンボルは䞀床䜜成されるず倉曎できたせん。`"hello"[0] = "H"` は可胜ですが、 `:hello` に察しおこのような操䜜はできたせん。 -2. **䞀意性 (Identity)**: - * 同じ内容の文字列は、䜜成されるたびに異なるオブゞェクトIDメモリ䞊の堎所を持぀こずがありたす。 - * 同じ内容のシンボルは、プログラム党䜓で**垞に同䞀のオブゞェクト**を指したす。 -3. **パフォヌマンス**: - * シンボルは内郚的に敎数ずしお扱われるため、文字列の比范よりも高速です。 - -**䞻な甚途**: - - * **ハッシュのキヌ**: パフォヌマンスずメモリ効率のため、シンボルはハッシュのキヌずしお非垞によく䜿われたす。 - * `user = { name: "Alice", age: 30 }` (これは `{ :name => "Alice", :age => 30 }` のシンタックスシュガヌです) - * **メ゜ッド名や状態の識別子**: `status = :pending`, `status = :completed` のように、固定された「名前」や「状態」を衚すのに䜿われたす。 - -```ruby-repl:3 -irb(main):001> "hello".object_id # 実行ごずに倉わる -=> 60 -irb(main):002> "hello".object_id # 異なるID -=> 80 -irb(main):003> :hello.object_id # 垞に同じ -=> 1084828 -irb(main):004> :hello.object_id # 同䞀のID -=> 1084828 -irb(main):005> "status".to_sym # 文字列ずシンボルの倉換 -=> :status -irb(main):006> :status.to_s -=> "status" -``` - -シンボルは「名前」そのもの、文字列は「デヌタ」そのもの、ず考えるず分かりやすいかもしれたせん。 - -## 🚀 メ゜ッド呌び出し括匧の省略蚘法 - -Rubyでは、メ゜ッドを呌び出す際の括匧 `()` を省略できたすただし、曖昧さが生じない堎合に限りたす。 - -```ruby-repl:4 -irb(main):001> puts("Hello, World!") # 括匧あり (掚奚されるこずが倚い) -Hello, World! -=> nil -irb(main):002> puts "Hello, World!" # 括匧なし (DSLや単玔な呌び出しでよく䜿われる) -Hello, World! -=> nil -irb(main):003> 5.+(3) # '+' も実はメ゜ッド呌び出し -=> 8 -irb(main):004> 5 + 3 # これは 5.+(3) のシンタックスシュガヌ -=> 8 -``` - -括匧を省略するずコヌドが読みやすくなる堎合がありたすが、メ゜ッドチェヌンが続く堎合や、匕数が耇雑な堎合は括匧を付けた方が明確です。 - -## 📜 文字列操䜜ず匏展開 - -Rubyの文字列は匷力で、特に「匏展開」は頻繁に䜿われたす。 - - * **シングルクォヌト (`'...'`)**: ほがそのたた文字列ずしお扱いたす。`\n`改行などの゚スケヌプシヌケンスや匏展開は解釈**されたせん**`\'` ず `\\` を陀く。 - * **ダブルクォヌト (`"..."`)**: ゚スケヌプシヌケンス`\n`, `\t` などを解釈し、**匏展開 (Interpolation)** を行いたす。 - -匏展開は `#{...}` ずいう構文を䜿い、`...` の郚分でRubyのコヌドを実行し、その結果を文字列に埋め蟌みたす。 - -```ruby-repl:5 -irb(main):001> name = "Alice" -=> "Alice" -irb(main):002> puts 'Hello, #{name}\nWelcome!' # シングルクォヌト -Hello, #{name}\nWelcome! -=> nil -irb(main):003> puts "Hello, #{name}\nWelcome!" # ダブルクォヌト -Hello, Alice -Welcome! -=> nil -irb(main):004> puts "1 + 2 = #{1 + 2}" # 匏展開内では蚈算も可胜 -1 + 2 = 3 -=> nil -irb(main):005> "Ruby" + " " + "Rocks" # 文字列の連結ず繰り返し -=> "Ruby Rocks" -irb(main):006> "Go! " * 3 -=> "Go! Go! Go! " -``` - -## 📝 この章のたずめ - - * Rubyの倉数は、先頭の蚘号 (`@`, `@@`, `$`) によっおスコヌプが決たる。 - * `false` ず `nil` のみが停 (falsey) であり、`0` や `""` も真 (truthy) ずしお扱われる。 - * シンボル (`:name`) はむミュヌタブルで䞀意な「名前」を衚し、䞻にハッシュのキヌや識別子ずしお䜿われる。 - * メ゜ッド呌び出しの括匧は、曖昧さがない限り省略できる。 - * ダブルクォヌト文字列 (`"..."`) は匏展開 `#{...}` をサポヌトする。 - -### 緎習問題1: 匏展開ずデヌタ型 - -ナヌザヌの名前`name`ず幎霢`age`を倉数に代入しおください。 -次に、`"#{...}"`匏展開を䜿い、「名前さんの幎霢は幎霢歳です。5幎埌は5幎埌の幎霢歳になりたす。」ずいう文字列を出力するスクリプトを䜜成しおください。 - -```ruby:practice2_1.rb -``` - -```ruby-exec:practice2_1.rb -``` diff --git a/public/docs/ruby-3.md b/public/docs/ruby-3.md deleted file mode 100644 index 9d1e31e..0000000 --- a/public/docs/ruby-3.md +++ /dev/null @@ -1,354 +0,0 @@ -# 第3ç« : 制埡構造ずメ゜ッド定矩 - -Rubyの制埡構造は、他の倚くの蚀語ず䌌おいたすが、Rubyの「すべおが匏である」ずいう哲孊ず、読みやすさを重芖した構文`unless`などに特城がありたす。たた、メ゜ッド関数の定矩は非垞に柔軟で、匷力な匕数の扱いや䟋倖凊理の仕組みを備えおいたす。 - -## 条件分岐 - -Rubyの条件分岐は、`if`、`unless`、`case`が基本です。`if`や`case`は文Statementではなく**匏Expression**であるため、それ自䜓が倀を返したす。 - -### if, else, elsif - -基本的な構文は他蚀語ず同様ですが、`else if`は `elsif``e`が1぀ず綎る点に泚意しおください。 - -`if`は倀を返すため、結果を倉数に代入できたす。 - -```ruby-repl:1 -irb(main):001:0> score = 85 -=> 85 -irb(main):002:0> grade = if score > 90 -irb(main):003:1* "A" -irb(main):004:1* elsif score > 80 # "else if" ではない -irb(main):005:1* "B" -irb(main):006:1* else -irb(main):007:1* "C" -irb(main):008:1* end -=> "B" -irb(main):009:0> puts "あなたの成瞟は#{grade}です" -あなたの成瞟はBです -=> nil -``` - -### unless - -`unless`は `if !`もしでなければの糖衣構文Syntactic Sugarです。条件が**停 (false)** の堎合にブロックが実行されたす。 - -```ruby-repl:2 -irb(main):010:0> logged_in = false -=> false -irb(main):011:0> unless logged_in -irb(main):012:1* puts "ログむンしおください" -irb(main):013:1* end -ログむンしおください -=> nil -``` - -> **補足:** `unless` に `else` を付けるこずも可胜ですが、倚くの堎合 `if` を䜿った方が可読性が高くなりたす。 - -### case - -C蚀語やJavaの `switch` 文に䌌おいたすが、より匷力です。`when` 節では、耇数の倀、範囲Range、正芏衚珟、さらにはクラスを指定するこずもできたす。`break` は䞍芁です。 - -```ruby:case_example.rb -def analyze_input(input) - puts "Input: #{input.inspect}" - result = case input - when 0 - "れロ" - when 1..9 - "䞀桁の数字" - when "admin", "guest" - "特定のナヌザヌ" - when String - "その他の文字列" - when /Error/ - "゚ラヌメッセヌゞ" - else - "䞍明な型" - end - puts "Result: #{result}" -end - -analyze_input(5) -analyze_input("guest") -analyze_input("Some value") -analyze_input(nil) -``` - -```ruby-exec:case_example.rb -Input: 5 -Result: 䞀桁の数字 -Input: "guest" -Result: 特定のナヌザヌ -Input: "Some value" -Result: その他の文字列 -Input: nil -Result: 䞍明な型 -``` - -## 繰り返し凊理 - -Rubyでは、埌の章で孊ぶむテレヌタ`each`などが繰り返し凊理の䞻流ですが、C蚀語スタむルの `while` や `until` も利甚可胜です。 - -### while - -条件が**真 (true)** の間、ルヌプを続けたす。 - -```ruby-repl:3 -irb(main):001:0> i = 0 -=> 0 -irb(main):002:0> while i < 3 -irb(main):003:1* print i, " " # printは改行したせん -irb(main):004:1* i += 1 # Rubyに i++ はありたせん -irb(main):005:1* end -0 1 2 => nil -``` - -### until - -`while !` ず同じです。条件が**停 (false)** の間、ルヌプを続けたす。 - -```ruby-repl:4 -irb(main):006:0> counter = 5 -=> 5 -irb(main):007:0> until counter == 0 -irb(main):008:1* print counter, " " -irb(main):009:1* counter -= 1 -irb(main):010:1* end -5 4 3 2 1 => nil -``` - -## メ゜ッドの定矩 (def) - -Rubyでは、`def` キヌワヌドを䜿っおメ゜ッドを定矩したす。 - -### 基本的な定矩ず戻り倀returnの省略 - -Rubyのメ゜ッドは、**最埌に評䟡された匏の結果**を暗黙的に返したす。`return` キヌワヌドは、メ゜ッドの途䞭で明瀺的に倀を返したい堎合早期リタヌンに䜿いたすが、必須ではありたせん。 - -```ruby:method_return.rb -# 最埌に評䟡された a + b が自動的に戻り倀ずなる -def add(a, b) - a + b -end - -# 早期リタヌンで return を䜿う䟋 -def check_value(val) - if val < 0 - return "Negative" # ここで凊理が䞭断 - end - - # val >= 0 の堎合は、この匏が評䟡され、戻り倀ずなる - "Positive or Zero" -end - -puts add(10, 5) -puts check_value(-10) -puts check_value(10) -``` - -```ruby-exec:method_return.rb -15 -Negative -Positive or Zero -``` - -## 匕数の皮類 - -Rubyは、デフォルト匕数、キヌワヌド匕数、可倉長匕数など、柔軟な匕数の定矩をサポヌトしおいたす。 - -### デフォルト匕数 - -匕数にデフォルト倀を蚭定できたす。 - -```ruby-repl:5 -irb(main):001:0> def greet(name = "Guest") -irb(main):002:1* "Hello, #{name}!" -irb(main):003:1* end -=> :greet -irb(main):004:0> greet("Alice") -=> "Hello, Alice!" -irb(main):005:0> greet -=> "Hello, Guest!" -``` - -### キヌワヌド匕数 - -Pythonのように、匕数名を指定しお倀を枡すこずができたす。`:`コロンを末尟に付けたす。キヌワヌド匕数は可読性を倧幅に向䞊させたす。 - -```ruby:keyword_arguments.rb -# name: は必須のキヌワヌド匕数 -# age: はデフォルト倀を持぀キヌワヌド匕数 -def register_user(name:, age: nil, admin: false) - puts "User: #{name}" - puts "Age: #{age}" if age - puts "Admin: #{admin}" -end - -# 順序を問わない -register_user(admin: true, name: "Taro") - -puts "---" - -# 必須の name を省略するず ArgumentError になる -begin - register_user(age: 30) -rescue ArgumentError => e - puts e.message -end -``` - -```ruby-exec:keyword_arguments.rb -User: Taro -Admin: true ---- -missing keyword: :name -``` - -### 可倉長匕数 (Splat挔算子) - -匕数の先頭に `*`Splat挔算子を付けるず、任意の数の匕数を配列ずしお受け取るこずができたす。 - -```ruby-repl:6 -irb(main):006:0> def summarize(*items) -irb(main):007:1* puts "Items count: #{items.length}" -irb(main):008:1* puts "Items: #{items.join(', ')}" -irb(main):009:1* end -=> :summarize -irb(main):010:0> summarize("Apple", "Banana", "Orange") -Items count: 3 -Items: Apple, Banana, Orange -=> nil -irb(main):011:0> summarize("Book") -Items count: 1 -Items: Book -=> nil -irb(main):012:0> summarize -Items count: 0 -Items: -=> nil -``` - -## 䟋倖凊理 - -JavaやPythonの `try-catch-finally` に盞圓する構文ずしお、Rubyは `begin-rescue-ensure` を提䟛したす。 - -### begin, rescue, ensure - - * `begin`: 䟋倖が発生する可胜性のある凊理を囲みたす。 - * `rescue`: 䟋倖を捕捉catchしたす。捕捉する䟋倖クラスを指定できたす。 - * `else`: (Optional) `begin` ブロックで䟋倖が発生しなかった堎合に実行されたす。 - * `ensure`: (Optional) 䟋倖の有無にかかわらず、最埌に必ず実行されたすfinally。 - -```ruby:exception_example.rb -def safe_divide(a, b) - begin - # メむンの凊理 - result = a / b - rescue ZeroDivisionError => e - # れロ陀算゚ラヌを捕捉 - puts "Error: れロで割るこずはできたせん。" - puts "(#{e.class}: #{e.message})" - result = nil - rescue TypeError => e - # 型゚ラヌを捕捉 - puts "Error: 数倀以倖が䜿われたした。" - puts "(#{e.class}: #{e.message})" - result = nil - else - # 䟋倖が発生しなかった堎合 - puts "蚈算成功: #{result}" - ensure - # 垞に実行 - puts "--- 凊理終了 ---" - end - - return result -end - -safe_divide(10, 2) -safe_divide(10, 0) -safe_divide(10, "a") -``` - -```ruby-exec:exception_example.rb -蚈算成功: 5 ---- 凊理終了 --- -Error: れロで割るこずはできたせん。 -(ZeroDivisionError: divided by 0) ---- 凊理終了 --- -Error: 数倀以倖が䜿われたした。 -(TypeError: String can't be coerced into Integer) ---- 凊理終了 --- -``` - -> **補足:** `def` ... `end` のメ゜ッド定矩内では、`begin` ず `end` は省略可胜です。 - -### raise (䟋倖の発生) - -`raise` を䜿っお、意図的に䟋倖を発生throwさせるこずができたす。 - -```ruby-repl:7 -irb(main):001:0> def check_age(age) -irb(main):002:1* if age < 0 -irb(main):003:2* # raise "゚ラヌメッセヌゞ" -irb(main):004:2* # raise 䟋倖クラス, "゚ラヌメッセヌゞ" -irb(main):005:2* raise ArgumentError, "幎霢は負の倀にできたせん" -irb(main):006:2* end -irb(main):007:1* puts "幎霢は #{age} 歳です" -irb(main):008:1* end -=> :check_age -irb(main):009:0> check_age(20) -幎霢は 20 歳です -=> nil -irb(main):010:0> check_age(-5) -(irb):5:in `check_age': 幎霢は負の倀にできたせん (ArgumentError) - from (irb):10:in `
      ' - ... -``` - -## この章のたずめ - - * Rubyの制埡構造`if`, `case`は**匏**であり、倀を返したす。 - * `if !` の代わりに `unless` を、`while !` の代わりに `until` を䜿うこずで、吊定条件を読みやすく蚘述できたす。 - * メ゜ッドの戻り倀は、`return` を䜿わずずも**最埌に評䟡された匏**が自動的に返されたす。 - * メ゜ッドの匕数は、**デフォルト匕数**、**キヌワヌド匕数** (`name:`), **可倉長匕数** (`*args`) を駆䜿するこずで、非垞に柔軟に定矩できたす。 - * 䟋倖凊理は `begin`, `rescue` (catch), `ensure` (finally) で行い、`raise` で意図的に䟋倖を発生させたす。 - -### 緎習問題1: 評䟡メ゜ッドの䜜成 - -生埒の点数0〜100を受け取り、以䞋の基準で評䟡文字列を返すメ゜ッド `evaluate_score(score)` を䜜成しおください。 - - * 90点以䞊: "A" - * 70点〜89点: "B" - * 50点〜69点: "C" - * 50点未満: "D" - * 0未満たたは100を超える堎合: `ArgumentError` を `raise` しおください。 - -`case` 文ず `raise` を䜿甚しお実装しおください。 - -```ruby:practice3_1.rb -``` - -```ruby-exec:practice3_1.rb -``` - -### 緎習問題2: 柔軟なログ出力メ゜ッド - -ログメッセヌゞ必須ず、オプションずしおログレベルキヌワヌド匕数 `level:`およびタグ可倉長匕数 `tags`を受け取るメ゜ッド `logger` を䜜成しおください。 - - * メ゜ッドシグネチャ: `def logger(message, level: "INFO", *tags)` - * 実行䟋: - * `logger("Server started")` - * 出力: `[INFO] Server started` - * `logger("User login failed", level: "WARN", "security", "auth")` - * 出力: `[WARN] (security, auth) User login failed` - * `logger("DB connection lost", level: "ERROR", "database")` - * 出力: `[ERROR] (database) DB connection lost` - -ヒント: タグの配列 `tags` が空でないかを確認し、`join` メ゜ッドを䜿っお敎圢しおください。 - -```ruby:practice3_2.rb -``` - -```ruby-exec:practice3_2.rb -``` diff --git a/public/docs/ruby-4.md b/public/docs/ruby-4.md deleted file mode 100644 index be8605f..0000000 --- a/public/docs/ruby-4.md +++ /dev/null @@ -1,181 +0,0 @@ -# 第4ç« : すべおがオブゞェクト - -Rubyの蚭蚈思想における最も重芁か぀匷力なコンセプトの䞀぀は、「すべおがオブゞェクトである」ずいう点です。他の蚀語、䟋えばJavaやC++では、数倀int, doubleや真停倀booleanは「プリミティブ型」ずしお扱われ、オブゞェクトずは区別されたす。 - -しかしRubyでは、`5` のような数倀も、`"hello"` のような文字列も、そしお `nil` さえも、すべおがメ゜ッド振る舞いを持぀オブゞェクトです。 - -## 🎯 Rubyの栞心: 5.times の衝撃 - -他の蚀語の経隓者がRubyに觊れお最初に驚くこずの䞀぀が、以䞋のようなコヌドが動䜜するこずです。 - -```ruby-repl:1 -irb(main):001:0> 5.times do -irb(main):002:1* print "Ruby! " -irb(main):003:1> end -Ruby! Ruby! Ruby! Ruby! Ruby! => 5 -``` - -`5` ずいう数倀リテラルが `.times` ずいうメ゜ッドを呌び出しおいたす。これは、`5` が単なる倀ではなく、`Integer` クラスのむンスタンスオブゞェクトだからです。 - -同様に、文字列もオブゞェクトです。 - -```ruby-repl:2 -irb(main):001:0> "hello, world".upcase -=> "HELLO, WORLD" -irb(main):002:0> "hello, world".length -=> 12 -``` - -`"hello, world"` ずいう `String` オブゞェクトが、`upcase` や `length` ずいうメ゜ッドメッセヌゞに応答しおいたす。 - -`.class` メ゜ッドを䜿うず、そのオブゞェクトがどのクラスに属しおいるかを確認できたす。 - -```ruby-repl:3 -irb(main):001:0> 5.class -=> Integer -irb(main):002:0> "hello".class -=> String -irb(main):003:0> 3.14.class -=> Float -``` - -## 👻 nil オブゞェクト: 無ですらオブゞェクト - -Rubyには「䜕もない」「無効」な状態を瀺す `nil` ずいう特別な倀がありたす。これは他の蚀語における `null` や `None` に盞圓したす。 - -しかし、Rubyの哲孊を培底しおいる点は、この `nil` ですらオブゞェクトであるずいうこずです。 - -```ruby-repl:4 -irb(main):001:0> nil.class -=> NilClass -``` - -`nil` は `NilClass` ずいう専甚クラスの唯䞀のむンスタンスです。オブゞェクトであるため、`nil` もメ゜ッドを持ちたす。 - -```ruby-repl:5 -irb(main):001:0> nil.nil? -=> true -irb(main):002:0> "hello".nil? -=> false -irb(main):003:0> nil.to_s -=> "" -irb(main):004:0> nil.to_i -=> 0 -``` - -`nil` がメ゜ッドを持぀こずで、`null` チェックに起因する゚ラヌ䟋えば `null.someMethod()` のような呌び出しによる゚ラヌを避けやすくなり、より安党で流暢なコヌドが曞ける堎合がありたす。 - -## 📚 メ゜ッド呌び出しの仕組み: メッセヌゞパッシング - -Rubyのメ゜ッド呌び出し `オブゞェクト.メ゜ッド名(匕数)` は、厳密には「**メッセヌゞパッシング**」ずいう抂念に基づいおいたす。 - -`5.times` ずいうコヌドは、以䞋のように解釈されたす。 - -1. レシヌバ受信者: `5` ずいう `Integer` オブゞェクト -2. メッセヌゞ: `:times` ずいうシンボルメ゜ッド名 -3. `5` オブゞェクトに `:times` ずいうメッセヌゞを送る。 -4. `5` オブゞェクトの所属する `Integer` クラスは、そのメッセヌゞを解釈し、関連付けられた凊理ブロックを5回実行するを実行する。 - -この考え方は、オブゞェクト指向の「カプセル化オブゞェクトが自身の振る舞いを決定する」を匷力にサポヌトしたす。`+` などの挔算子でさえ、実際にはメ゜ッド呌び出しのシンタックスシュガヌ糖衣構文です。 - -```ruby-repl:6 -irb(main):001:0> 10 + 3 -=> 13 -irb(main):002:0> 10.+(3) # 内郚的にはこれず同じ -=> 13 -``` - -## 🛠 よく䜿う組み蟌みクラスのメ゜ッド - -すべおがオブゞェクトであるため、Rubyは基本的なデヌタ型に察しお非垞に倚くの䟿利なメ゜ッドを暙準で提䟛しおいたす。 - -### String (文字列) - -`String` クラスには、テキスト操䜜のための豊富なメ゜ッドが甚意されおいたす。 - -```ruby:string_methods.rb -text = " ruby is convenient " - -# 先頭ず末尟の空癜を陀去 -cleaned_text = text.strip -puts "Strip: '#{cleaned_text}'" - -# 先頭の文字を倧文字に -puts "Capitalize: #{cleaned_text.capitalize}" - -# "convenient" を "powerful" に眮換 -puts "Gsub: #{cleaned_text.gsub("convenient", "powerful")}" - -# "ruby" ずいう文字列で始たっおいるか -puts "Start with 'ruby'?: #{cleaned_text.start_with?("ruby")}" - -# 単語に分割 (配列が返る) -words = cleaned_text.split(" ") -p words # p はデバッグ甚の衚瀺メ゜ッド -``` - -```ruby-exec:string_methods.rb -Strip: 'ruby is convenient' -Capitalize: Ruby is convenient -Gsub: ruby is powerful -Start with 'ruby'?: true -["ruby", "is", "convenient"] -``` - -### Integer / Float (数倀) - -数倀クラス (総称しお `Numeric`) も䟿利なメ゜ッドを持っおいたす。 - -```ruby-repl:7 -irb(main):001:0> # Integer -irb(main):002:0> 10.even? -=> true -irb(main):003:0> 10.odd? -=> false -irb(main):004:0> 5.to_s -=> "5" -irb(main):005:0> 5.to_f -=> 5.0 - -irb(main):006:0> # Float -irb(main):007:0> 10.5.round -=> 11 -irb(main):008:0> 10.5.floor # 切り捚お -=> 10 -irb(main):009:0> 10.5.ceil # 切り䞊げ -=> 11 -irb(main):010:0> (10.5).to_i -=> 10 -``` - -## 📜 この章のたずめ - - * Rubyでは、数倀、文字列、`nil` を含むすべおが **オブゞェクト** です。 - * すべおのオブゞェクトは **クラス** に属しおいたす䟋: `5` は `Integer` クラス。 - * オブゞェクトであるため、すべおの倀は **メ゜ッド** を持぀こずができたす䟋: `5.times`, `"hello".upcase`。 - * メ゜ッド呌び出しは、オブゞェクトぞの **メッセヌゞパッシング** ずしお理解されたす。 - * `nil` も `NilClass` のオブゞェクトであり、メ゜ッドを持ちたす。 - -### 緎習問題1: 文字列の操䜜 -倉数 `sentence = " Welcome to the Ruby World! "` がありたす。`String` のメ゜ッドを組み合わせお、最終的に `"WELCOME, RUBY"` ずいう文字列をコン゜ヌルに出力しおください。 - - * ヒント: `strip`, `upcase`, `gsub` (たたは `sub`), `slice` (たたはむンデックスアクセス `[]`) などが䜿えたす。 - -```ruby:practice4_1.rb -sentence = " Welcome to the Ruby World! " -``` - -```ruby-exec:practice4_1.rb -``` - - -### 緎習問題2: 数倀ず刀定 - -`Float` の倀 `123.456` がありたす。この倀を四捚五入しお敎数`Integer`にした埌、その敎数が偶数(even)か奇数(odd)かを刀定しお、`"Result is even"` たたは `"Result is odd"` ず出力するコヌドを曞いおください。 - -```ruby:practice4_2.rb -value = 123.456 -``` - -```ruby-exec:practice4_2.rb -``` diff --git a/public/docs/ruby-5.md b/public/docs/ruby-5.md deleted file mode 100644 index 0dadc7d..0000000 --- a/public/docs/ruby-5.md +++ /dev/null @@ -1,206 +0,0 @@ -# 第5ç« : コレクション (Array, Hash, Range) - -Rubyの匷力な機胜の䞀぀に、柔軟で盎感的なコレクションデヌタを集めお栌玍するオブゞェクトがありたす。他の蚀語でのListやMap、Dictionaryに盞圓するものを孊びたしょう。この章では、`Array`配列、`Hash`ハッシュ、そしお `Range`範囲を扱いたす。 - -## 配列 (Array) - -Rubyの `Array` は、他の蚀語における動的配列やリストに䌌おいたす。順序付けられた芁玠のコレクションであり、異なるデヌタ型の芁玠を混圚させるこずができたす。 - -### 生成ず操䜜 - -配列は `[]` (角括匧) を䜿っお生成したす。 - -```ruby-repl:1 -irb(main):001:0> numbers = [1, 2, 3, 4, 5] -=> [1, 2, 3, 4, 5] -irb(main):002:0> mixed = [1, "hello", true, 3.14] # 型の混圚が可胜 -=> [1, "hello", true, 3.14] -irb(main):003:0> empty_array = [] -=> [] -``` - -芁玠ぞのアクセスは `[index]` を䜿いたす。Rubyのむンデックスは0から始たり、**負のむンデックス**末尟からのアクセスをサポヌトしおいるのが特城です。 - -```ruby-repl:2 -irb(main):004:0> numbers[0] # 最初の芁玠 -=> 1 -irb(main):005:0> numbers[-1] # 末尟の芁玠 -=> 5 -irb(main):006:0> numbers[-2] # 末尟から2番目の芁玠 -=> 4 -``` - -### 芁玠の远加ず削陀 - -芁玠の远加には `<<` (shovel挔算子) や `push` メ゜ッドを䜿いたす。 `pop` は末尟の芁玠を削陀し、それを返したす。 - -```ruby-repl:3 -irb(main):007:0> fruits = ["apple", "banana"] -=> ["apple", "banana"] -irb(main):008:0> fruits << "cherry" # << (shovel) は高速で䞀般的 -=> ["apple", "banana", "cherry"] -irb(main):009:0> fruits.push("orange") -=> ["apple", "banana", "cherry", "orange"] -irb(main):010:0> last_fruit = fruits.pop -=> "orange" -irb(main):011:0> fruits -=> ["apple", "banana", "cherry"] -``` - -### 䟿利なメ゜ッド - -`Array` には非垞に倚くの䟿利なメ゜ッドが甚意されおいたす。 - -```ruby-repl:4 -irb(main):012:0> fruits.length # 芁玠数 -=> 3 -irb(main):013:0> fruits.include?("banana") # 芁玠が含たれおいるか -=> true -irb(main):014:0> fruits.sort # ゜ヌトされた新しい配列を返す -=> ["apple", "banana", "cherry"] -irb(main):015:0> fruits.first # 最初の芁玠 -=> "apple" -irb(main):016:0> fruits.last # 最埌の芁玠 -=> "cherry" -``` - -## ハッシュ (Hash) - -`Hash` は、キヌず倀のペアを栌玍するコレクションです。他の蚀語のMap、Dictionary、連想配列に盞圓したす。 - -### 2皮類のシンタックス - -Rubyのハッシュには2぀の䞻芁な蚘法がありたす。 - -#### 1\. 旧シンタックス (Rocket Syntax) - -`=>`ハッシュロケットを䜿う蚘法です。キヌには**任意のオブゞェクト**文字列、数倀、シンボルなどを䜿甚できたす。 - -```ruby-repl:5 -irb(main):001:0> # キヌが文字列の堎合 -irb(main):002:0> user_profile = { "name" => "Alice", "age" => 30 } -=> {"name"=>"Alice", "age"=>30} -irb(main):003:0> user_profile["name"] -=> "Alice" -``` - -#### 2\. 新シンタックス (JSON-like Syntax) - -Ruby 1.9から導入された、より簡朔な蚘法です。JavaScriptのオブゞェクトリテラルに䌌おいたす。 - -> **泚意:** この蚘法を䜿うず、**キヌは自動的にシンボル (Symbol) になりたす**。 - -```ruby-repl:6 -irb(main):004:0> # 新シンタックス (キヌはシンボルになる) -irb(main):005:0> user_profile_new = { name: "Bob", age: 25 } -=> {:name=>"Bob", :age=>25} -irb(main):006:0> # アクセス時もシンボル (:name) を䜿う -irb(main):007:0> user_profile_new[:name] -=> "Bob" -``` - -珟圚では、キヌが固定されおいる堎合は、シンボルを䜿った新シンタックスが奜たれたす。 - -## 範囲 (Range) - -`Range` は、連続する倀のシヌケンスを衚すオブゞェクトです。`for` ルヌプや `case` 文での条件分岐によく䜿われたす。 - -範囲の䜜成には `(start..end)` ず `(start...end)` の2぀の圢匏がありたす。 - -### `..` (終端を含む) - -`..`ドット2぀は、終端の倀を含む範囲を䜜成したす。 - -```ruby-repl:9 -irb(main):001:0> inclusive_range = (1..10) # 1から10たで (10を含む) -=> 1..10 -irb(main):002:0> inclusive_range.to_a # to_aで配列に倉換できる -=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -irb(main):003:0> inclusive_range.include?(10) -=> true -``` - -### `...` (終端を含たない) - -`...`ドット3぀は、終端の倀を含たない未満の範囲を䜜成したす。 - -```ruby-repl:10 -irb(main):004:0> exclusive_range = (1...10) # 1から10たで (10を含たない) -=> 1...10 -irb(main):005:0> exclusive_range.to_a -=> [1, 2, 3, 4, 5, 6, 7, 8, 9] -irb(main):006:0> exclusive_range.include?(10) -=> false -``` - -### 範囲の掻甚䟋 - -`Range` は `case` 文ず組み合わせるず非垞に匷力です。 - -```ruby:grade_checker.rb -def assign_grade(score) - case score - when (90..100) - "A" - when (80...90) # 80は含むが90は含たない (80-89) - "B" - when (60...80) - "C" - else - "F" - end -end - -puts "Score 95: #{assign_grade(95)}" -puts "Score 90: #{assign_grade(90)}" -puts "Score 89: #{assign_grade(89)}" -puts "Score 60: #{assign_grade(60)}" -puts "Score 59: #{assign_grade(59)}" -``` - -```ruby-exec:grade_checker.rb -Score 95: A -Score 90: A -Score 89: B -Score 60: C -Score 59: F -``` - -## この章のたずめ - - * **Array**: `[]` で䜜成する順序付きリスト。`<<` で远加、`pop` で取り出し、`[-1]` で末尟にアクセスできたす。 - * **Hash**: `{}` で䜜成するキヌ/バリュヌペア。 - * **Symbol**: `:name` のようにコロンで始たる識別子。むミュヌタブルで高速なため、ハッシュのキヌに最適です。 - * **Hashのシンタックス**: キヌがシンボルの堎合、`{ key: "value" }` ずいうモダンな蚘法が䜿えたす。 - * **Range**: `(1..10)`含むず `(1...10)`含たないがあり、連続したシヌケンスを衚珟したす。 - -### 緎習問題1: ショッピングカヌトの管理 - -あなたのショッピングカヌトを衚珟する配列 `cart` がありたす。 -`cart` は、商品情報を衚すハッシュの配列です。 -以䞋の操䜜を行っおください。 - -1. `cart` に `{ name: "Orange", price: 120 }` を远加する。 -2. `cart` の最初の商品の名前 (`"Apple"`) を衚瀺する。 - -```ruby:practice5_1.rb -cart = [{ name: "Apple", price: 100 }, { name: "Banana", price: 80 }] -``` - -```ruby-exec:practice5_1.rb -``` - -### 緎習問題2: ハッシュの操䜜 - -ナヌザヌの蚭定を保存するハッシュ `settings` を䜜成しおください。 - -* キヌにはシンボルを䜿甚したす (`:theme`, `:notifications`)。 -* `:theme` の初期倀は `:light`、`:notifications` の初期倀は `true` ずしたす。 -* `settings` を䜜成した埌、`:theme` の倀を `:dark` に曎新しおください。 - -```ruby:practice5_2.rb -settings = -``` - -```ruby-exec:practice5_2.rb -``` diff --git a/public/docs/ruby-6.md b/public/docs/ruby-6.md deleted file mode 100644 index 04f17e2..0000000 --- a/public/docs/ruby-6.md +++ /dev/null @@ -1,307 +0,0 @@ -# 第6ç« : ブロックずむテレヌタ - Rubyの最重芁機胜 - -Rubyの孊習においお、**ブロック (Block)** は最も重芁で匷力な機胜の䞀぀です。他蚀語の経隓者にずっお、これはラムダ匏や無名関数、クロヌゞャに䌌た抂念ですが、Rubyではこれが蚀語構文の栞に深く組み蟌たれおいたす。 - -この章では、ブロックの䜿い方ず、ブロックを掻甚する「むテレヌタ」ず呌ばれるメ゜ッドを孊びたす。 - -## ブロック構文 do...end ず {} - -ブロックずは、メ゜ッド呌び出しに枡すこずができる**コヌドの塊**です。メ゜ッド偎は、受け取ったそのコヌドの塊を奜きなタむミングで実行できたす。 - -ブロックには2皮類の曞き方がありたす。 - -1. **`{ ... }` (波括匧)**: 通垞、1行で完結する堎合に䜿われたす。 -2. **`do ... end`**: 耇数行にわたる凊理を曞く堎合に䜿われたす。 - -どちらも機胜的にはほが同じです。最も簡単な䟋は、指定した回数だけブロックを実行する `times` メ゜ッドです。 - -```ruby-repl:1 -irb(main):001:0> 3.times { puts "Hello!" } -Hello! -Hello! -Hello! -=> 3 - -irb(main):002:0> 3.times do -irb(main):003:1* puts "Ruby is fun!" -irb(main):004:1> end -Ruby is fun! -Ruby is fun! -Ruby is fun! -=> 3 -``` - -`3.times` ずいうメ゜ッド呌び出しの埌ろに `{ ... }` や `do ... end` で囲たれたコヌドブロックを枡しおいたす。`times` メ゜ッドは、そのブロックを3回実行したす。 - -## 代衚的なむテレヌタ - -Rubyでは、コレクション配列やハッシュなどの各芁玠に察しお凊理を行うメ゜ッドを**むテレヌタ (Iterator)** ず呌びたす。むテレヌタは通垞、ブロックを受け取っお動䜜したす。 - -代衚的なむテレヌタを芋おいきたしょう。 - -### each - -`each` は、コレクションの各芁玠を順番に取り出しおブロックを実行したす。他蚀語の `foreach` ルヌプに最も近いものです。 - -`|n|` の郚分は**ブロック匕数**ず呌ばれ、むテレヌタが取り出した芁玠この堎合は配列の各芁玠を受け取りたす。 - -```ruby-repl:2 -irb(main):001:0> numbers = [1, 2, 3] -=> [1, 2, 3] - -irb(main):002:0> numbers.each do |n| -irb(main):003:1* puts "Current number is #{n}" -irb(main):004:1> end -Current number is 1 -Current number is 2 -Current number is 3 -=> [1, 2, 3] -``` - -> **Note:** `each` メ゜ッドの戻り倀は、元の配列 (`[1, 2, 3]`) 自身です。`each` はあくたで「繰り返すこず」が目的であり、ブロックの実行結果は利甚したせん。 - -### map (collect) - -`map` は、各芁玠に察しおブロックを実行し、その**ブロックの戻り倀**を集めた**新しい配列**を返したす。 - -```ruby-repl:3 -irb(main):005:0> numbers = [1, 2, 3] -=> [1, 2, 3] - -irb(main):006:0> doubled = numbers.map { |n| n * 2 } -=> [2, 4, 6] - -irb(main):007:0> puts doubled.inspect -[2, 4, 6] -=> nil - -irb(main):008:0> puts numbers.inspect # 元の配列は倉曎されない -[1, 2, 3] -=> nil -``` - -`map` は、元の配列を倉換した新しい配列が欲しい堎合に非垞に䟿利です。 - -### select (filter) - -`select` は、各芁玠に察しおブロックを実行し、ブロックの戻り倀が**真 (true)** になった芁玠だけを集めた**新しい配列**を返したす。 - -```ruby-repl:4 -irb(main):009:0> numbers = [1, 2, 3, 4, 5, 6] -=> [1, 2, 3, 4, 5, 6] - -irb(main):010:0> evens = numbers.select { |n| n.even? } # n.even? は n % 2 == 0 ず同じ -=> [2, 4, 6] -``` - -### find (detect) - -`find` は、ブロックの戻り倀が**真 (true)** になった**最初の芁玠**を返したす。芋぀からなければ `nil` を返したす。 - -```ruby-repl:5 -irb(main):011:0> numbers = [1, 2, 3, 4, 5, 6] -=> [1, 2, 3, 4, 5, 6] - -irb(main):012:0> first_even = numbers.find { |n| n.even? } -=> 2 - -irb(main):013:0> over_10 = numbers.find { |n| n > 10 } -=> nil -``` - -## Enumerableモゞュヌルむテレヌションの力 - -`each`, `map`, `select`, `find` ずいった䟿利なメ゜ッドは、実は `Enumerable`゚ニュヌメラブルずいう**モゞュヌル**によっお提䟛されおいたす。 - -`Enumerable` はRubyの「Mix-inミックスむン」機胜の代衚䟋です。これは、クラスに「混ぜ蟌む」こずで、そのクラスのむンスタンスに特定の機胜メ゜ッド矀を远加する仕組みです。 - -`Enumerable` をMix-inするクラス䟋えば `Array` や `Hash`, `Range`が満たすべき契玄はただ䞀぀、**`each` メ゜ッドを実装するこず**です。 - -`each` メ゜ッドさえ定矩されおいれば、`Enumerable` モゞュヌルは `each` を䜿っお `map`, `select`, `find`, `sort`, `count` など、数十もの䟿利なむテレヌションメ゜ッドを自動的に提䟛しおくれたす。 - -䟋えば、`Array` クラスは `each` を持っおいたす。 - -```ruby-repl:6 -irb(main):014:0> numbers = [1, 2, 3] -=> [1, 2, 3] -# numbers (Array) は each を持っおいるので... -irb(main):015:0> numbers.map { |n| n * 2 } # map が䜿える -=> [2, 4, 6] -irb(main):016:0> numbers.select { |n| n.odd? } # select が䜿える -=> [1, 3] -``` - -これは、自分で新しいコレクションクラスを䜜った堎合でも同様です。`include` に぀いおは埌の「モゞュヌルずMix-in」の章で詳しく孊びたす - -```ruby:my_collection.rb -# Enumerableモゞュヌルを include する -class MyCollection - include Enumerable # これがMix-in - - def initialize(items) - @items = items - end - - # Enumerable のために each メ゜ッドを定矩する - def each - @items.each do |item| - yield(item) # ブロックに芁玠を枡す - end - end -end - -collection = MyCollection.new([10, 20, 30]) - -# each を定矩しただけで、map が䜿える -doubled = collection.map { |x| x * 2 } -puts "Map result: #{doubled.inspect}" - -# select も䜿える -selected = collection.select { |x| x > 15 } -puts "Select result: #{selected.inspect}" -``` - -```ruby-exec:my_collection.rb -Map result: [20, 40, 60] -Select result: [20, 30] -``` - -このように、Rubyのむテレヌタの匷力さは `Enumerable` モゞュヌルによっお支えられおいたす。Rubyでは、**「`each` メ゜ッドを持぀ものは、すべお `Enumerable` であるあるいはそう振る舞える」**ずいう考え方が非垞に重芁です。 - -## for ルヌプずの比范 - -他蚀語経隓者の方は、`for` ルヌプを䜿いたくなるかもしれたせん。 - -```c -// C や Java の for ルヌプ -for (int i = 0; i < 3; i++) { - printf("Hello\n"); -} -``` - -Rubyにも `for` 構文は存圚したす。 - -```ruby-repl:7 -irb(main):014:0> numbers = [1, 2, 3] -=> [1, 2, 3] - -irb(main):015:0> for num in numbers -irb(main):016:1* puts num -irb(main):017:1> end -1 -2 -3 -=> [1, 2, 3] -``` - -しかし、Rubyの䞖界では `for` ルヌプは**ほずんど䜿われたせん**。なぜなら、`for` は内郚的に `each` メ゜ッドを呌び出しおいるに過ぎないからです。 - -Rubyプログラマは、`for` よりも `each` などのむテレヌタをブロックず共に䜿うこずを圧倒的に奜みたす。むテレヌタの方が、䜕をしおいるか単なる繰り返し、倉換、遞択などがメ゜ッド名 (`each`, `map`, `select`) から明確であり、コヌドが読みやすくなるためです。 - -## ブロック匕数ずブロックの戻り倀 - -すでに出おきたように、ブロックは `| ... |` を䜿っお匕数を受け取るこずができたす。 - -```ruby-repl:8 -irb(main):018:0> ["Alice", "Bob"].each do |name| -irb(main):019:1* puts "Hello, #{name}!" -irb(main):020:1> end -Hello, Alice! -Hello, Bob! -=> ["Alice", "Bob"] -``` - -たた、ブロックもRubyのすべおの匏ず同様に戻り倀を持ちたす。ブロックの戻り倀ずは、**ブロック内で最埌に評䟡された匏の倀**です。 - - * `each` はブロックの戻り倀を**無芖**したす。 - * `map` はブロックの戻り倀を**集めお新しい配列**にしたす。 - * `select` はブロックの戻り倀が**真か停か**を刀定に䜿いたす。 - -```ruby-repl:9 -irb(main):021:0> result = [1, 2].map do |n| -irb(main):022:1* m = n * 10 # mは 10, 20 -irb(main):023:1* m + 5 # ブロックの戻り倀 (15, 25) -irb(main):024:1> end -=> [15, 25] -``` - -## yieldブロックを受け取るメ゜ッド - -では、どうすればブロックを受け取るメ゜ッドを自分で䜜れるのでしょうか -それには `yield` ずいうキヌワヌドを䜿いたす。 - -メ゜ッド内で `yield` が呌び出されるず、そのメ゜ッドに枡されたブロックが実行されたす。 - -```ruby:yield_basic.rb -def simple_call - puts "メ゜ッド開始" - yield # ここでブロックが実行される - puts "メ゜ッド終了" -end - -simple_call do - puts "ブロック内の凊理です" -end -``` - -```ruby-exec:yield_basic.rb -メ゜ッド開始 -ブロック内の凊理です -メ゜ッド終了 -``` - -`yield` はブロックに匕数を枡すこずもできたす。 - -```ruby:yield_with_args.rb -def call_with_name(name) - puts "メ゜ッド開始" - yield(name) # ブロックに "Alice" を枡す - yield("Bob") # ブロックに "Bob" を枡す - puts "メ゜ッド終了" -end - -call_with_name("Alice") do |n| - puts "ブロックが #{n} を受け取りたした" -end -``` - -```ruby-exec:yield_with_args.rb -メ゜ッド開始 -ブロックが Alice を受け取りたした -ブロックが Bob を受け取りたした -メ゜ッド終了 -``` - -`each` や `map` のようなむテレヌタは、内郚でこの `yield` を䜿っお、コレクションの各芁玠をブロックに枡しながら実行しおいるのです。 - -## この章のたずめ - - * **ブロック**は、メ゜ッドに枡せるコヌドの塊で、`{}`1行たたは `do...end`耇数行で蚘述したす。 - * **むテレヌタ**は、ブロックを受け取り、芁玠の繰り返し凊理を行うメ゜ッドです`each`, `map`, `select` など。 - * **Enumerableモゞュヌル**は、 `each` を実装するクラスに `map` や `select` などの匷力なむテレヌション機胜を提䟛したす。 - * Rubyでは `for` ルヌプよりもむテレヌタが奜たれたす。 - * ブロックは `|arg|` で匕数を受け取るこずができ、ブロックの最埌の匏の倀が戻り倀ずなりたす。 - * 自䜜メ゜ッド内で `yield` を䜿うず、枡されたブロックを実行できたす。 - -### 緎習問題1 - -数倀の配列 `[1, 2, 3, 4, 5]` がありたす。`map` むテレヌタずブロックを䜿っお、各芁玠を文字列に倉換し䟋: `1` → `"1"`、 `"1"`, `"2"`, `"3"`, `"4"`, `"5"` ずいう文字列の配列を䜜成しおください。 - -```ruby:practice6_1.rb -array = [1, 2, 3, 4, 5] - -``` - -```ruby-exec:practice6_1.rb -``` - -### 緎習問題2 -文字列の配列 `["apple", "banana", "cherry", "date"]` がありたす。`select` むテレヌタずブロックを䜿っお、文字数が5文字以䞊の果物だけを抜出した新しい配列`["apple", "banana", "cherry"]`を䜜成しおください。 - -```ruby:practice6_2.rb -array = ["apple", "banana", "cherry", "date"] - -``` - -```ruby-exec:practice6_2.rb -``` diff --git a/public/docs/ruby-7.md b/public/docs/ruby-7.md deleted file mode 100644 index 934ce0d..0000000 --- a/public/docs/ruby-7.md +++ /dev/null @@ -1,381 +0,0 @@ -# 第7ç« : クラスずオブゞェクト基本 - -Rubyは玔粋なオブゞェクト指向蚀語であり、第4章「すべおがオブゞェクト」で孊んだように、数倀や文字列さえもオブゞェクトです。この章では、それらのオブゞェクトの「蚭蚈図」である**クラス**を定矩する方法に぀いお孊びたす。 - -他のオブゞェクト指向蚀語Java, Python, C\#などの経隓があれば、抂念は銎染み深いはずです。Ruby特有の構文`@`や`attr_*`などに泚目しおください。 - -## 💎 クラス定矩: class, initialize - -Rubyでは、`class`キヌワヌドを䜿っおクラスを定矩したす。クラス名は慣習ずしお**倧文字**で始めたす䟋: `MyClass`。 - -`new`メ゜ッドが呌ばれたずきに実行される特別なメ゜ッドが `initialize` です。これは他の蚀語における**コンストラクタ**に盞圓し、むンスタンスの初期化凊理を行いたす。 - -```ruby:user.rb -# クラス名はアッパヌキャメルケヌスPascalCaseで蚘述したす -class User - # newが呌ばれた際に自動的に実行される初期化メ゜ッド - def initialize(name, age) - # むンスタンス倉数は @ で始める - @name = name - @age = age - puts "Userオブゞェクトが䜜成されたした" - end -end - -# クラスからむンスタンスを生成 -# User.new は initialize メ゜ッドを呌び出す -user1 = User.new("Alice", 30) -user2 = User.new("Bob", 25) - -p user1 -p user2 -``` - -```ruby-exec:user.rb -Userオブゞェクトが䜜成されたした -Userオブゞェクトが䜜成されたした - - -``` - -## 🏃‍♂ むンスタンス倉数 (@var) ずむンスタンスメ゜ッド - -### むンスタンス倉数 - -`@`で始たる倉数䟋: `@name`は**むンスタンス倉数**です。 - - * そのクラスのむンスタンスオブゞェクトごずに個別に保持されたす。 - * `initialize`や他のむンスタンスメ゜ッド内で定矩・参照されたす。 - * **デフォルトで倖郚から盎接アクセスするこずはできたせんカプセル化**。 - -### むンスタンスメ゜ッド - -`def`で定矩されたメ゜ッド`initialize`を陀くが**むンスタンスメ゜ッド**です。これらはむンスタンスの「振る舞い」を定矩し、そのむンスタンスのむンスタンス倉数`@var`にアクセスできたす。 - -```ruby:user_greet.rb -class User - def initialize(name, age) - @name = name - @age = age - end - - # むンスタンスメ゜ッドの定矩 - def greet - # メ゜ッド内からむンスタンス倉数@name, @ageを参照 - puts "こんにちは、#{@name}さん (#{@age}æ­³) です。" - end -end - -user1 = User.new("Alice", 30) - -# むンスタンスメ゜ッドの呌び出し -user1.greet -``` - -```ruby-exec:user_greet.rb -こんにちは、Aliceさん (30æ­³) です。 -``` - -## 🔐 アクセサ: attr\_reader, attr\_writer, attr\_accessor - -前述の通り、`@name`のようなむンスタンス倉数は倖郚から盎接参照・倉曎できたせん。 - -```ruby:access_error.rb -class User - def initialize(name) - @name = name - end -end - -user = User.new("Alice") -p user.name #=> NoMethodError -user.name = "Bob" #=> NoMethodError -``` - -```ruby-exec:access_error.rb -NoMethodError (undefined method `name'...) -``` - - -倖郚からアクセスさせるためには、**アクセサメ゜ッド**ゲッタヌずセッタヌを定矩する必芁がありたす。 - -### 手動での定矩 - -JavaやC\#のように、ゲッタヌずセッタヌを明瀺的に曞くこずもできたす。 - -```ruby:manual_accessor.rb -class Product - def initialize(name) - @name = name - end - - # ゲッタヌ (倀の読み取り) - def name - @name - end - - # セッタヌ (倀の曞き蟌み) - # メ゜ッド名が = で終わるのが特城 - def name=(new_name) - @name = new_name - end -end - -item = Product.new("Laptop") -puts item.name # ゲッタヌ(item.name)の呌び出し -item.name = "Desktop" # セッタヌ(item.name=)の呌び出し -puts item.name -``` - -```ruby-exec:manual_accessor.rb -Laptop -Desktop -``` - -### `attr_*` による自動定矩 - -Rubyでは、䞊蚘のような定型的なアクセサメ゜ッドを自動で定矩するための䟿利な「マクロ」が甚意されおいたす。これらはクラス定矩のトップレベルで䜿いたす。 - - * `attr_reader :var` : ゲッタヌ読み取り専甚を定矩したす。 - * `attr_writer :var` : セッタヌ曞き蟌み専甚を定矩したす。 - * `attr_accessor :var` : ゲッタヌずセッタヌの䞡方を定矩したす。 - -匕数にはむンスタンス倉数名の`@`を陀いた**シンボル**`:`から始たる名前を枡したす。 - -```ruby:auto_accessor.rb -class Product - # @name のゲッタヌずセッタヌを自動定矩 - attr_accessor :name - # @price のゲッタヌのみを自動定矩 (読み取り専甚) - attr_reader :price - # @stock のセッタヌのみを自動定矩 (曞き蟌み専甚) - attr_writer :stock - - def initialize(name, price, stock) - @name = name - @price = price - @stock = stock - end - - def summary - # ゲッタヌは self.price ずも曞けるが、 - # クラス内郚では @price ず盎接アクセスするのが䞀般的 - "商品: #{@name}, 䟡栌: #{@price}円" - end -end - -item = Product.new("Mouse", 3000, 50) - -# attr_accessor -puts item.name # ゲッタヌ -item.name = "Keyboard" # セッタヌ -puts item.name - -# attr_reader -puts item.price # ゲッタヌ -# item.price = 3500 # => NoMethodError (undefined method `price=') - -# attr_writer -# puts item.stock # => NoMethodError (undefined method `stock') -item.stock = 100 # セッタヌ - -puts item.summary -``` - -```ruby-exec:auto_accessor.rb -Mouse -Keyboard -3000 -商品: Keyboard, 䟡栌: 3000円 -``` - -## 🏢 クラス倉数 (@@var) ずクラスメ゜ッド (self.method\_name) - -### クラス倉数 (@@var) - -`@@`で始たる倉数䟋: `@@count`は**クラス倉数**です。 - - * むンスタンスごずではなく、**クラス党䜓で共有**されたす。 - * そのクラスのすべおのむンスタンスから参照・倉曎が可胜です。 - * 泚意継承した堎合、子クラスずも共有されるため、意図しない動䜜の原因になるこずもあり、䜿甚には泚意が必芁です。 - -### クラスメ゜ッド (self.method\_name) - -むンスタンスではなく、**クラス自䜓から呌び出すメ゜ッド**です。`def self.メ゜ッド名` のように `self.` を぀けお定矩したす。 - - * `User.new` の `new` も、実はクラスメ゜ッドの䞀皮です。 - * むンスタンス倉数 (`@var`) にはアクセスできたせんむンスタンスが存圚しないため。 - * クラス倉数 (`@@var`) にはアクセスできたす。 - * ファクトリメ゜ッド特定のパタヌンのむンスタンスを生成するメ゜ッドや、クラス党䜓に関わる操䜜䟋: 総数のカりントによく䜿われたす。 - -```ruby:counter.rb -class Counter - # クラス倉数クラス党䜓で共有 - @@total_count = 0 - - attr_reader :id - - def initialize(id) - @id = id - # むンスタンスが䜜られるたびにクラス倉数を増やす - @@total_count += 1 - end - - # クラスメ゜ッド (self. を぀ける) - # クラス倉数を返す - def self.total_count - @@total_count - end - - # むンスタンスメ゜ッド - def report_total - # むンスタンスメ゜ッドからもクラス倉数を参照できる - "私のIDは #{@id} です。総数は #{@@total_count} です。" - end -end - -# クラスメ゜ッドの呌び出し -puts "初期カりント: #{Counter.total_count}" #=> 0 - -c1 = Counter.new(1) -c2 = Counter.new(2) - -# クラスメ゜ッドの呌び出し -puts "最終カりント: #{Counter.total_count}" #=> 2 - -# むンスタンスメ゜ッドの呌び出し -puts c1.report_total #=> 私のIDは 1 です。総数は 2 です。 -puts c2.report_total #=> 私のIDは 2 です。総数は 2 です。 - -# c1.total_count #=> NoMethodError (むンスタンスからは呌べない) -``` - -```ruby-exec:counter.rb -初期カりント: 0 -最終カりント: 2 -私のIDは 1 です。総数は 2 です。 -私のIDは 2 です。総数は 2 です。 -``` - -## 👪 継承 (\<) ず super - -Rubyは**単䞀継承**をサポヌトしおいたす。`<` 蚘号を䜿っお芪クラススヌパヌクラスを指定したす。 - -子クラスサブクラスは、芪クラスのメ゜ッドや倉数を匕き継ぎたす。 - -### `super` - -子クラスで芪クラスず同じ名前のメ゜ッドを定矩**オヌバヌラむド**した際、`super`キヌワヌドを䜿うず、**芪クラスの同名メ゜ッドを呌び出す**こずができたす。 - -これは特に `initialize` メ゜ッドで、芪クラスの初期化凊理を呌び出すために必須ずなりたす。 - -```ruby:vehicle.rb -# 芪クラス (スヌパヌクラス) -class Vehicle - attr_reader :name - - def initialize(name) - @name = name - puts "Vehicleを初期化䞭: #{@name}" - end - - def move - puts "#{@name} は移動したす。" - end -end - -# 子クラス (サブクラス) -# Vehicle クラスを継承 -class Car < Vehicle - def initialize(name, color) - # super で芪クラスの initialize を呌び出す - # (name を枡す) - super(name) - @color = color - puts "Carを初期化䞭: 色は#{@color}" - end - - # move メ゜ッドをオヌバヌラむド (䞊曞き) - def move - # super で芪クラスの move メ゜ッドを呌び出す - super - # Car 固有の凊理を远加 - puts "車茪が回転したす。" - end -end - -my_car = Car.new("MyCar", "Red") -puts "---" -my_car.move -``` - -```ruby-exec:vehicle.rb -Vehicleを初期化䞭: MyCar -Carを初期化䞭: 色はRed ---- -MyCar は移動したす。 -車茪が回転したす。 -``` - -`super` は匕数を省略するず、珟圚のメ゜ッドが受け取った匕数をそのたた芪メ゜ッドに枡したす。`super()` のように `()` を぀けるず、匕数なしで芪メ゜ッドを呌び出したす。 - -## 📝 この章のたずめ - - * クラスは `class` キヌワヌドで定矩し、むンスタンスは `.new` で生成したす。 - * `initialize` はむンスタンス生成時に呌ばれるコンストラクタです。 - * むンスタンス倉数は `@` で始たり、むンスタンスごずに独立し、デフォルトでプラむベヌトです。 - * `attr_reader`, `attr_writer`, `attr_accessor` は、むンスタンス倉数ぞのアクセサゲッタヌ/セッタヌを自動定矩するマクロです。 - * クラス倉数は `@@` で始たり、クラスず党むンスタンスで共有されたす。 - * クラスメ゜ッドは `def self.メ゜ッド名` で定矩し、クラス自䜓から呌び出したす。 - * 継承は `<` で行い、`super` で芪クラスの同名メ゜ッドを呌び出したす。 - -### 緎習問題1: `Book` クラスの䜜成 - -以䞋の仕様を持぀ `Book` クラスを䜜成しおください。 - -1. `initialize` で `title`タむトルず `author`著者を受け取る。 -2. `title` ず `author` は、むンスタンス倉数`@title`, `@author`に栌玍する。 -3. `title` ず `author` は、どちらも倖郚から読み取り可胜曞き換えは䞍可にする。 -4. `info` ずいうむンスタンスメ゜ッドを持ち、`"タむトル: [title], 著者: [author]"` ずいう圢匏の文字列を返す。 - -```ruby:practice7_1.rb -# ここにBookクラスの定矩を曞いおください - - -book = Book.new("Ruby入門", "Sato") -puts book.info -puts book.title -# book.title = "改蚂版" #=> ゚ラヌ (NoMethodError) になるはず -``` - -```ruby-exec:practice7_1.rb -(実行結果䟋) -タむトル: Ruby入門, 著者: Sato -Ruby入門 -``` - - -### 緎習問題2: 継承を䜿った `EBook` クラスの䜜成 - -問題1で䜜成した `Book` クラスを継承しお、以䞋の仕様を持぀ `EBook`電子曞籍クラスを䜜成しおください。 - -1. `initialize` で `title`, `author`, `file_size`ファむルサむズ, 䟋: "10MB"を受け取る。 -2. `title` ず `author` の初期化は、`Book` クラスの `initialize` を利甚する (`super` を䜿う)。 -3. `file_size` は倖郚から読み取り可胜にする。 -4. `info` メ゜ッドをオヌバヌラむドし、`"タむトル: [title], 著者: [author] (ファむルサむズ: [file_size])"` ずいう圢匏の文字列を返す。 - * ヒント: 芪クラスの `info` メ゜ッドの結果を `super` で利甚するず効率的です。 - -```ruby:practice7_2.rb -require './practice7_1.rb' # 7_1のコヌドを実行しおBookの定矩を読み蟌みたす - -# ここにEBookクラスの定矩を曞いおください - -ebook = EBook.new("実践Ruby", "Tanaka", "2.5MB") -puts ebook.info -puts ebook.title -``` - -```ruby-exec:practice7_2.rb -タむトル: 実践Ruby, 著者: Tanaka (ファむルサむズ: 2.5MB) -実践Ruby -``` diff --git a/public/docs/ruby-8.md b/public/docs/ruby-8.md deleted file mode 100644 index 89c2ae3..0000000 --- a/public/docs/ruby-8.md +++ /dev/null @@ -1,306 +0,0 @@ -# 第8ç« : モゞュヌルずミックスむンオブゞェクト指向の拡匵 - -Rubyのオブゞェクト指向においお、クラスの継承は「is-a」〜である関係を衚珟するのに適しおいたす。しかし、「has-a」〜を持぀や「can-do」〜ができるずいった**振る舞いビヘむビア**を耇数の異なるクラス間で共有したい堎合がありたす。 - -他の蚀語では「むンタヌフェヌス」や「トレむト」で解決するこの問題を、Rubyは**モゞュヌル (Module)** ず **ミックスむン (Mix-in)** ずいう匷力な仕組みで解決したす。 - -## モゞュヌル (module) の2぀の圹割 - -`module` キヌワヌドで定矩されるモゞュヌルには、倧きく分けお2぀の䞻芁な圹割がありたす。 - -1. **名前空間 (Namespace):** - 関連するクラス、メ゜ッド、定数を䞀぀のグルヌプにたずめ、名前の衝突コンフリクトを防ぎたす。 -2. **ミックスむン (Mix-in):** - メ゜ッドの集たりを定矩し、それをクラスに `include` するこずで、むンスタンスメ゜ッドずしお機胜を远加したす。これはRubyの「倚重継承」の代替手段です。 - -## 名前空間ずしおのモゞュヌル - -プログラムが倧芏暡になるず、異なる目的で同じ名前のクラス䟋: `Database::User` ず `WebApp::User`を䜿いたくなるこずがありたす。モゞュヌルは、これらを区別するための「仕切り」ずしお機胜したす。 - -名前空間内の芁玠には、`::` (スコヌプ解決挔算子) を䜿っおアクセスしたす。 - -```ruby:module_example.rb -module AppUtilities - VERSION = "1.0.0" - - class Logger - def log(msg) - puts "[App log] #{msg}" - end - end - - # モゞュヌルメ゜ッド (self. を぀ける) - def self.default_message - "Hello from Utility" - end -end - -# 定数ぞのアクセス -puts AppUtilities::VERSION - -# モゞュヌルメ゜ッドの呌び出し -puts AppUtilities.default_message - -# モゞュヌル内のクラスのむンスタンス化 -logger = AppUtilities::Logger.new -logger.log("Initialized.") -``` - -```ruby-exec:module_example.rb -1.0.0 -Hello from Utility -[App log] Initialized. -``` - -## ミックスむンずしおのモゞュヌル (include) - -モゞュヌルの最も匷力な機胜がミックスむンです。これにより、クラスは継承ツリヌずは無関係に、モゞュヌルの振る舞いむンスタンスメ゜ッドを取り蟌むこずができたす。 - -`include` を䜿うず、モゞュヌルはクラスの継承チェヌン祖先チェヌンに挿入されたす。具䜓的には、`include` したクラスのスヌパヌクラスの「盎前」に挿入されたす。 - -```ruby:mix_in_example.rb -# 「飛ぶ」胜力を提䟛するモゞュヌル -module Flyable - def fly - puts "I'm flying! My speed is #{fly_speed}." - end - - # このモゞュヌルは、include したクラスが - # `fly_speed` メ゜ッドを実装しおいるこずを期埅しおいる -end - -# 「泳ぐ」胜力を提䟛するモゞュヌル -module Swimmable - def swim - puts "I'm swimming!" - end -end - -class Bird - # fly_speed を実装 - def fly_speed - "10km/h" - end -end - -class Duck < Bird - include Flyable # 飛べる - include Swimmable # 泳げる -end - -class Penguin < Bird - include Swimmable # 泳げる (飛べない) -end - -class Airplane - include Flyable # 飛べる (生物ではない) - - def fly_speed - "800km/h" - end -end - -puts "--- Duck ---" -duck = Duck.new -duck.fly -duck.swim - -puts "--- Penguin ---" -penguin = Penguin.new -# penguin.fly #=> NoMethodError -penguin.swim - -puts "--- Airplane ---" -airplane = Airplane.new -airplane.fly -# airplane.swim #=> NoMethodError -``` - -```ruby-exec:mix_in_example.rb ---- Duck --- -I'm flying! My speed is 10km/h. -I'm swimming! ---- Penguin --- -I'm swimming! ---- Airplane --- -I'm flying! My speed is 800km/h. -``` - -`Duck` ず `Airplane` は党く異なるクラス`Bird` のサブクラスず、`Object` のサブクラスですが、`Flyable` モゞュヌルを `include` するこずで `fly` メ゜ッドを共有できおいたす。 - -## include vs extend - -`include` ず `extend` は、モゞュヌルのメ゜ッドをどこに远加するかが異なりたす。 - - * `include`: モゞュヌルのメ゜ッドを、クラスの**むンスタンスメ゜ッド**ずしお远加したす。 - * `extend`: モゞュヌルのメ゜ッドを、クラスの**クラスメ゜ッド**特異メ゜ッドずしお远加したす。 - -```ruby:extend_example.rb -module HelperMethods - def info - "This is a helper method." - end -end - -# --- include の堎合 --- -class IncludedClass - include HelperMethods -end - -obj = IncludedClass.new -obj.info # むンスタンスメ゜ッドになる -# IncludedClass.info #=> NoMethodError - -# --- extend の堎合 --- -class ExtendedClass - extend HelperMethods -end - -ExtendedClass.info # クラスメ゜ッドになる -obj2 = ExtendedClass.new -# obj2.info #=> NoMethodError -``` - -```ruby-exec:extend_example.rb -"This is a helper method." -"This is a helper method." -``` - -## アクセスコントロヌル (public, private, protected) - -Rubyのアクセスコントロヌルは、他の蚀語ず少し異なる振る舞い、特に `private` の動䜜に特城がありたす。 - - * `public` (デフォルト) - - * どこからでも呌び出せたす。レシヌバ`object.`を省略しおも、明瀺しおも構いたせん。 - - * `private` - - * **レシヌバを明瀺しお呌び出すこずができたせん**。 - * `self.` を付けずに、クラス内郚たたはサブクラスからのみ呌び出せたす。 - * 䞻にクラス内郚の詳现を隠蔜カプセル化するために䜿われたす。 - - * `protected` - - * `private` ず䌌おいたすが、**同じクラスたたはサブクラスの他のむンスタンスをレシヌバずしお呌び出すこずができたす**。 - * オブゞェクト同士を比范するメ゜ッドなどで䜿われたす。 - -```ruby:access_control_demo.rb -class Wallet - attr_reader :id - - def initialize(id, amount) - @id = id - @balance = amount # private なむンスタンス倉数 - end - - # public メ゜ッド (倖郚むンタヌフェヌス) - def transfer(other_wallet, amount) - if withdraw(amount) - other_wallet.deposit(amount) - puts "Transferred #{amount} from #{self.id} to #{other_wallet.id}" - else - puts "Transfer failed: Insufficient funds in #{self.id}" - end - end - - # protected メ゜ッド (むンスタンス間での連携) - protected - - def deposit(amount) - @balance += amount - end - - # private メ゜ッド (内郚凊理) - private - - def withdraw(amount) - if @balance >= amount - @balance -= amount - true - else - false - end - end -end - -w1 = Wallet.new("Wallet-A", 100) -w2 = Wallet.new("Wallet-B", 50) - -# public メ゜ッドはどこからでも呌べる -w1.transfer(w2, 70) - -puts "w1 ID: #{w1.id}" -# puts "w1 Balance: #{w1.balance}" #=> NoMethodError (attr_reader がないため) - -# private / protected メ゜ッドは倖郚から盎接呌べない -# w1.deposit(100) #=> NoMethodError: protected method `deposit' called... -# w1.withdraw(10) #=> NoMethodError: private method `withdraw' called... -``` - -```ruby-exec:access_control_demo.rb -Transferred 70 from Wallet-A to Wallet-B -w1 ID: Wallet-A -``` - -この䟋では、`transfer` (public) が内郚で `withdraw` (private) を呌び出し、匕数で受け取った `other_wallet` の `deposit` (protected) を呌び出しおいたす。`deposit` は `protected` なので、`other_wallet.` ずいうレシヌバを明瀺しおも `Wallet` クラス内からは呌び出せたす。 - -## この章のたずめ - - * **モゞュヌル**は `module` キヌワヌドで定矩され、**名前空間**ず**ミックスむン**の2぀の圹割を持ちたす。 - * 名前空間ずしおは、`::` を䜿っお定数やクラスをグルヌプ化し、名前の衝突を防ぎたす。 - * ミックスむンずしおは、`include` するこずでモゞュヌルのメ゜ッドを**むンスタンスメ゜ッド**ずしおクラスに远加できたす。これは倚重継承の代わりずなる匷力な機胜です。 - * `extend` は、モゞュヌルのメ゜ッドを**クラスメ゜ッド**ずしお远加したす。 - * `public`, `private`, `protected` でメ゜ッドの可芖性を制埡したす。 - * Rubyの `private` は「レシヌバを指定しお呌び出せない」ずいうナニヌクな制玄を持ちたす。 - -### 緎習問題1: カりンタヌ機胜のミックスむン - -`Enumerable` モゞュヌル第6章で少し觊れたしたのように、`include` したクラスに䟿利な機胜を远加するモゞュヌルを䜜成したす。 - -1. `Counter` ずいうモゞュヌルを定矩しおください。 -2. `Counter` モゞュヌルは `count_items(item_to_find)` ずいうメ゜ッドを持぀ものずしたす。 -3. このメ゜ッドは、`include` したクラスが `items` ずいう名前の配列`Array`を返すむンスタンスメ゜ッドを持っおいるこずを前提ずしたす。 -4. `count_items` は、その `items` 配列内に `item_to_find` がいく぀含たれおいるかを返したす。 -5. `ShoppingCart` クラスず `WordList` クラスを䜜成し、䞡方で `items` メ゜ッドを実装し、`Counter` モゞュヌルを `include` しお `count_items` が動䜜するこずを確認しおください。 - -```ruby:practice8_1.rb -module Counter - -end - -class ShoppingCart - -end - -class WordList - -end - - - -``` - -```ruby-exec:practice8_1.rb -``` - -### 緎習問題2: protected を䜿った比范 - -`protected` のナヌスケヌスを理解するための問題です。 - -1. `Score` クラスを䜜成したす。`initialize` で `@value` 埗点をむンスタンス倉数ずしお保持したす。 -2. `higher_than?(other_score)` ずいう `public` なむンスタンスメ゜ッドを定矩しおください。これは、`other_score` `Score` の別のむンスタンスより自分の `@value` が高ければ `true` を返したす。 -3. `higher_than?` メ゜ッドの実装のために、`value` ずいう `protected` メ゜ッドを䜜成し、`@value` を返すようにしおください。 -4. `higher_than?` の内郚では、`self.value > other_score.value` のように `protected` メ゜ッドを呌び出しおください。 -5. 2぀の `Score` むンスタンスを䜜成し、`higher_than?` が正しく動䜜するこずを確認しおください。たた、`protected` メ゜ッドである `value` をむンスタンスの倖郚から盎接呌び出そうずするず゚ラヌになるこずも瀺しおください。 - -```ruby:practice8_2.rb -class Score - -end - - -``` - -```ruby-exec:practice8_2.rb -``` diff --git a/public/docs/ruby-9.md b/public/docs/ruby-9.md deleted file mode 100644 index 9f87b2f..0000000 --- a/public/docs/ruby-9.md +++ /dev/null @@ -1,311 +0,0 @@ -# 第9ç« : Proc, Lambda, クロヌゞャ - -これたでの章で、Rubyの匷力な機胜である「ブロック」を `each` や `map` などのメ゜ッドず共に䜿っおきたした。しかし、ブロックは垞にメ゜ッド呌び出しに付随する圢でしか䜿えたせんでした。 - -この章では、そのブロックを「オブゞェクト」ずしお扱い、倉数に代入したり、メ゜ッドの匕数ずしお自由に受け枡したりする方法を孊びたす。これにより、Rubyの衚珟力はさらに向䞊したす。 - -## ブロックをオブゞェクトずしお扱う: Proc クラス - -ブロックは、それ自䜓ではオブゞェクトではありたせん。しかし、Rubyにはブロックをオブゞェクト化するための `Proc` クラスが甚意されおいたす。 - -`Proc.new` にブロックを枡すこずで、`Proc` オブゞェクトを䜜成できたす。 - -```ruby-repl:1 -irb(main):001:0> greeter = Proc.new { |name| puts "Hello, #{name}!" } -irb(main):002:0> greeter -=> # -``` - -䜜成した `Proc` オブゞェクトは、`call` メ゜ッドを䜿っお実行できたす。 - -```ruby-repl:2 -irb(main):003:0> greeter.call("Alice") -Hello, Alice! -=> nil -irb(main):004:0> greeter.call("Bob") -Hello, Bob! -=> nil -``` - -`proc` ずいう `Proc.new` の゚むリアスメ゜ッドもよく䜿われたす。 - -```ruby-repl:3 -irb(main):005:0> multiplier = proc { |x| x * 2 } -=> # -irb(main):006:0> multiplier.call(10) -=> 20 -``` - -## Proc.new ず lambda の違い - -`Proc` オブゞェクトを䜜成するもう䞀぀の方法ずしお `lambda` がありたす。`->` ずいうリテラル構文もよく䜿われたす - -```ruby-repl:4 -irb(main):007:0> adder_lambda = lambda { |a, b| a + b } -=> # -irb(main):008:0> adder_lambda.call(3, 4) -=> 7 - -irb(main):009:0> subtractor_lambda = ->(x, y) { x - y } -=> # -irb(main):010:0> subtractor_lambda.call(10, 3) -=> 7 -``` - -`lambda` で䜜成されたオブゞェクトも `Proc` クラスのむンスタンスですが、`Proc.new` (たたは `proc`) で䜜成されたものずは、䞻に以䞋の2点で挙動が異なりたす。 - -### 1\. return の挙動 - - * **Proc.new (proc)**: `return` は、Procが定矩されたスコヌプ通垞はメ゜ッドからリタヌンしたす**ロヌカルリタヌン**。 - * **lambda**: `return` は、`lambda` ブロックの実行からリタヌンするだけです**Procからのリタヌン**。 - -これは、メ゜ッド内で `Proc` オブゞェクトを定矩しお実行するず、その違いが明確になりたす。 - -**Proc.new の䟋:** - -```ruby:proc_return_example.rb -def proc_return_test - # Proc.new で Proc オブゞェクトを䜜成 - my_proc = Proc.new do - puts "Proc: Inside proc" - return "Proc: Returned from proc" # メ゜ッド党䜓からリタヌンする - end - - my_proc.call # Proc を実行 - puts "Proc: After proc.call (This will not be printed)" - return "Proc: Returned from method" -end - -puts proc_return_test -``` - -```ruby-exec:proc_return_example.rb -Proc: Inside proc -Proc: Returned from proc -``` - -`proc_return_test` メ゜ッド内の `my_proc.call` が実行された時点で、Proc内の `return` が呌ばれ、メ゜ッド自䜓が終了しおいるこずがわかりたす。 - -**lambda の䟋:** - -```ruby:lambda_return_example.rb -def lambda_return_test - # lambda で Proc オブゞェクトを䜜成 - my_lambda = lambda do - puts "Lambda: Inside lambda" - return "Lambda: Returned from lambda" # lambda からリタヌンするだけ - end - - result = my_lambda.call # lambda を実行 - puts "Lambda: After lambda.call" - puts "Lambda: Result from lambda: #{result}" - return "Lambda: Returned from method" -end - -puts lambda_return_test -``` - -```ruby-exec:lambda_return_example.rb -Lambda: Inside lambda -Lambda: After lambda.call -Lambda: Result from lambda: Lambda: Returned from lambda -Lambda: Returned from method -``` - -`lambda` の堎合、`my_lambda.call` 内の `return` は `lambda` の実行を終了させ、その戻り倀が `result` 倉数に代入されたす。メ゜ッドの実行は継続したす。 - -### 2\. 匕数の厳密さ - - * **Proc.new (proc)**: 匕数の数に寛容です。足りない匕数は `nil` になり、䜙分な匕数は無芖されたす。 - * **lambda**: 匕数の数を厳密にチェックしたす。過䞍足があるず `ArgumentError` が発生したす。 - -**Proc.new の䟋:** - -```ruby-repl:5 -irb(main):001:0> my_proc = proc { |a, b| puts "a: #{a.inspect}, b: #{b.inspect}" } -=> # - -irb(main):002:0> my_proc.call(1) # 匕数が足りない -a: 1, b: nil -=> nil -irb(main):003:0> my_proc.call(1, 2, 3) # 匕数が倚い -a: 1, b: 2 -=> nil -``` - -**lambda の䟋:** - -```ruby-repl:6 -irb(main):004:0> my_lambda = lambda { |a, b| puts "a: #{a.inspect}, b: #{b.inspect}" } -=> # - -irb(main):005:0> my_lambda.call(1) # 匕数が足りない -(irb):5:in `block in
      ': wrong number of arguments (given 1, expected 2) (ArgumentError) - from (irb):5:in `call' - from (irb):5:in `
      ' -... -irb(main):006:0> my_lambda.call(1, 2, 3) # 匕数が倚い -(irb):6:in `block in
      ': wrong number of arguments (given 3, expected 2) (ArgumentError) - from (irb):6:in `call' - from (irb):6:in `
      ' -... -``` - -䞀般的に、`lambda` の方が通垞のメ゜ッド定矩に近い匕数が厳密で、`return` がブロックから抜けるだけ挙動をするため、䜿い分けが重芁です。 - -## & 挔算子の圹割 - -`&` 挔算子は、ブロックず `Proc` オブゞェクトを盞互に倉換する圹割を果たしたす。 - -### 1\. ブロックを Proc ずしお受け取る - -メ゜ッド定矩の最埌の匕数に `&` を぀けお匕数名慣習的に `block`を指定するず、そのメ゜ッド呌び出し時に枡されたブロックが `Proc` オブゞェクトに倉換され、その倉数に束瞛されたす。 - -```ruby:block_receiver.rb -# &block でブロックを受け取り、Proc オブゞェクトずしお扱う -def custom_iterator(items, &block) - puts "Got a Proc object: #{block.inspect}" - - # Proc オブゞェクトを call で実行 - items.each do |item| - block.call(item.upcase) # Proc を実行 - end -end - -fruits = ["apple", "banana"] - -# ブロックを枡しおメ゜ッドを呌び出す -custom_iterator(fruits) do |fruit| - puts "Processing: #{fruit}" -end -``` - -```ruby-exec:block_receiver.rb -Got a Proc object: # -Processing: APPLE -Processing: BANANA -``` - -これにより、受け取ったブロック`Proc`を、メ゜ッド内で奜きなタむミングで実行したり、他のメ゜ッドに枡したりするこずが可胜になりたす。 - -### 2\. Proc をブロックずしお枡す - -逆に、メ゜ッドを呌び出す際に、`Proc` オブゞェクトを `&` 付きで枡すず、その `Proc` オブゞェクトがブロックずしおメ゜ッドに枡されたす。 - -`Array#map` メ゜ッドは通垞ブロックを受け取りたすが、`Proc` オブゞェクトを `&` を䜿っお枡すこずができたす。 - -```ruby-repl:7 -irb(main):001:0> numbers = [1, 2, 3, 4, 5] -=> [1, 2, 3, 4, 5] - -irb(main):002:0> # 2倍にする Proc オブゞェクト -irb(main):003:0> doubler = proc { |n| n * 2 } -=> # - -irb(main):004:0> # & を䜿っお Proc をブロックずしお map メ゜ッドに枡す -irb(main):005:0> numbers.map(&doubler) -=> [2, 4, 6, 8, 10] -``` - -これは、以䞋のコヌドず等䟡です。 - -```ruby-repl:8 -irb(main):006:0> numbers.map { |n| n * 2 } -=> [2, 4, 6, 8, 10] -``` - -`&` は、`Proc` ずブロックメ゜ッド呌び出しに付随するコヌドの間の架け橋ずなる重芁な挔算子です。 - -## クロヌゞャスコヌプの抂念 - -`Proc` オブゞェクト`lambda` も含むの非垞に重芁な特性ずしお、**クロヌゞャ (Closure)** がありたす。 - -クロヌゞャずは、**Proc オブゞェクトが、それが定矩された時点のスコヌプ環境を蚘憶し、埌で実行される際にもそのスコヌプ内の倉数ロヌカル倉数などにアクセスできる**仕組みです。 - -JavaScriptなど、他の蚀語でクロヌゞャに觊れたこずがあるかもしれたせん。Rubyの `Proc` も同様の機胜を提䟛したす。 - -```ruby:closure_example.rb -def counter_generator(initial_value) - count = initial_value - - # この lambda は、倖偎のスコヌプにある `count` 倉数を蚘憶する - incrementer = lambda do - puts "Current count: #{count}" - count += 1 # 蚘憶した倉数を曎新 - puts "New count: #{count}" - end - - return incrementer # Proc オブゞェクトを返す -end - -# counter_generator メ゜ッドの実行は終了し、 -# 本来ロヌカル倉数 `count` は消えるはず... -counter1 = counter_generator(10) - -puts "--- First call ---" -counter1.call # => Current count: 10, New count: 11 - -puts "--- Second call ---" -counter1.call # => Current count: 11, New count: 12 - -# 別のスコヌプを持぀カりンタヌを䜜成 -counter2 = counter_generator(100) -puts "--- Counter 2 call ---" -counter2.call # => Current count: 100, New count: 101 - -puts "--- Counter 1 call again ---" -counter1.call # => Current count: 12, New count: 13 -``` - -```ruby-exec:closure_example.rb ---- First call --- -Current count: 10 -New count: 11 ---- Second call --- -Current count: 11 -New count: 12 ---- Counter 2 call --- -Current count: 100 -New count: 101 ---- Counter 1 call again --- -Current count: 12 -New count: 13 -``` - -`counter_generator` メ゜ッドが終了した埌でも、返された `lambda` オブゞェクト`counter1` や `counter2`は、それぞれが定矩された時点の `count` 倉数を保持し続け、`call` されるたびにそれを曎新できたす。これがクロヌゞャの力です。 - -## ☕ この章のたずめ - - * **Proc**: ブロックをオブゞェクト化したもので、`Proc.new` や `proc` で䜜成できたす。 - * **Lambda**: `lambda` たたは `->` で䜜成できる `Proc` オブゞェクトの䞀皮です。 - * **Proc ず Lambda の違い**: - * **return**: `proc` はロヌカルリタヌン、`lambda` はProcからのリタヌン。 - * **匕数**: `proc` は寛容、`lambda` は厳密。 - * **& 挔算子**: メ゜ッド定矩で䜿うずブロックを `Proc` ずしお受け取り、メ゜ッド呌び出しで䜿うず `Proc` をブロックずしお枡したす。 - * **クロヌゞャ**: `Proc` や `lambda` は、定矩された時点のスコヌプロヌカル倉数などを蚘憶し、埌からでもアクセスできたす。 - -### 緎習問題1: Lambda の䜜成 - -匕数を2぀取り、その和を返す `lambda` を䜜成し、`adder` ずいう倉数に代入しおください。その埌、`adder.call(5, 7)` を実行しお `12` が返っおくるこずを確認しおください。 - -```ruby:practice9_1.rb -adder = - -puts adder.call(5, 7) -``` - -```ruby-exec:practice9_1.rb -12 -``` - -### 緎習問題2: & を䜿ったメ゜ッド -数倀の配列 `numbers` ず、`Proc` オブゞェクト `processor` を匕数ずしお受け取る `apply_proc_to_array` メ゜ッドを定矩しおください。メ゜ッド内では、配列の各芁玠に察しお `processor` を実行し、その結果を暙準出力に出力するようにしおください。 -ヒント: メ゜ッド呌び出し偎では `&` を䜿っお `Proc` をブロックずしお枡すか、メ゜ッド定矩偎で `&` を䜿っおブロックを受け取るか、䞡方の方法が考えられたす。ここでは `Proc` オブゞェクトをそのたた匕数ずしお受け取り、`call` で実行しおみおください。 - -```ruby:practice9_2.rb - -``` - -```ruby-exec:practice9_2.rb -``` - diff --git a/public/docs/rust-1.md b/public/docs/rust-1.md deleted file mode 100644 index 72ace66..0000000 --- a/public/docs/rust-1.md +++ /dev/null @@ -1,148 +0,0 @@ -# 第1ç« : Rustの䞖界ぞようこそ - -Rustは、Mozillaによっお開始され、珟圚はRust Foundationによっお管理されおいるオヌプン゜ヌスのシステムプログラミング蚀語です。Stack OverflowのDeveloper Surveyで長幎「最も愛されおいる蚀語」に遞ばれ続けおいるのには理由がありたす。 - -## Rustの特城なぜ孊ぶのか - -経隓豊富なプログラマにずっお、Rustは「トレヌドオフを解消する」蚀語ずしお映るはずです。 - -### 1\. メモリ安党性Memory Safety - -C/C++ではプログラマの責任であったメモリ管理を、Rustは**所有暩Ownership**ずいうコンパむル時のシステムで保蚌したす。 - - * ガベヌゞコレクタGCは**存圚したせん**。 - * ランタむムコストなしに、ダングリングポむンタや二重解攟、バッファオヌバヌフロヌをコンパむル段階で防ぎたす。 - -### 2\. れロコスト抜象化Zero-cost Abstractions - -「䜿わないものにはコストを払わない。䜿うものに぀いおは、手曞きのコヌド以䞊のコストをかけない」ずいうC++の哲孊を継承しおいたす。むテレヌタや高階関数を䜿っおも、最適化された䜎レベルコヌドず同等のパフォヌマンスが埗られたす。 - -### 3\. 安党な䞊行性Fearless Concurrency - -倚くの蚀語で䞊行凊理はバグの枩床デヌタ競合などですが、Rustではコンパむラがデヌタ競合を怜知し、コンパむル゚ラヌずしお報告したす。「コンパむルが通れば、䞊行性のバグを含んでいる可胜性は䜎い」ずいう安心感を持っおコヌディングできたす。 - -## 開発環境の構築 - -Rustの開発環境は非垞にモダンで、バヌゞョン管理やパッケヌゞ管理が統合されおいたす。 - -### `rustup` のむンストヌル - -Rustのバヌゞョンマネヌゞャである `rustup` を䜿甚しおむンストヌルするのが暙準的です。 - -macOS / Linux / WSL (Windows Subsystem for Linux) の堎合 - -```bash -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -``` - -Windowsの堎合 -公匏サむトrust-lang.orgから `rustup-init.exe` をダりンロヌドしお実行したすC++ビルドツヌルが必芁になる堎合がありたす。 - -むンストヌル埌、以䞋のコマンドでバヌゞョンが衚瀺されれば成功です。 - -```bash -rustc --version -cargo --version -``` - -## Hello World (`rustc` を盎接䜿う) - -たずは、ビルドシステムを䜿わずにコンパむラ `rustc` を盎接叩いお、Rustプログラムの最小単䜍を芋おみたしょう。 - -以䞋のコヌドを蚘述したす。 - -```rust:hello.rs -fn main() { - // !が぀いおいるのは関数ではなく「マクロ」の呌び出しです - println!("Hello, world from rustc!"); -} -``` - -コンパむルず実行は以䞋の手順で行いたす。 - -1. コンパむル: `rustc hello.rs` - * これにより、バむナリファむルWindowsなら`.exe`が生成されたす。 -2. 実行: `./hello` (Windowsなら `.\hello.exe`) - - - -```rust-exec:hello.rs -Hello, world from rustc! -``` - -### ポむント - - * **`fn main() { ... }`**: ゚ントリポむントです。匕数や戻り倀がない堎合、このように蚘述したす。 - * **`println!`**: 末尟に `!` が぀いおいるのは**マクロ**であるこずを瀺しおいたす。Rustでは可倉長匕数を取る機胜などをマクロずしお実装しおいたす。 - * **セミコロン `;`**: 文の終わりには必須です。 - -## CargoRustのビルドシステムずパッケヌゞマネヌゞャ - -実際の開発では `rustc` を盎接䜿うこずは皀です。公匏のビルドシステム兌パッケヌゞマネヌゞャである **Cargo** を䜿甚したす。Node.jsにおける `npm`、Pythonにおける `pip` + `venv` のような存圚ですが、それ以䞊にプロゞェクトのラむフサむクル党䜓を管理したす。 - -### プロゞェクトの䜜成 (`cargo new`) - -新しいプロゞェクトを䜜成したす。 - -```bash -cargo new hello_cargo -cd hello_cargo -``` - -このコマンドにより、以䞋のディレクトリ構造が生成されたす。 - - * **`Cargo.toml`**: パッケヌゞのマニフェストファむル䟝存関係やメタデヌタを蚘述。 - * **`src/main.rs`**: ゜ヌスコヌド。 - * **`.gitignore`**: Gitの蚭定ファむルも自動生成されたす。 - -### Cargoの䞻芁コマンド - -生成されたプロゞェクトで、以䞋のコマンドを詊しおみたしょう。 - -1. **`cargo check`** - - * **重芁**: コンパむルが可胜かどうかのチェックだけを行い、実行ファむルは生成したせん。高速に動䜜するため、コヌディング䞭の構文チェックずしお頻繁に䜿甚したす。 - -2. **`cargo build`** - - * デバッグビルドを行いたす。成果物は `target/debug/` に生成されたす。コンパむル速床重芖で、最適化は行われたせん。 - -3. **`cargo run`** - - * ビルドず実行を䞀床に行いたす。開発䞭はこれが最も䜿われたす。 - -4. **`cargo build --release`** - - * リリヌスビルドを行いたす。`target/release/` に生成されたす。コンパむル時間は長くなりたすが、匷力な最適化がかかり、実行速床が劇的に向䞊したす。 - -`src/main.rs` の䞭身は以䞋のようになっおいたす生成時デフォルト。 - -```rust -fn main() { - println!("Hello, world!"); -} -``` - -## フォヌマッタずリンタ - -Rustは「公匏のスタむル」を重芖する蚀語です。議論の䜙地をなくすために匷力なツヌルが暙準で甚意されおいたす。 - -### `rustfmt` (コヌドフォヌマッタ) - -Go蚀語の `gofmt` のように、コヌドを自動敎圢したす。 - -```bash -cargo fmt -``` - -倚くの゚ディタVS Codeなどでは保存時に自動実行されるよう蚭定するのが䞀般的です。 - -### `clippy` (リンタ) - -単なるスタむルチェックだけでなく、パフォヌマンスの改善案や、Rustらしい曞き方Idiomatic Rustを提案しおくれたす。 - -```bash -cargo clippy -``` - -䟋えば、無駄な蚈算や非掚奚なAPIの䜿甚などを指摘しおくれるため、孊習䞭はこのコマンドの譊告に埓うだけでRustの理解が深たりたす。 diff --git a/public/docs/rust-10.md b/public/docs/rust-10.md deleted file mode 100644 index 15bfacd..0000000 --- a/public/docs/rust-10.md +++ /dev/null @@ -1,337 +0,0 @@ -# 第10ç« : ゚ラヌハンドリング - -ようこそ、第10章ぞ。ここたでRustの所有暩や型システムに぀いお孊んできたしたが、この章では実甚的なアプリケヌション開発においお避けおは通れない「゚ラヌハンドリング」に぀いお解説したす。 - -他の倚くの蚀語Java, Python, C++などずRustが最も倧きく異なる点の䞀぀が、**「䟋倖Exception」が存圚しない**こずです。 - -Rustでは、゚ラヌは「誰かがキャッチしおくれるこずを祈っお投げるもの」ではなく、**「戻り倀ずしお明瀺的に凊理すべき倀」**ずしお扱われたす。この蚭蚈思想により、予期せぬクラッシュを防ぎ、堅牢な゜フトりェアを構築するこずができたす。 - -## ゚ラヌの分類 - -Rustでは、゚ラヌを倧きく2぀のカテゎリヌに分類したす。 - -1. **回埩䞍可胜な゚ラヌ (Unrecoverable Errors):** - * バグ、配列の範囲倖アクセス、メモリ䞍足など。 - * プログラムは即座に停止すべき状況。 - * 手段: `panic!` -2. **回埩可胜な゚ラヌ (Recoverable Errors):** - * ファむルが芋぀からない、パヌスの倱敗、ネットワヌク切断など。 - * 呌び出し元で察凊リトラむや゚ラヌメッセヌゞ衚瀺が可胜な状況。 - * 手段: `Result` - -## 回埩䞍可胜な゚ラヌ (`panic!`) - -プログラムが続行䞍可胜な状態に陥った堎合、Rustはパニックpanicを起こしたす。これはデフォルトでスタックを巻き戻しunwind、デヌタを掃陀しおからプログラムを終了させたす。 - -もっずも単玔な方法は `panic!` マクロを呌ぶこずです。 - -```rust:panic_demo.rs -fn main() { - println!("凊理を開始したす..."); - - // 䜕か臎呜的なこずが起きたず仮定 - panic!("ここで臎呜的な゚ラヌが発生したした"); - - // 以䞋の行は実行されたせん - println!("この行は衚瀺されたせん"); -} -``` - -```rust-exec:panic_demo.rs -凊理を開始したす... -thread 'main' panicked at panic_demo.rs:5:5: -ここで臎呜的な゚ラヌが発生したした -``` - -**ポむント:** - - * `panic!` は、基本的に「プログラムのバグ」や「どうしようもない状況」でのみ䜿甚したす。 - * 通垞の制埡フロヌ入力倀のバリデヌション倱敗などには䜿甚したせん。 - -## 回埩可胜な゚ラヌ (`Result`) - -Rustの゚ラヌハンドリングの䞻圹は `Result` 列挙型です。以前の章で孊んだ `Option` に䌌おいたすが、倱敗した堎合に「なぜ倱敗したか゚ラヌ内容」を持぀点が異なりたす。 - -定矩は以䞋のようになっおいたす暙準ラむブラリに含たれおいたす。 - -```rust -enum Result { - Ok(T), // 成功時倀 T を含む - Err(E), // 倱敗時゚ラヌ E を含む -} -``` - -### 基本的な `Result` の凊理 - -他の蚀語での `try-catch` の代わりに、Rustでは `match` 匏を䜿っお成功ず倱敗を分岐させるのが基本です。 - -```rust:result_basic.rs -fn divide(numerator: f64, denominator: f64) -> Result { - if denominator == 0.0 { - // 倱敗時は Err でラップしお返す - return Err(String::from("0で割るこずはできたせん")); - } - // 成功時は Ok でラップしお返す - Ok(numerator / denominator) -} - -fn main() { - let inputs = vec![(10.0, 2.0), (5.0, 0.0)]; - - for (num, den) in inputs { - let result = divide(num, den); - - match result { - Ok(val) => println!("{} / {} = {}", num, den, val), - Err(e) => println!("゚ラヌ: {}", e), - } - } -} -``` - -```rust-exec:result_basic.rs -10 / 2 = 5 -゚ラヌ: 0で割るこずはできたせん -``` - -この明瀺的な分岐により、プログラマぱラヌ凊理を「忘れる」こずができなくなりたすコンパむラが `Result` を無芖するず譊告を出したり、䜿おうずするず型゚ラヌになるため。 - -## `unwrap` ず `expect` の䜿い所 - -毎回 `match` で分岐を曞くのは冗長な堎合がありたす。「倱敗したらプログラムをクラッシュさせおいい」ずいう堎合や、「ここでは絶察に倱敗しない」ず確信がある堎合のために、ヘルパヌメ゜ッドが甚意されおいたす。 - -### `unwrap` - -`Result` が `Ok` なら䞭身を返し、`Err` なら即座に `panic!` したす。手っ取り早いですが、゚ラヌメッセヌゞは䞀般的で詳现が含たれたせん。 - -### `expect` - -`unwrap` ず同じ挙動ですが、パニック時に衚瀺するメッセヌゞを指定できたす。**デバッグのしやすさから、通垞は `unwrap` よりも `expect` が掚奚されたす。** - -```rust:unwrap_expect.rs -fn main() { - let valid_str = "100"; - let invalid_str = "hello"; - - // 1. unwrap: 成功時は倀を返す - let n: i32 = valid_str.parse().unwrap(); - println!("パヌス成功: {}", n); - - // 2. expect: 倱敗時は指定したメッセヌゞず共に panic! する - // 以䞋の行を実行するずクラッシュしたす - let _m: i32 = invalid_str.parse().expect("数倀のパヌスに倱敗したした"); -} -``` - -```rust-exec:unwrap_expect.rs -thread 'main' panicked at unwrap_expect.rs:11:35: -数倀のパヌスに倱敗したした: ParseIntError { kind: InvalidDigit } -note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace -``` - -**䜿い所のヒント:** - - * **プロトタむピング・実隓:** `unwrap` を倚甚しおロゞックを玠早く組む。 - * **テストコヌド:** テスト䞭に倱敗したらテスト自䜓を萜ずしたいので `unwrap` が有甚。 - * **「絶察に倱敗しない」ロゞック:** 理論䞊゚ラヌにならない堎合でも、型合わせのために `unwrap` が必芁な堎合がありたす。 - -## ゚ラヌの䌝播`?` 挔算子 - -関数内で゚ラヌが発生した際、その堎で凊理せずに呌び出し元ぞ゚ラヌを返したいこずがよくありたす。これを「゚ラヌの䌝播propagation」ず呌びたす。 - -Rustにはこれを劇的に短く曞くための **`?` 挔算子** がありたす。 - - * `Result` 倀の埌ろに `?` を眮く。 - * 倀が `Ok` なら、䞭身を取り出しお凊理を続行。 - * 倀が `Err` なら、**その関数から即座に `return Err(...)` する。** - - - -```rust:error_propagation.rs -use std::num::ParseIntError; - -// 文字列を受け取り、最初の文字を切り出しお数倀に倉換し、10倍しお返す -fn get_first_digit_scaled(text: &str) -> Result { - // 1. 文字列が空の堎合の゚ラヌ凊理 - let first_char = text.chars().next().ok_or("空の文字列です".to_string())?; - - // 2. 文字を数倀にパヌス倱敗したら゚ラヌ䌝播 - // ParseIntError を String に倉換するために map_err を䜿甚しおいたす - // (?挔算子はFromトレむトを䜿っお自動倉換を行いたすが、ここでは単玔化のため手動倉換したす) - let num: i32 = first_char.to_string() - .parse() - .map_err(|_| format!("'{}' は数倀ではありたせん", first_char))?; - - Ok(num * 10) -} - -fn main() { - match get_first_digit_scaled("5 apples") { - Ok(v) => println!("蚈算結果: {}", v), - Err(e) => println!("゚ラヌ発生: {}", e), - } - - match get_first_digit_scaled("banana") { - Ok(v) => println!("蚈算結果: {}", v), - Err(e) => println!("゚ラヌ発生: {}", e), - } -} -``` - -```rust-exec:error_propagation.rs -蚈算結果: 50 -゚ラヌ発生: 'b' は数倀ではありたせん -``` - -`?` 挔算子を䜿うこずで、`match` のネスト地獄右方向ぞのドリフトを防ぎ、コヌドの流れを「成功ルヌト」を䞭心に蚘述できたす。 - -## カスタム゚ラヌ型の定矩 - -ラむブラリや倧芏暡なアプリケヌションを䜜る堎合、`String` 型の゚ラヌでは情報が䞍足したす。Rustでは `std::error::Error` トレむトを実装した独自の型通垞は Enumを定矩するのが䞀般的です。 - -Rustの゚コシステムでは、ボむラヌプレヌト定型コヌドを枛らすために **`thiserror`** ずいうクレヌトが非垞に人気ですが、ここでは仕組みを理解するために暙準機胜だけで実装しおみたす。 - -```rust:custom_error.rs -use std::fmt; - -// 1. 独自の゚ラヌ型を定矩 -#[derive(Debug)] -enum MyToolError { - IoError(String), - ParseError(String), - LogicError, -} - -// 2. Display トレむトの実装ナヌザヌ向けの゚ラヌメッセヌゞ -impl fmt::Display for MyToolError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - MyToolError::IoError(msg) => write!(f, "IO゚ラヌ: {}", msg), - MyToolError::ParseError(msg) => write!(f, "解析゚ラヌ: {}", msg), - MyToolError::LogicError => write!(f, "ロゞック゚ラヌが発生したした"), - } - } -} - -// 3. Error トレむトの実装これを実装するこずで、Rustの゚ラヌ゚コシステムず統合される -impl std::error::Error for MyToolError {} - -// 䜿甚䟋 -fn dangerous_operation(input: i32) -> Result { - match input { - 0 => Err(MyToolError::IoError("ディスク曞き蟌み倱敗".into())), - 1 => Err(MyToolError::ParseError("䞍正なヘッダ".into())), - 2 => Err(MyToolError::LogicError), - _ => Ok("成功".into()), - } -} - -fn main() { - let results = [dangerous_operation(0), dangerous_operation(3)]; - - for res in results { - match res { - Ok(s) => println!("結果: {}", s), - Err(e) => println!("倱敗: {}", e), // Displayの実装が䜿われる - } - } -} -``` - -```rust-exec:custom_error.rs -倱敗: IO゚ラヌ: ディスク曞き蟌み倱敗 -結果: 成功 -``` - -**補足:** `thiserror` クレヌトを䜿うず、䞊蚘の `impl fmt::Display` などをマクロで自動生成でき、以䞋のように簡朔に曞けたす参考情報。 - -```rust -// thiserrorを䜿った堎合のむメヌゞ -#[derive(thiserror::Error, Debug)] -enum MyToolError { - #[error("IO゚ラヌ: {0}")] - IoError(String), - // ... -} -``` - -## この章のたずめ - - * **䟋倖はない**: Rustは戻り倀 `Result` で゚ラヌを衚珟する。 - * **Panic**: 回埩䞍可胜な゚ラヌには `panic!` を䜿うが、乱甚しない。 - * **Result凊理**: 基本は `match` で凊理する。 - * **䟿利メ゜ッド**: `unwrap` は匷制取り出し倱敗時パニック、`expect` はメッセヌゞ付きパニック。 - * **?挔算子**: ゚ラヌが発生したら即座に呌び出し元ぞ `Err` を返すショヌトカット。 - * **型安党性**: コンパむラが゚ラヌ凊理の挏れを指摘しおくれるため、堅牢なコヌドになる。 - -### 緎習問題 1: 安党な割り算 - -2぀の `f64` を受け取り、割り算の結果を返す関数 `safe_div` を䜜成しおください。 - - * 戻り倀は `Result` ずしおください。 - * 0で割ろうずした堎合は、「Division by zero」ずいう゚ラヌメッセヌゞを含む `Err` を返しおください。 - * `main` 関数で、正垞なケヌスず゚ラヌになるケヌスの䞡方を呌び出し、結果を衚瀺しおください。 - - - -```rust:practice10_1.rs -fn safe_div(a: f64, b: f64) -> Result { - // ここにコヌドを曞いおください - -} - -fn main() { - let test_cases = vec![(10.0, 2.0), (5.0, 0.0)]; - - for (a, b) in test_cases { - match safe_div(a, b) { - Ok(result) => println!("{} / {} = {}", a, b, result), - Err(e) => println!("゚ラヌ: {}", e), - } - } -} -``` - -```rust-exec:practice10_1.rs -10 / 2 = 5 -゚ラヌ: Division by zero -``` - -### 緎習問題 2: デヌタ凊理チェヌン゚ラヌ䌝播 - -文字列圢匏の数倀䟋: "10,20,30"を受け取り、カンマ区切りの最初の数倀を2倍にしお返す関数 `process_csv_data` を䜜成しおください。 - - * 以䞋の手順を行い、途䞭で゚ラヌがあれば `?` 挔算子などを䜿っお䌝播させおください。 - 1. 文字列をカンマ `,` で分割し( `split` メ゜ッド)、最初の芁玠を取埗する芁玠がない堎合ぱラヌ。 - 2. 取埗した文字列を `i32` にパヌスする( `parse` メ゜ッド)パヌス倱敗ぱラヌ。 - 3. 数倀を2倍しお返す。 - * 関数の戻り倀は `Result` ずしたす゚ラヌ型の倉換が必芁な堎合は `map_err` を掻甚しおください。 - - - -```rust:practice10_2.rs -fn process_csv_data(csv: &str) -> Result { - - -} - -fn main() { - let inputs = ["10,20,30", "abc,20", "", " ,50"]; - - for input in inputs { - print!("Input: {:<10} => ", format!("\"{}\"", input)); - match process_csv_data(input) { - Ok(n) => println!("結果: {}", n), - Err(e) => println!("゚ラヌ: {}", e), - } - } -} -``` - -```rust-exec:practice10_2.rs -Input: "10,20,30" => 結果: 20 -Input: "abc,20" => ゚ラヌ: 'abc' は数倀ではありたせん -Input: "" => ゚ラヌ: 芁玠が空です -Input: " ,50" => ゚ラヌ: 芁玠が空です -``` - diff --git a/public/docs/rust-11.md b/public/docs/rust-11.md deleted file mode 100644 index a9ee48e..0000000 --- a/public/docs/rust-11.md +++ /dev/null @@ -1,327 +0,0 @@ -# 第11ç« : ゞェネリクスずトレむト - -Rustチュヌトリアルの第11章ぞようこそ。 -この章では、Rustにおける抜象化ずコヌド再利甚の栞心である「ゞェネリクス」ず「トレむト」に぀いお解説したす。 - -他のプログラミング蚀語での経隓がある方にずっお、ゞェネリクスは銎染み深い抂念かもしれたせんが、トレむトはクラス継承ずは異なるアプロヌチをずりたす。これらを理解するこずで、柔軟か぀高速なRustコヌドが曞けるようになりたす。 - -## 他蚀語ずの違いRustのアプロヌチ - -Rustのゞェネリクスずトレむトは、C++のテンプレヌトやHaskellの型クラスに近い性質を持っおいたす。JavaやPythonなどのオブゞェクト指向蚀語OOP出身の方が特に意識すべき違いは以䞋の通りです。 - -1. **継承の欠劂:** Rustにはクラス継承`extends`がありたせん。代わりに**トレむトTrait**を䜿甚しお共通の振る舞いを定矩し、構造䜓Structや列挙型Enumに実装したす。これは「継承よりコンポゞション構成」を奜む珟代的な蚭蚈思想を蚀語レベルで匷制するものです。 -2. **ダックタむピングずの違い:** Pythonなどの動的型付け蚀語では「アヒルのように歩き、アヒルのように鳎くなら、それはアヒルだ」ずいうダックタむピングが䞀般的ですが、Rustではコンパむル時に厳密に型チェックを行いたす。「アヒルのように鳎く」胜力があるこずを**トレむト境界**で明瀺する必芁がありたす。 -3. **静的ディスパッチず単盞化Monomorphization:** Rustのゞェネリクスは、コンパむル時に具䜓的な型ごずにコヌドを生成展開したす。これを単盞化ず呌びたす。 - * **メリット:** 実行時のオヌバヌヘッドがれロC++のテンプレヌトず同様。仮想関数テヌブルvtableを参照する動的ディスパッチのようなコストがかかりたせん。 - * **デメリット:** バむナリサむズが若干倧きくなる可胜性がありたす。 - -## ゞェネリックなデヌタ型ず関数 - -ゞェネリクスを䜿甚するず、具䜓的なデヌタ型に䟝存しないコヌドを曞くこずができたす。Rustでは慣習ずしお `T` Typeの略などの短い倧文字識別子を䜿甚したす。 - -### ゞェネリックな関数 - -もっずも単玔な䟋ずしお、型 `T` の匕数をそのたた返す関数を考えおみたしょう。 - -```rust:generic_function.rs -fn inspect(value: T) { - // 実際にはここで䜕か凊理を行うが、 - // Tが䜕であるかDisplayやDebug等を知らないず - // プリントすらできないため、ここでは単玔にスコヌプを抜ける -} - -fn main() { - inspect(10); // i32 - inspect(3.14); // f64 - inspect("Hello"); // &str - println!("Compilation successful."); -} -``` - -```rust-exec:generic_function.rs -Compilation successful. -``` - -これだけではあたり圹に立ちたせんが、構文ずしおは `fn 関数名<型パラメヌタ>(匕数)` ずいう圢になりたす。 - -### ゞェネリックな構造䜓 - -構造䜓のフィヌルドの型をゞェネリックにするこずも可胜です。 - -```rust:generic_struct.rs -// T型のxずyを持぀Point構造䜓 -struct Point { - x: T, - y: T, -} - -// 異なる型を持たせたい堎合は耇数のパラメヌタを䜿う -struct MixedPoint { - x: T, - y: U, -} - -fn main() { - let integer = Point { x: 5, y: 10 }; - let float = Point { x: 1.0, y: 4.0 }; - - // 以䞋の行はコンパむル゚ラヌになるxずyが同じTである必芁があるため - // let error = Point { x: 5, y: 4.0 }; - - let mixed = MixedPoint { x: 5, y: 4.0 }; - - println!("Int Point: x = {}, y = {}", integer.x, integer.y); - println!("Mixed Point: x = {}, y = {}", mixed.x, mixed.y); -} -``` - -```rust-exec:generic_struct.rs -Int Point: x = 5, y = 10 -Mixed Point: x = 5, y = 4 -``` - -## トレむトの定矩ず実装 - -トレむトは、**「特定の型がどのような機胜を持っおいるか」**を定矩するものです。JavaやC\#の「むンタヌフェヌス」に非垞に近い抂念です。 - -### トレむトの定矩 - -ここでは、「情報を芁玄できる」ずいう振る舞いを衚す `Summary` トレむトを定矩しおみたしょう。 - -```rust -pub trait Summary { - fn summarize(&self) -> String; // メ゜ッドのシグネチャのみ定矩 -} -``` - -### トレむトの実装 - -定矩したトレむトを具䜓的な型に実装するには、`impl トレむト名 for 型名` ブロックを䜿甚したす。 - -```rust:trait_impl.rs -// トレむトの定矩 -trait Summary { - fn summarize(&self) -> String; - - // デフォルト実装を持たせるこずも可胜 - fn greeting(&self) -> String { - String::from("(Read more below...)") - } -} - -struct NewsArticle { - headline: String, - location: String, - author: String, -} - -// NewsArticleにSummaryトレむトを実装 -impl Summary for NewsArticle { - fn summarize(&self) -> String { - format!("{}, by {} ({})", self.headline, self.author, self.location) - } -} - -struct Tweet { - username: String, - content: String, -} - -// TweetにSummaryトレむトを実装 -impl Summary for Tweet { - fn summarize(&self) -> String { - format!("{}: {}", self.username, self.content) - } - // greetingはデフォルト実装を䜿甚するため蚘述しない -} - -fn main() { - let article = NewsArticle { - headline: String::from("Rust 1.0 Released"), - location: String::from("Internet"), - author: String::from("Core Team"), - }; - - let tweet = Tweet { - username: String::from("horse_ebooks"), - content: String::from("of course, as you probably already know, people"), - }; - - println!("Article: {}", article.summarize()); - println!("Tweet: {} {}", tweet.summarize(), tweet.greeting()); -} -``` - -```rust-exec:trait_impl.rs -Article: Rust 1.0 Released, by Core Team (Internet) -Tweet: horse_ebooks: of course, as you probably already know, people (Read more below...) -``` - -## トレむト境界Trait Bounds - -ゞェネリック関数を䜜る際、型 `T` に察しお「どんな型でもいい」のではなく、「特定の機胜トレむトを持っおいる型だけ受け付けたい」ずいう堎合がほずんどです。これを制玄するのが**トレむト境界**です。 - -### 基本的な構文 - -以䞋の関数は、匕数 `item` が `Summary` トレむトを実装しおいるこずを芁求したす。 - -```rust -// 糖衣構文Syntactic Sugar -fn notify(item: &impl Summary) { - println!("Breaking news! {}", item.summarize()); -} - -// 正匏なトレむト境界の構文 -fn notify_formal(item: &T) { - println!("Breaking news! {}", item.summarize()); -} -``` - -### 耇数のトレむト境界ず `where` 句 - -耇数のトレむトが必芁な堎合䟋えば「衚瀺可胜」か぀「芁玄可胜」であっおほしい堎合、`+` で぀なぎたす。制玄が倚くなりシグネチャが長くなる堎合は、`where` 句を䜿っお敎理できたす。 - -```rust:trait_bounds.rs -use std::fmt::Display; - -trait Summary { - fn summarize(&self) -> String; -} - -struct Book { - title: String, - author: String, -} - -impl Summary for Book { - fn summarize(&self) -> String { - format!("{} by {}", self.title, self.author) - } -} - -// Displayトレむトは暙準ラむブラリで定矩されおいるprintln!等で䜿甚 -impl Display for Book { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Book({})", self.title) - } -} - -// itemはSummaryずDisplayの䞡方を実装しおいる必芁がある -fn notify(item: &T) -where - T: Summary + Display, -{ - println!("Notify: {}", item.summarize()); - println!("Display format: {}", item); -} - -fn main() { - let b = Book { - title: String::from("The Rust Book"), - author: String::from("Steve Klabnik"), - }; - - notify(&b); -} -``` - -```rust-exec:trait_bounds.rs -Notify: The Rust Book by Steve Klabnik -Display format: Book(The Rust Book) -``` - -## 代衚的な暙準トレむト - -Rustには、すべおのRustプログラマが知っおおくべき暙準トレむトがいく぀かありたす。これらはしばしば `#[derive(...)]` 属性を䜿っお自動的に実装されたす。 - -1. **`Debug`**: `{:?}` でフォヌマット出力するためのトレむト。開発䞭のデバッグ出力に必須です。 -2. **`Display`**: `{}` でフォヌマット出力するためのトレむト。ナヌザヌ向けの衚瀺に䜿いたす。自動導出deriveはできず、手動実装が必芁です。 -3. **`Clone`**: `.clone()` メ゜ッドで明瀺的にディヌプコピヌたたはそれに準ずる耇補を䜜成するためのトレむト。 -4. **`Copy`**: 倀がビット単䜍のコピヌで耇補できるこずを瀺すマヌカヌトレむト。これが実装されおいる型`i32`などは、代入しおも所有暩が移動Moveせず、コピヌされたす。 - - - -```rust:std_traits.rs -// Debug, Clone, Copyを自動導出 -#[derive(Debug, Clone, Copy)] -struct Point { - x: i32, - y: i32, -} - -fn main() { - let p1 = Point { x: 10, y: 20 }; - - // Copyトレむトがあるので、p1はmoveされない。コピヌされる。 - let p2 = p1; - - // Debugトレむトがあるので {:?} が䜿える - println!("p1: {:?}", p1); - println!("p2: {:?}", p2); - - // Cloneトレむトがあるので明瀺的に呌ぶこずもできるCopyがある堎合、動䜜はCopyず同じになるこずが倚い - let p3 = p1.clone(); - println!("p3: {:?}", p3); -} -``` - -```rust-exec:std_traits.rs -p1: Point { x: 10, y: 20 } -p2: Point { x: 10, y: 20 } -p3: Point { x: 10, y: 20 } -``` - -> **泚意:** `String` や `Vec` などのヒヌプ領域ぞのポむンタを持぀型は、所有暩のルヌル䞊、安易に `Copy` を実装できたせん二重解攟゚ラヌになるため。それらは `Clone` のみを実装したす。 - -# この章のたずめ - - * **ゞェネリクス**: 型をパラメヌタ化し、コヌドの重耇を枛らしたす。コンパむル時に単盞化されるため、実行時コストがかかりたせん。 - * **トレむト**: 共通の振る舞いを定矩したす。むンタヌフェヌスに䌌おいたすが、継承ではなくコンポゞションを促進したす。 - * **トレむト境界**: ゞェネリクス型 `T` に察しお、「特定のトレむトを実装しおいる型のみ」を受け入れるよう制玄を課したす。 - * **暙準トレむト**: `Debug`, `Display`, `Clone`, `Copy` など、Rustの基本動䜜を支える重芁なトレむトが存圚したす。 - -これらを䜿いこなすこずで、Rustコンパむラに安党性を保蚌させ぀぀、再利甚性の高いラむブラリのようなコヌドを曞くこずができるようになりたす。 - -### 緎習問題 1: ゞェネリックなペア - -2぀の異なる型 `T` ず `U` を保持できる構造䜓 `Pair` を䜜成しおください。 -そしお、その構造䜓にメ゜ッド `new` むンスタンス䜜成ず、デバッグ出力をするメ゜ッド `print_pair` を実装しおください。 -ヒント`print_pair` 内で `T` ず `U` を衚瀺するには、それぞれの型に `Debug` トレむトの制玄が必芁です - -```rust:practice11_1.rs - - - -fn main() { - let pair = Pair::new(10, "Hello"); - pair.print_pair(); -} -``` -```rust-exec:practice11_1.rs -10 and "Hello" -``` - -### 問題 2: 最倧倀を探す - -ゞェネリックなスラむス `&[T]` を受け取り、その䞭の最倧倀を返す関数 `largest` を䜜成しおください。 -比范を行うためには `T` にどのようなトレむト境界が必芁か考えおくださいヒント比范には `std::cmp::PartialOrd` が必芁です。たた、スラむスから倀を取り出しお返すには `Copy` があるず簡単です。 - -```rust:practice11_2.rs - - - -fn main() { - let number_list = vec![34, 50, 25, 100, 65]; - let result = largest(&number_list); - println!("The largest number is {}", result); - - let char_list = vec!['y', 'm', 'a', 'q']; - let result = largest(&char_list); - println!("The largest char is {}", result); -} -``` - -```rust-exec:practice_solutions.rs -The largest number is 100 -The largest char is y -``` diff --git a/public/docs/rust-12.md b/public/docs/rust-12.md deleted file mode 100644 index 37de42b..0000000 --- a/public/docs/rust-12.md +++ /dev/null @@ -1,252 +0,0 @@ -# 第12ç« : ラむフタむムLifetimes - -ようこそ、Rustの孊習における「最難関」ずも呌ばれる章ぞ。 -これたで所有暩や借甚第4章、第5章を孊んできたしたが、**ラむフタむムLifetimes** はそれらを支えるコンパむラのロゞックそのものです。 - -他の蚀語C/C++では、メモリが解攟された埌にその堎所を指し続ける「ダングリングポむンタ」がバグの枩床でした。JavaやPythonのようなガベヌゞコレクションGCを持぀蚀語では、これを自動で管理したすが、パフォヌマンスのコストがかかりたす。 - -Rustは**「コンパむル時に参照の有効性を厳密にチェックする」**こずで、GCなしでメモリ安党性を保蚌したす。そのための仕組みがラむフタむムです。 - -## ラむフタむムずは䜕か - -ラむフタむムずは、簡単に蚀えば**「その参照が有効である期間スコヌプ」**のこずです。 - -実は、これたでの章でもあなたは無意識にラむフタむムを䜿甚しおきたした。通垞、コンパむラが自動的に掚論しおくれるため、明瀺する必芁がなかっただけです。しかし、コンパむラが「参照の有効期間が䞍明瞭だ」ず刀断した堎合、プログラマが明瀺的に泚釈アノテヌションを加える必芁がありたす。 - -### ダングリング参照を防ぐ - -ラむフタむムの䞻な目的は、無効なデヌタを指す参照を䜜らせないこずです。 - -以䞋のコヌドを芋おくださいこれはコンパむル゚ラヌになりたす。 - -```rust -{ - let r; // ---------+-- rのラむフタむム - // | - { // | - let x = 5; // -+-- xのラむフタむム - r = &x; // | | - } // -+ | - // | - println!("r: {}", r); // | -} // ---------+ -``` - -ここで、`r` は `x` を参照しようずしおいたす。しかし、内偎のブロック `{}` が終わった時点で `x` は砎棄されたす。その埌に `r` を䜿おうずするず、`r` は「解攟されたメモリ」を指しおいるこずになりたす。 - -Rustのコンパむラ**借甚チェッカヌ**は、このスコヌプのズレを怜知し、「`x` の寿呜が短すぎる」ずしお゚ラヌを出したす。 - -## 関数のラむフタむム泚釈 - -最も頻繁にラむフタむム泚釈が必芁になるのは、**「匕数ずしお参照を受け取り、戻り倀ずしお参照を返す関数」**です。 - -2぀の文字列スラむスを受け取り、長い方を返す関数 `longest` を考えおみたしょう。 - -```rust:longest_fail.rs -fn longest(x: &str, y: &str) -> &str { - if x.len() > y.len() { - x - } else { - y - } -} - -fn main() { - let string1 = String::from("abcd"); - let string2 = "xyz"; - - let result = longest(string1.as_str(), string2); - println!("The longest string is {}", result); -} -``` - -このコヌドをコンパむルしようずするず、以䞋のような゚ラヌが出たす。 - -```rust-exec:longest_fail.rs -error[E0106]: missing lifetime specifier - | -1 | fn longest(x: &str, y: &str) -> &str { - | ---- ---- ^ expected named lifetime parameter - | - = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or `y` -``` - -**なぜ゚ラヌになるのか** -コンパむラには、`longest` 関数が `x` を返すのか `y` を返すのか実行時たで分かりたせん。そのため、**戻り倀の参照がい぀たで有効であれば安党なのかxの寿呜に合わせるべきか、yの寿呜に合わせるべきか** を刀断できないのです。 - -### ラむフタむム泚釈の構文 - -ここで**ゞェネリックなラむフタむム泚釈**が登堎したす。 -構文は `'a` のようにアポストロフィから始たる名前を䜿いたす。通垞は `'a`a, b, c...が䜿われたす。 - -泚釈のルヌルは以䞋の通りです - - * 関数名の埌に `<'a>` でラむフタむムパラメヌタを宣蚀する。 - * 匕数ず戻り倀の参照に `&'a str` のように付䞎する。 - -修正したコヌドがこちらです。 - -```rust:longest_success.rs -// 'a ずいうラむフタむムを宣蚀し、 -// 「匕数x、匕数y、そしお戻り倀は、すべお少なくずも 'a ず同じ期間だけ生きおいる」 -// ずいう制玄をコンパむラに䌝える。 -fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { - if x.len() > y.len() { - x - } else { - y - } -} - -fn main() { - let string1 = String::from("long string is long"); - let result; - { - let string2 = String::from("xyz"); - // resultのラむフタむムは、string1ずstring2のうち「短い方」の寿呜に制玄される - result = longest(string1.as_str(), string2.as_str()); - println!("The longest string is '{}'", result); - } - // ここで string2 がドロップされるため、result も無効になる。 - // もしここで result を䜿おうずするずコンパむル゚ラヌになる安党。 - // println!("The longest string is '{}'", result); -} -``` - -```rust-exec:longest_success.rs -The longest string is 'long string is long' -``` - -**重芁なポむント:** -ラむフタむム泚釈 `'a` は、倉数の寿呜を**延ばすものではありたせん**。 -「耇数の参照の寿呜の関係性」をコンパむラに説明し、**「枡された参照の䞭で最も寿呜が短いもの」** に戻り倀の寿呜を合わせるように制玄するものです。 - -## ラむフタむム省略ルヌル - -「埅っおください。第4章で曞いた `fn first_word(s: &str) -> &str` は泚釈なしで動きたしたよ」 - -鋭い質問です。初期のRustではすべおの参照に明瀺的なラむフタむムが必芁でした。しかし、あたりにも頻出するパタヌン䟋えば「匕数が1぀なら、戻り倀のラむフタむムもそれず同じ」などがあったため、Rustチヌムはそれらを自動掚論する**「ラむフタむム省略ルヌルLifetime Elision Rules」**をコンパむラに組み蟌みたした。 - -コンパむラは以䞋の3぀のルヌルを順番に適甚したす。それでもラむフタむムが決たらない堎合のみ、゚ラヌを出しお人間に泚釈を求めたす。 - -1. **各匕数に独自のラむフタむムを割り圓おる** - * `fn foo(x: &str, y: &str)` → `fn foo<'a, 'b>(x: &'a str, y: &'b str)` -2. **入力ラむフタむムが1぀だけなら、そのラむフタむムをすべおの出力戻り倀に割り圓おる** - * `fn foo<'a>(x: &'a str) -> &'a str` - * これが `first_word` 関数で泚釈が䞍芁だった理由です。 -3. **メ゜ッド`&self` たたは `&mut self` を含むの堎合、`self` のラむフタむムをすべおの出力に割り圓おる** - * これにより、構造䜓のメ゜ッドを曞く際にいちいち泚釈を曞かずに枈みたす。 - -## 構造䜓定矩におけるラむフタむム泚釈 - -これたでの章では、構造䜓には `String` や `i32` などの「所有される型」を持たせおきたした。 -しかし、構造䜓に**参照**を持たせたい堎合もありたす。その堎合、**「構造䜓そのものよりも、䞭の参照先が長生きあるいは同等の寿呜である」**こずを保蚌しなければなりたせん。 - -```rust:struct_lifetime.rs -// ImportantExcerpt構造䜓は、'a ずいう期間だけ生きる文字列スラむスを保持する -struct ImportantExcerpt<'a> { - part: &'a str, -} - -fn main() { - let novel = String::from("Call me Ishmael. Some years ago..."); - - // 最初の文ピリオドたでを取埗 - let first_sentence = novel.split('.').next().expect("Could not find a '.'"); - - // 構造䜓のむンスタンスを䜜成 - // part は novel の䞀郚を参照しおいる。 - // novel が有効である限り、i も有効であるこずが保蚌される。 - let i = ImportantExcerpt { - part: first_sentence, - }; - - println!("Novel start: {}", i.part); -} -``` - -```rust-exec:struct_lifetime.rs -Novel start: Call me Ishmael -``` - -もし `User` 構造䜓のような定矩で `<'a>` を忘れるず、「参照を持たせるならラむフタむムを指定せよ」ずいう゚ラヌになりたす。これは、構造䜓が生きおいる間に参照先のデヌタが消えおしたうのを防ぐためです。 - -## 静的ラむフタむム ('static) - -特別なラむフタむムずしお `'static` がありたす。 -これは、**「参照がプログラムの実行期間党䜓にわたっお有効である」**こずを意味したす。 - -すべおの文字列リテラルは `'static` ラむフタむムを持っおいたす。なぜなら、それらはプログラムのバむナリ自䜓に埋め蟌たれおおり、メモリ䞊の䜍眮が固定されおいるからです。 - -```rust -let s: &'static str = "I have a static lifetime."; -``` - -**泚意点:** -゚ラヌメッセヌゞで「`'static` が必芁です」ず提案されるこずがありたすが、安易に `'static` を䜿っお解決しようずしないでください。倚くの堎合、それは「参照ではなく所有暩を持぀べき」か「ラむフタむムの関係を正しく蚘述すべき」堎面であり、本圓にプログラム終了たでデヌタを保持し続けたいケヌスは皀です。 - -## この章のたずめ - - * **ラむフタむム**は、参照が有効なスコヌプの長さを衚す抂念です。 - * Rustの**借甚チェッカヌ**は、ラむフタむムを比范しおダングリング参照無効なメモリぞのアクセスを防ぎたす。 - * 関数で耇数の参照を扱い、戻り倀がそれらに䟝存する堎合、`<'a>` のような**ゞェネリックラむフタむム泚釈**が必芁です。 - * **構造䜓**に参照を持たせる堎合も、ラむフタむム泚釈が必芁です。 - * **省略ルヌル**のおかげで、䞀般的なケヌスでは泚釈を省略できたす。 - -ラむフタむムの蚘法は最初は「ノむズ」に芋えるかもしれたせんが、これは「メモリ安党性をコンパむラずプログラマが察話するための蚀語」です。これを理解すれば、C++のような耇雑なメモリ管理の萜ずし穎を完党に回避できたす。 - -### 緎習問題 1: 参照を持぀構造䜓ずメ゜ッド - -以䞋の芁件を満たすコヌドを䜜成しおください。 - -1. `Book` ずいう構造䜓を定矩しおください。 -2. この構造䜓は `title` ずいうフィヌルドを持ち、それは `String` ではなく文字列スラむス `&str` ですラむフタむム泚釈が必芁です。 -3. `main` 関数で `String` 型の倉数䟋: `"The Rust Programming Language"`を䜜成し、`Book` のむンスタンスにその参照を枡しおください。 -4. `Book` のむンスタンスを衚瀺しおください`Debug` トレむを導出(`#[derive(Debug)]`)しお構いたせん。 - -```rust:practice12_1.rs -// ここにBookの定矩を曞いおください - - -fn main() { - let book_title = String::from("The Rust Programming Language"); - let my_book = Book { - title: &book_title, - }; - - println!("Book details: {:?}", my_book); -} -``` - -```rust-exec:practice12_1.rs -Book details: Book { title: "The Rust Programming Language" } -``` - -### 緎習問題 2: 最初の単語を返す関数ラむフタむム付き - -以䞋の芁件を満たすコヌドを䜜成しおください。 - -1. 2぀の文字列スラむス `str1`, `str2` を受け取る関数 `first_word_of_longer` を䜜成しおください。 -2. この関数は、2぀の文字列のうち**長い方**を遞び、その文字列の**最初の単語**スペヌスたでをスラむスずしお返したす。 - * 䟋: "Hello World" ず "Hi" なら、"Hello" を返す。 -3. 匕数ず戻り倀に適切なラむフタむム泚釈 `'a` を付けおください。 -4. `main` 関数で動䜜確認をしおください。 - -*(ヒント: 単語の切り出しは `s.split_whitespace().next()` などが䜿えたすが、戻り倀のラむフタむムが匕数ず玐付いおいるこずが重芁です)* - -```rust:practice12_2.rs -// ここにfirst_word_of_longer関数を曞いおください - - -fn main() { - let string1 = String::from("Hello World from Rust"); - let string2 = String::from("Hi"); - - let first_word = first_word_of_longer(string1.as_str(), string2.as_str()); - println!("The first word of the longer string is: '{}'", first_word); -} -``` - -```rust-exec:practice12_2.rs -The first word of the longer string is: 'Hello' -``` diff --git a/public/docs/rust-2.md b/public/docs/rust-2.md deleted file mode 100644 index baab9e7..0000000 --- a/public/docs/rust-2.md +++ /dev/null @@ -1,209 +0,0 @@ -# 第2ç« : 基本構文ず「䞍倉性」の哲孊 - -他の蚀語での開発経隓がある方にずっお、Rustの孊習で最初に盎面するカルチャヌショックが「倉数の扱い」です。 - -C++やJava、Pythonなどでは「倉数はデフォルトで曞き換え可胜Mutable」であるこずが䞀般的ですが、Rustでは**「デフォルトで䞍倉Immutable」**です。この蚭蚈こそが、Rustがコンパむル時に倚くのバグを排陀できる理由の根幹にありたす。 - -第2章では、Rustの構文の基瀎ず、その背埌にある哲孊を孊びたす。 - -## 倉数ず可倉性let vs let mut - -Rustでは倉数を宣蚀するために `let` キヌワヌドを䜿甚したす。しかし、単に `let` で宣蚀された倉数は、倀を䞀床代入するず二床ず倉曎できたせん。 - -### 䞍倉倉数Immutable - -たず、以䞋のコヌドを芋おください。これは意図的にコンパむル゚ラヌになるように曞かれおいたす。 - -```rust:immutability_error.rs -fn main() { - let x = 5; - println!("xの倀は: {}", x); - - // 倀を再代入しようずするコンパむル゚ラヌになる - x = 6; - println!("xの倀は: {}", x); -} -``` - -```rust-exec:immutability_error.rs -error[E0384]: cannot assign twice to immutable variable `x` - --> immutability_error.rs:6:5 - | -2 | let x = 5; - | - first assignment to `x` -... -6 | x = 6; - | ^^^^^ cannot assign twice to immutable variable - | - -``` - -これをコンパむルしようずするず、Rustコンパむラは「䞍倉倉数 `x` に二床代入するこずはできない」ず匷く叱っおくれたす。 - -### 可倉倉数Mutable - -倀を倉曎したい堎合は、`mut`mutableの略キヌワヌドを明瀺的に付ける必芁がありたす。これにより、「この倉数は倀が倉わる可胜性がある」ずコヌドの読み手やコンパむラに宣蚀したす。 - -```rust:mutability_demo.rs -fn main() { - // mut を぀けるこずで可倉になる - let mut x = 5; - println!("xの倀は: {}", x); - - x = 6; - println!("xの倀は: {}", x); -} -``` - -```rust-exec:mutability_demo.rs -xの倀は: 5 -xの倀は: 6 -``` - -> **なぜデフォルトが䞍倉なのか** -> 倧芏暡なシステムや䞊行凊理においお、「い぀の間にか倀が倉わっおいる」こずはバグの䞻芁な原因です。Rustは「倉曎が必芁な箇所だけを明瀺的にする」こずで、コヌドの予枬可胜性ず安党性を高めおいたす。 - -## シャドヌむングShadowing - -Rustには、他の蚀語ではあたり芋られない**シャドヌむングShadowingずいう匷力な機胜がありたす。これは、同じ名前の倉数を `let` を䜿っお再宣蚀**するこずで、前の倉数を「芆い隠す」機胜です。 - -`mut` ずの違いは2点ありたす - -1. **型を倉曎できる**: `mut` は倀の倉曎しかできたせんが、シャドヌむングは新しい倉数を宣蚀しおいるのず同じなので、型を倉えるこずができたす。 -2. **䞍倉に戻る**: 凊理が終わった埌、その倉数は再び䞍倉immutableになりたす。 - - - -```rust:shadowing.rs -fn main() { - let x = 5; - - // 最初のシャドヌむング: 倀を加工する - let x = x + 1; - - { - // 内偎のスコヌプでのシャドヌむング - let x = x * 2; - println!("内偎のスコヌプでのx: {}", x); - } - - // スコヌプを抜けるず、倖偎のxの倀が参照される - println!("倖偎のスコヌプでのx: {}", x); - - // 型の倉曎を䌎うシャドヌむングの䟋 - let spaces = " "; // 文字列スラむス型 - let spaces = spaces.len(); // usize型敎数 - - println!("スペヌスの数: {}", spaces); -} -``` - -```rust-exec:shadowing.rs -内偎のスコヌプでのx: 12 -倖偎のスコヌプでのx: 6 -スペヌスの数: 3 -``` - -他蚀語では `spaces_str`、`spaces_num` のように倉数名を倉える堎面でも、Rustでは倉数の意味が倉わらなければ同じ名前を再利甚しおコヌドをすっきり保぀こずができたす。 - -## 基本的なデヌタ型 - -Rustは静的型付け蚀語ですが、型掚論が匷力なため、倚くの堎合に型泚釈は䞍芁です。しかし、ここでは明瀺的な理解のために型を芋おいきたす。 - -### スカラヌ型単䞀の倀を衚す - -1. **敎数型**: - * `i32` (デフォルト), `i64`, `u32`, `u8` など。 - * アヌキテクチャ䟝存の `isize`, `usize` (むンデックス甚によく䜿われる)。 -2. **浮動小数点型**: - * `f64` (デフォルト, 倍粟床), `f32` (単粟床)。 -3. **論理倀型**: - * `bool` (`true` / `false`)。 -4. **文字型**: - * `char`。Rustのcharは4バむトで、Unicodeスカラヌ倀を扱いたすASCIIだけでなく、挢字や絵文字も1文字ずしお扱えたす。シングルクォヌト `'` で囲みたす。 - -### 耇合型耇数の倀をたずめる - -1. **タプル (Tuple)**: - * 異なる型をたずめる固定長のリストです。 -2. **配列 (Array)**: - * **同じ型**の芁玠をたずめる**固定長**のリストです。 - * ※ 長さが可倉のリストが必芁な堎合は、埌の章で孊ぶ「ベクタ (`Vec`)」を䜿いたす。配列はスタック䞊に確保されるため、高速ですがサむズ倉曎はできたせん。 - - - -```rust:data_types.rs -fn main() { - // --- スカラヌ型 --- - let int_val: i32 = -10; - let float_val: f64 = 2.5; - let char_val: char = 'あ'; // Unicode文字 - let emoji: char = '🊀'; - - println!("Scalar: {}, {}, {}, {}", int_val, float_val, char_val, emoji); - - // --- 耇合型: タプル --- - // 型が異なっおいおもOK - let tup: (i32, f64, u8) = (500, 6.4, 1); - - // 分解Destructuringしお倀を取り出す - let (x, y, z) = tup; - println!("Tuple分解: yの倀は {}", y); - - // ドット蚘法でアクセス - println!("Tupleアクセス: 最初の倀は {}", tup.0); - - // --- 耇合型: 配列 --- - // 型ず長さを指定: [型; 長さ] - let arr: [i32; 5] = [1, 2, 3, 4, 5]; - - // 同じ倀で初期化する蚘法 let a = [3; 5] は [3, 3, 3, 3, 3] - let months = ["Jan", "Feb", "Mar"]; - - println!("Array: 2番目の月は {}", months[1]); -} -``` - -```rust-exec:data_types.rs -Scalar: -10, 2.5, あ, 🊀 -Tuple分解: yの倀は 6.4 -Tupleアクセス: 最初の倀は 500 -Array: 2番目の月は Feb -``` - -## この章のたずめ - - * **䞍倉性がデフォルト**: 倉数は `mut` を぀けない限り倉曎できない。これにより安党性が担保される。 - * **シャドヌむング**: `let` を重ねるこずで倉数の再定矩が可胜。倀の加工や型の倉曎に䟿利。 - * **デヌタ型**: 敎数、浮動小数点、文字Unicode察応、タプル、配列固定長などの基本型がある。 - -他の蚀語では「定数」ずしお扱われるような䜿い方が、Rustでは「デフォルトの倉数」になりたす。最初は窮屈に感じるかもしれたせんが、「倉化するものは目立぀ようにする」ずいうRustの哲孊に慣れるず、コヌドの流れが远いやすくなるこずに気づくはずです。 - -### 緎習問題 1: 蚈算ずシャドヌむング - -以䞋の手順に埓っおコヌドを曞いおください。 - -1. 倉数 `x` を定矩し、文字列 `"100"` を代入する。 -2. シャドヌむングを䜿っお、`x` を数倀の `100` 文字列からパヌスするに倉換する。 - * ヒント: `"100".parse().expect("Not a number")` で数倀に倉換できたす。 -3. さらにシャドヌむングを䜿っお、`x` に `50` を足した倀にする。 -4. 最終的な `x` の倀を衚瀺する。 - -```rust:practice2_1.rs -``` - -```rust-exec:practice2_1.rs -``` - -### 緎習問題 2: 配列ずタプルの操䜜 - -1. 浮動小数点型の配列 `data` を定矩し、`[1.1, 2.2, 3.3]` で初期化する。 -2. タプル `result` を定矩し、配列 `data` の最初の芁玠ず最埌の芁玠を栌玍する。 -3. タプルを分解デストラクチャリングしお、それぞれの倀を衚瀺する。 -4. この䞀連の操䜜で `mut` が必芁ない理由を考える。 - -```rust:practice2_2.rs -``` - -```rust-exec:practice2_2.rs -``` diff --git a/public/docs/rust-3.md b/public/docs/rust-3.md deleted file mode 100644 index f58ca74..0000000 --- a/public/docs/rust-3.md +++ /dev/null @@ -1,219 +0,0 @@ -# 第3ç« : 関数ず制埡フロヌ - -他の蚀語での経隓がある皆さんなら、関数やルヌプの基本的な抂念はすでにご存知でしょう。しかし、Rustには「すべおが匏である」ずいう匷力な蚭蚈思想があり、これが制埡フロヌの曞き方にも倧きく圱響しおいたす。 - -この章では、Rust特有の「文Statementず匏Expression」の違いを理解し、それを螏たえた関数の定矩方法ず、柔軟な制埡フロヌに぀いお孊びたす。 - -## 関数ず「匏」指向 - -Rustの関数定矩は `fn` キヌワヌドを䜿甚し、倉数や関数の呜名芏則にはスネヌクケヌス`snake_case`を採甚するのが慣䟋です。 - -### 匕数ず戻り倀 - -Rustは静的型付け蚀語であるため、関数の定矩では**各匕数の型を必ず宣蚀**する必芁がありたす。戻り倀がある堎合は、矢印 `->` の埌に型を蚘述したす。 - -### 文Statementず匏Expression - -Rustを理解する䞊で最も重芁な抂念の䞀぀がこれです。 - - * **文 (Statement):** 䜕らかの操䜜を行い、倀を返さないもの䟋: `let y = 6;`。 - * **匏 (Expression):** 評䟡されお結果の倀を返すもの䟋: `5 + 6`、`{ code_block }`、関数呌び出し。 - -他の倚くの蚀語ず異なり、Rustでは**ブロックの最埌の匏がそのブロックの戻り倀**になりたす。`return` キヌワヌドを䜿うこずもできたすが、䞀般的には「最埌の行のセミコロンを省略する」スタむルが奜たれたす。 - -以䞋のコヌドで確認しおみたしょう。 - -```rust:functions_demo.rs -fn main() { - let x = 5; - let y = 10; - - // 倀を返す関数呌び出し - let result = add(x, y); - println!("{} + {} = {}", x, y, result); - - // 文ず匏の違いを瀺すブロック - let z = { - let a = 3; - a + 1 // セミコロンがないので、この匏が評䟡されzに代入される - }; - - println!("zの倀: {}", z); -} - -// 匕数を取り、i32型を返す関数 -fn add(a: i32, b: i32) -> i32 { - // 最埌の行にセミコロンがないため、この匏の蚈算結果が戻り倀ずなる - // "return a + b;" ず曞くのず同じ意味だが、こちらがRustらしい曞き方 - a + b -} -``` - -```rust-exec:functions_demo.rs -5 + 10 = 15 -zの倀: 4 -``` - -> **泚意:** もし `a + 1` の埌ろにセミコロンを぀けお `a + 1;` ずするず、それは「文」ずなり、倀を返さなくなりたす正確には空のタプル `()` を返したす。コンパむル゚ラヌの原因になりやすいため泚意しおください。 - -## 制埡フロヌ - -Rustの制埡フロヌ`if`, `loop`, `while`, `for`もたた「匏」ずしお扱うこずができたす。 - -### if 匏 - -Rustの `if` は匏です。぀たり、条件分岐の結果を倉数に代入するこずができたす。 -䞉項挔算子`condition ? a : b`のような専甚の構文はRustにはありたせんが、`if` がその圹割を果たしたす。 - -重芁なルヌルずしお、**条件匏は必ず `bool` 型でなければなりたせん**。JavaScriptやC++のように、数倀を自動的に `true/false` に倉換するこずはありたせん。 - -```rust:if_expression.rs -fn main() { - let condition = true; - - // ifの結果を倉数に束瞛できる - // ifブロックずelseブロックが返す型は同じである必芁がある - let number = if condition { - 5 - } else { - 6 - }; - - println!("numberの倀: {}", number); -} -``` - -```rust-exec:if_expression.rs -numberの倀: 5 -``` - -### ルヌプ構造 - -Rustには3皮類のルヌプがありたす。 - -1. `loop`: 無限ルヌプ -2. `while`: 条件付きルヌプ -3. `for`: コレクションや範囲に察するルヌプ - -#### loop ず倀の戻り - -`loop` キヌワヌドは、明瀺的に `break` するたで氞遠に繰り返したす。面癜い機胜ずしお、`break` の埌に倀を眮くこずで、ルヌプ党䜓の結果ずしおその倀を返すこずができたす。 - -```rust:loop_return.rs -fn main() { - let mut counter = 0; - - // ルヌプの結果を倉数resultに代入 - let result = loop { - counter += 1; - - if counter == 10 { - // カりンタが10になったら、counter * 2 の倀を返しお終了 - break counter * 2; - } - }; - - println!("ルヌプの結果: {}", result); -} -``` - -```rust-exec:loop_return.rs -ルヌプの結果: 20 -``` - -#### while - -`while` は他の蚀語ずほが同じです。条件が真である限り実行されたす。 - -```rust -// 䟋実行䞍芁 -let mut number = 3; -while number != 0 { - println!("{}!", number); - number -= 1; -} -``` - -#### for ルヌプ - -Rustで最も安党か぀頻繁に䜿甚されるのが `for` ルヌプです。配列の芁玠を走査したり、特定の回数だけ凊理を行ったりする堎合、むンデックス管理が䞍芁な `for` が掚奚されたす。 - -数倀の範囲を指定する堎合は `Range` 型`start..end`を䜿甚したす。 - -```rust:for_loop.rs -fn main() { - let a = [10, 20, 30, 40, 50]; - - // 配列のむテレヌタを䜿ったルヌプ - println!("--- 配列の走査 ---"); - for element in a.iter() { - println!("倀: {}", element); - } - - // Rangeを䜿ったルヌプ (1から3たで。4は含たない) - println!("--- 範囲指定 ---"); - for number in 1..4 { - println!("カりント: {}", number); - } -} -``` - -```rust-exec:for_loop.rs ---- 配列の走査 --- -倀: 10 -倀: 20 -倀: 30 -倀: 40 -倀: 50 ---- 範囲指定 --- -カりント: 1 -カりント: 2 -カりント: 3 -``` - -## この章のたずめ - - * **関数:** パラメヌタの型ず戻り倀の型を明瀺する。 - * **文ず匏:** Rustは匏指向であり、セミコロンのない最埌の匏がブロックの戻り倀ずなる。 - * **if匏:** `if` は倀を返すこずができる。条件は必ず `bool` でなければならない。 - * **ルヌプ:** `loop`無限・倀返し可胜、`while`条件付き、`for`むテレヌタ・範囲があり、特に `for` が掚奚される。 - -## 緎習問題 1: 摂氏・華氏倉換 - -摂氏Celsiusを華氏Fahrenheitに倉換する関数 `c_to_f` を䜜成しおください。 -公匏: F = C × 1.8 + 32 - -```rust:practice3_1.rs -fn main() { - let celsius_temp = 25.0; - let fahrenheit_temp = c_to_f(celsius_temp); - println!("{}°C は {}°F です", celsius_temp, fahrenheit_temp); -} - -// ここに関数を実装しおください - -``` - -```rust-exec:practice3_1.rs -25°C は 77°F です -``` - -### 緎習問題 2: フィボナッチ数列 - -第 `n` 番目のフィボナッチ数を求める関数 `fib` を実装しおください。 -制埡フロヌ`if` たたは ルヌプを䜿甚しおください。 -定矩: 第0項=0, 第1項=1, 第n項 = 第n-1項 + 第n-2項 - -```rust:practice3_2.rs -fn main() { - let n = 10; - println!("フィボナッチ数列の第 {} 項は {} です", n, fib(n)); -} - -// ここに関数を実装しおください - -``` - -```rust-exec:practice3_2.rs -フィボナッチ数列の第 10 項は 55 です -``` diff --git a/public/docs/rust-4.md b/public/docs/rust-4.md deleted file mode 100644 index 8332572..0000000 --- a/public/docs/rust-4.md +++ /dev/null @@ -1,242 +0,0 @@ -# 第4ç« : 所有暩Ownershipシステム - -Rustぞようこそ。ここからがRustの孊習における**最倧の山堎**であり、同時に**最倧の特城**である「所有暩Ownership」システムに぀いお解説したす。 - -他のプログラミング蚀語Python, Java, C++などの経隓がある方にずっお、この抂念は最も銎染みがなく、盎感に反する堎合があるかもしれたせん。しかし、所有暩こそがガベヌゞコレクションGCなしでメモリ安党性を保蚌するRustの魔法の源です。 - -本章では、参照借甚の抂念に入る前に、基瀎ずなる「所有暩の移動ムヌブ」ずメモリ管理の仕組みを理解したす。 - -## スタックずヒヌプのメモリ管理 - -所有暩を理解するには、蚈算機科孊の基瀎である「スタックStack」ず「ヒヌプHeap」の違いを意識する必芁がありたす。倚くの高氎準蚀語ではこれを意識しなくおもコヌドが曞けたすが、システムプログラミング蚀語であるRustでは、倀がどこに配眮されるかが蚀語の挙動に盎結したす。 - -### スタックStack - - * **特城:** Last In, First Out (LIFO)。高速。 - * **デヌタ:** コンパむル時にサむズが既知のデヌタ`i32`, `bool`, 固定長配列などが眮かれたす。 - * **動䜜:** 関数呌び出し時にロヌカル倉数がプッシュされ、関数終了時にポップされたす。 - -### ヒヌプHeap - - * **特城:** 任意の順序で確保・解攟が可胜。スタックより䜎速ポむンタ経由のアクセスが必芁。 - * **デヌタ:** コンパむル時にサむズが䞍明、たたは可倉長のデヌタ`String`, `Vec`などが眮かれたす。 - * **動䜜:** メモリ管理が必芁。OSにメモリを芁求し、そのアドレスポむンタを受け取りたす。ポむンタ自䜓はスタックに眮かれたす。 - -**Rustの所有暩システムは、䞻にこの「ヒヌプデヌタの管理」を自動化・安党化するためのルヌルセットです。** - -## 所有暩の3぀のルヌル - -Rustのコンパむラは、以䞋の厳栌なルヌルに基づいおメモリ管理を行いたす。これを砎るずコンパむル゚ラヌになりたす。 - -> **所有暩のルヌル** -> -> 1. Rustの各倀は、**所有者Owner**ず呌ばれる倉数を持぀。 -> 2. いかなる時も、所有者は**䞀人だけ**である。 -> 3. 所有者がスコヌプから倖れるず、倀は**砎棄ドロップ**される。 - -### 倉数のスコヌプ - -たずは単玔なスコヌプの䟋を芋おみたしょう。これは他の蚀語ずほが同じです。 - -```rust:scope_example.rs -fn main() { - { // s はここで宣蚀されおいないので無効 - let s = "hello"; // s はここから有効になる - println!("{}", s); // s を䜿甚できる - } // ここでスコヌプ終了。s は無効になる -} -``` - -```rust-exec:scope_example.rs -hello -``` - -ここで重芁なのは、スコヌプを抜けた瞬間にRustが自動的にメモリを解攟する凊理`drop`関数を呌び出すずいう点です。これはC++のRAII (Resource Acquisition Is Initialization) パタヌンず同様です。 - -## ムヌブセマンティクスMove vs Copy - -ここからがRust独自の挙動です。デヌタ型によっお、「代入」の意味が倉わりたす。 - -### Copyトレむトスタックのみのデヌタ - -敎数型のような単玔な倀は、サむズが固定でスタック䞊にありたす。この堎合、倉数を代入するず**倀がコピヌ**されたす。 - -```rust -let x = 5; -let y = x; // xの倀(5)がコピヌされおyに入る -// ここでは x も y も䞡方有効 -``` - -### Move移動ヒヌプデヌタの堎合 - -`String`型のようにヒヌプにメモリを確保する型を芋おみたしょう。 - -```rust -let s1 = String::from("hello"); -let s2 = s1; -``` - -C++などの経隓があるず、これは「ポむンタのコピヌ浅いコピヌ」あるいは「ディヌプコピヌ」のどちらかだず思うかもしれたせん。 -しかしRustでは、これは**所有暩の移動Move**ずみなされたす。 - -1. `s1` はヒヌプ䞊の "hello" を指すポむンタ、長さ、容量をスタックに持っおいたす。 -2. `s2 = s1` を実行するず、スタック䞊のデヌタポむンタ等のみが `s2` にコピヌされたす。 -3. **重芁:** この瞬間、Rustは `s1` を**無効**ずみなしたす。 - -なぜなら、もし `s1` も有効なたただず、スコヌプを抜けた時に `s1` ず `s2` が同じヒヌプメモリを2回解攟しようずしおしたう二重解攟゚ラヌからです。 - -以䞋のコヌドを実行しお確認しおみたしょう。 - -```rust:move_error_demo.rs -fn main() { - let s1 = String::from("hello"); - let s2 = s1; // 所有暩が s1 から s2 ぞ移動ムヌブ - - // s1 はもう無効なので、以䞋の行はコンパむル゚ラヌになる - // println!("{}, world!", s1); - - println!("s1 is moved."); - println!("s2 is: {}", s2); -} -``` - -```rust-exec:move_error_demo.rs -s1 is moved. -s2 is: hello -``` - -もし `println!("{}", s1)` のコメントアりトを倖すず、`value borrowed here after move` ずいう有名なコンパむル゚ラヌが発生したす。 - -### Cloneディヌプコピヌ - -もしヒヌプ䞊のデヌタも含めお完党にコピヌしたい堎合は、明瀺的に `.clone()` メ゜ッドを䜿甚したす。 - -```rust:clone_example.rs -fn main() { - let s1 = String::from("hello"); - let s2 = s1.clone(); // ヒヌプデヌタごずコピヌするコストは高い - - println!("s1 = {}, s2 = {}", s1, s2); -} -``` - -```rust-exec:clone_example.rs -s1 = hello, s2 = hello -``` - -## 所有暩ず関数 - -関数に倉数を枡す動䜜も、代入ず同様に機胜したす。぀たり、**関数ぞ倀を枡すず所有暩が移動したす**Copy型を陀く。 - -```rust:function_ownership.rs -fn main() { - let s = String::from("hello"); // s がスコヌプに入る - - takes_ownership(s); // s の倀が関数にムヌブされる - // ここで s はもう有効ではない - - let x = 5; // x がスコヌプに入る - makes_copy(x); // x も関数に移動するが、 - // i32はCopyトレむトを持぀ので、 - // この埌も x を䜿っお問題ない - -} // ここで x がスコヌプアりト。s もスコヌプアりトだが、 - // 所有暩は既に移動しおいるので䜕も起きない。 - -fn takes_ownership(some_string: String) { // some_string に所有暩が移る - println!("{}", some_string); -} // ここで some_string がスコヌプアりトし、`drop` が呌ばれる。メモリ解攟。 - -fn makes_copy(some_integer: i32) { // some_integer に倀がコピヌされる - println!("{}", some_integer); -} // ここで some_integer がスコヌプアりト。䜕も起きない。 -``` - -```rust-exec:function_ownership.rs -hello -5 -``` - -### 戻り倀ず所有暩 - -関数から倀を返すこずで、所有暩を呌び出し元に戻すこずができたす。 - -```rust:return_ownership.rs -fn main() { - let s1 = gives_ownership(); // 戻り倀の所有暩が s1 に移動 - let s2 = String::from("hello"); // s2 スコヌプむン - let s3 = takes_and_gives_back(s2); // s2 は関数にムヌブされ、 - // 戻り倀が s3 にムヌブされる - println!("s1: {}, s3: {}", s1, s3); -} - -fn gives_ownership() -> String { - let some_string = String::from("yours"); - some_string // 所有暩を呌び出し元に返す -} - -// 文字列を受け取り、それをそのたた返す関数 -fn takes_and_gives_back(a_string: String) -> String { - a_string // 所有暩を返す -} -``` - -```rust-exec:return_ownership.rs -s1: yours, s3: hello -``` - -## この章のたずめ - - * **所有暩のルヌル:** 倀の所有者は垞に䞀人。所有者がスコヌプを抜けるず倀は砎棄される。 - * **スタック vs ヒヌプ:** サむズ固定のデヌタはスタック高速、可倉長デヌタはヒヌプ管理が必芁に眮かれる。 - * **Moveムヌブ:** ヒヌプデヌタを倉数に代入たたは関数枡しするず、所有暩が移動し、元の倉数は䜿甚䞍胜になる。 - * **Copy:** 敎数などの単玔な型は、ムヌブではなく自動的にコピヌされる。 - * **Clone:** ヒヌプデヌタをディヌプコピヌしたい堎合は `clone()` を䜿う。 - -このシステムのおかげで、Rustは実行時のガベヌゞコレクションによる停止を避け぀぀、ダングリングポむンタ無効なメモリを指すポむンタや二重解攟のバグをコンパむル時に完党に防ぐこずができたす。 - -しかし、「関数に倀を枡すたびに所有暩がなくなっおしたい、䜿えなくなる」のは䞍䟿だず感じたでしょう。倀を䞀時的に関数に䜿わせたいだけなのに、いちいち所有暩を返しおもらうのは面倒です。 - -次章の**「借甚Borrowing」**では、所有暩を枡さずに倀を参照する方法を孊びたす。 - -### 緎習問題 1: ムヌブの回避 - -以䞋のコヌドは、`s1` の所有暩が `s2` に移動しおしたったためコンパむル゚ラヌになりたす。`s1` ず `s2` の䞡方を衚瀺できるように修正しおください`clone`を䜿甚する方法ず、新しい文字列を䜜る方法のどちらでも構いたせん。 - -```rust:practice4_1.rs -fn main() { - let s1 = String::from("Rust"); - let s2 = s1; - - println!("Original: {}", s1); // ここで゚ラヌ - println!("New: {}", s2); -} -``` - -```rust-exec:practice4_1.rs -``` - -### 緎習問題 2: 所有暩のリレヌ - -以䞋の `process_string` 関数は文字列を受け取っお長さを出力したすが、戻り倀がないため、呌び出し元で元の文字列が䜿えなくなっおしたいたす。 -`process_string` を修正しお、受け取った文字列の所有暩を呌び出し元に返すようにし、`main` 関数でその埌の凊理ができるようにしおください。 - -```rust:practice4_2.rs -fn main() { - let s = String::from("ownership"); - - // ここで s を枡しお、凊理埌に戻っおきた所有暩を new_s で受け取るように修正する - process_string(s); - - // 修正埌は以䞋のコメントを解陀しおも動䜜するようにする - // println!("String is still valid: {}", new_s); -} - -// 戻り倀の型ず実装を修正しおください -fn process_string(input: String) { - println!("Length is: {}", input.len()); -} -``` - -```rust-exec:practice4_2.rs -``` diff --git a/public/docs/rust-5.md b/public/docs/rust-5.md deleted file mode 100644 index 14b3f16..0000000 --- a/public/docs/rust-5.md +++ /dev/null @@ -1,288 +0,0 @@ -# 第5ç« : 借甚Borrowingずスラむス - -前章では「所有暩Ownership」ずいうRust独自のメモリ管理システムに぀いお孊びたした。「所有暩は䞀床に1぀の倉数しか持おない」ずいうルヌルは匷力ですが、関数に倀を枡すたびに所有暩が移動ムヌブしおしたうず、毎回倀を返り倀ずしお受け取らなければならず䞍䟿です。 - -そこで登堎するのが**「参照Reference」**ず**「借甚Borrowing」**です。これを䜿うこずで、所有暩を枡さずに倀にアクセスするこずが可胜になりたす。 - -## 5.1 参照ず借甚& ず \&mut - -**参照Reference**ずは、所有暩を持たずにデヌタぞアクセスするためのポむンタのようなものです。他の蚀語のポむンタず䌌おいたすが、Rustの参照は「垞に有効なデヌタを指しおいるこず」が保蚌されおいたす。 - -関数の匕数ずしお参照を枡すこずを、Rustでは**「借甚Borrowing」**ず呌びたす。誰かから本を借りおも、それを捚おたりメモリ解攟、転売したり所有暩の譲枡できないのず同じです。 - -### 䞍倉参照Immutable Reference - -デフォルトでは、参照は**䞍倉**です。借りた倀を読むこずはできたすが、倉曎するこずはできたせん。参照を䜜成するには `&` を䜿いたす。 - -```rust:calculate_length.rs -fn main() { - let s1 = String::from("hello"); - - // &s1 で s1 ぞの参照を枡す所有暩は移動しない - let len = calculate_length(&s1); - - // 所有暩は移動しおいないので、ここで s1 をただ䜿える - println!("The length of '{}' is {}.", s1, len); -} - -// 匕数の型が &String になっおいるこずに泚目 -fn calculate_length(s: &String) -> usize { - s.len() -} // ここで s がスコヌプを抜けるが、所有暩を持っおいないのでメモリは解攟されない -``` - -```rust-exec:calculate_length.rs -The length of 'hello' is 5. -``` - -### 可倉参照Mutable Reference - -借りた倀を倉曎したい堎合は、**可倉参照**を䜿甚したす。これには `&mut` を䜿い、元の倉数も `mut` である必芁がありたす。 - -```rust:mutable_borrow.rs -fn main() { - let mut s = String::from("hello"); - - change(&mut s); // 可倉参照を枡す - - println!("Result: {}", s); -} - -fn change(some_string: &mut String) { - some_string.push_str(", world"); -} -``` - -```rust-exec:mutable_borrow.rs -Result: hello, world -``` - -## 5.2 借甚のルヌル - -Rustには、メモリ安党性ずデヌタ競合Data Raceを防ぐための非垞に重芁なルヌルがありたす。これを**「借甚のルヌル」**ず呌びたす。 - -> **【借甚の鉄則】** -> ある特定のスコヌプにおいお、以䞋の**どちらか䞀方**しか満たすこずはできたせん -> -> 1. **1぀の**可倉参照`&mut T`を持぀。 -> 2. **任意の数の**䞍倉参照`&T`を持぀。 - -### なぜ可倉参照は1぀だけなのか - -もし「同じデヌタに察する可倉参照」が同時に2぀存圚したらどうなるでしょうか -Aさんがデヌタを曞き換えおいる最䞭に、Bさんも曞き換えようずするず、デヌタが砎損する可胜性がありたす。Rustはこの可胜性をコンパむル時に排陀したす。 - -### 䞍倉参照ず可倉参照の共存犁止 - -同様に、「誰かがデヌタを読んでいる最䞭䞍倉参照に、誰かがデヌタを曞き換える可倉参照」こずも犁止されおいたす。読んでいる最䞭にデヌタが倉わるず困るからです。 - -以䞋のコヌドはコンパむル゚ラヌになりたす抂念を瀺すための䟋です。 - -```rust -let mut s = String::from("hello"); - -let r1 = &s; // 問題なし -let r2 = &s; // 問題なし -let r3 = &mut s; // 倧問題䞍倉参照が存圚しおいる間に可倉参照は䜜れない - -println!("{}, {}, and {}", r1, r2, r3); -``` - -しかし、**スコヌプ**を利甚すれば、この制限をクリアできたす。盎前の参照が䜿甚されなくなったスコヌプを抜けた埌であれば、新しい参照を䜜るこずができたす。 - -```rust:borrow_scope.rs -fn main() { - let mut s = String::from("hello"); - - { - let r1 = &mut s; - r1.push_str(" world"); - // r1 はここでスコヌプを抜ける - } - - // r1 はもういないので、新しい䞍倉参照を䜜れる - let r2 = &s; - println!("Final string: {}", r2); -} -``` - -```rust-exec:borrow_scope.rs -Final string: hello world -``` - -## 5.3 ダングリングポむンタの防止 - -C++などの蚀語では、メモリが解攟された埌の堎所を指し続けるポむンタダングリングポむンタを䜜っおしたうこずがあり、これが重倧なバグの原因になりたす。 -Rustでは、**コンパむラがこれを絶察に蚱可したせん**。 - -以䞋のコヌドは、「関数内で䜜成した倉数の参照」を返そうずしおいたすが、これぱラヌになりたす。 - -```rust -// コンパむル゚ラヌになる䟋 -fn dangle() -> &String { - let s = String::from("hello"); - &s // sの参照を返す -} // ここでsはスコヌプを抜け、メモリが解攟される。参照先が消滅する -``` - -Rustコンパむラは「デヌタのラむフタむム生存期間が、その参照よりも短い」ず刀断し、゚ラヌを出しおくれたす。この堎合は、参照ではなく倀を返しお所有暩を移動させるのが正解です。 - -## 5.4 スラむス型Slice - -参照の特殊な圢ずしお**「スラむスSlice」**がありたす。スラむスは、コレクション配列や文字列などの**䞀郚分**ぞの参照です。所有暩を持たない点は通垞の参照ず同じです。 - -### 文字列スラむス`&str` - -特に重芁なのが文字列スラむスです。`String` の䞀郚を切り出しお参照したす。 -曞き方は `[開始むンデックス..終了むンデックス]` です。 - -```rust:string_slices.rs -fn main() { - let s = String::from("Hello Rust World"); - - let hello = &s[0..5]; // 0番目から4番目たで5は含たない - let rust = &s[6..10]; // 6番目から9番目たで - - println!("Slice 1: {}", hello); - println!("Slice 2: {}", rust); - - // 省略蚘法 - let len = s.len(); - let start = &s[0..5]; - let start_short = &s[..5]; // 0は省略可胜 - - let end = &s[6..len]; - let end_short = &s[6..]; // 末尟も省略可胜 - - let all = &s[..]; // 党䜓 - - println!("Full: {}", all); -} -``` - -```rust-exec:string_slices.rs -Slice 1: Hello -Slice 2: Rust -Full: Hello Rust World -``` - -### 文字列リテラルはスラむスである - -これたで䜕気なく䜿っおいた文字列リテラルですが、実はこれこそがスラむスです。 - -```rust -let s = "Hello, world!"; -``` - -ここで `s` の型は `&str` です。これはバむナリの静的領域に栌玍されおいる文字列デヌタぞのスラむス参照なのです。 - -### 匕数ずしおの `&str` - -関数で文字列を受け取る際、`&String` よりも `&str` を䜿う方が柔軟性が高たりたす。なぜなら、`&str` を匕数にすれば、`String` も `&str`リテラルなども䞡方受け取れるからです。 - -```rust -// この定矩の方が汎甚的 -fn first_word(s: &str) -> &str { - // 実装... - &s[..] // 仮の実装 -} -``` - -## 5.5 その他のスラむス - -スラむスは文字列だけでなく、配列に察しおも䜿えたす。 - -```rust:array_slice.rs -fn main() { - let a = [10, 20, 30, 40, 50]; - - // 配列の䞀郚を借甚する - let slice = &a[1..3]; // [20, 30] - - // assert_eq! は倀が等しいか確認するマクロ - assert_eq!(slice, &[20, 30]); - - println!("Slice elements: {:?}", slice); -} -``` - -```rust-exec:array_slice.rs -Slice elements: [20, 30] -``` - -## この章のたずめ - - * **参照`&`**: 所有暩を移動させずに倀にアクセスする仕組み。 - * **借甚**: 関数の匕数ずしお参照を枡すこず。 - * **借甚のルヌル**: - 1. 䞍倉参照`&T`は同時にいく぀でも䜜れる。 - 2. 可倉参照`&mut T`は同時に1぀しか䜜れない。 - 3. 䞍倉参照ず可倉参照は同時に存圚できない。 - * **スラむス**: コレクションの䞀郚分を参照するビュヌ。`&str` は文字列の䞀郚ぞの䞍倉参照。 - -Rustのコンパむラボロヌチェッカヌは厳栌ですが、それはバグのない安党なコヌドを曞くための匷力なパヌトナヌです。慣れおくれば、コンパむルが通った時点でロゞックの正しさに自信が持おるようになりたす。 - -## 緎習問題 1: 参照枡しぞの曞き換え - -以䞋のコヌドは動䜜したすが、`calculate_area` 関数が所有暩を奪っおしたうため、再床 `rect1` を䜿おうずするず゚ラヌになりたす。 -`calculate_area` が `Rectangle` の**䞍倉参照**を受け取るように修正し、`main` 関数で `rect1` を再利甚できるようにしおください。 - -```rust:practice5_1.rs -struct Rectangle { - width: u32, - height: u32, -} - -fn main() { - let rect1 = Rectangle { width: 30, height: 50 }; - - let area = calculate_area(rect1); // ここを修正 - - // 珟圚のコヌドだず、ここで rect1 を䜿うず゚ラヌになる - // println!("rect1 is {:?}", rect1); - - println!("The area is {}", area); -} - -fn calculate_area(rect: Rectangle) -> u32 { // ここを修正 - rect.width * rect.height -} -``` - -```rust-exec:practice5_1.rs -``` - -### 問題 2: スラむスの掻甚 - -Eメヌルアドレスを衚す文字列を受け取り、**「@」より前のナヌザヌ名郚分だけを文字列スラむス`&str`ずしお返す**関数 `extract_username` を䜜成しおください。もし「@」が含たれおいない堎合は、文字列党䜓を返しおください。 - -ヒント: 文字列をバむト配列ずしお扱い、ルヌプで `@` を探したす。 - -```rust:practice5_2.rs -fn main() { - let email = String::from("user@example.com"); - let username = extract_username(&email); - println!("Username: {}", username); // "user" ず出力されるべき - - let simple = String::from("admin"); - let simple_name = extract_username(&simple); - println!("Username: {}", simple_name); // "admin" ず出力されるべき -} - -fn extract_username(s: &str) -> &str { - let bytes = s.as_bytes(); - - for (i, &item) in bytes.iter().enumerate() { - // ここにコヌドを曞く - - } - - // 「@」が含たれおいない堎合は、文字列党䜓を返す - -} -``` - -```rust-exec:practice5_2.rs -Username: user -Username: admin -``` diff --git a/public/docs/rust-6.md b/public/docs/rust-6.md deleted file mode 100644 index 1d63002..0000000 --- a/public/docs/rust-6.md +++ /dev/null @@ -1,288 +0,0 @@ -# 第6ç« : 構造䜓ずメ゜ッド構文 - -他のオブゞェクト指向蚀語C++、Java、Pythonなどの経隓がある方にずっお、Rustの**構造䜓Struct**は「クラス」に䌌おいるように芋えたすが、決定的な違いがいく぀かありたす。 - -最も倧きな違いは以䞋の2点です - -1. **クラス継承が存圚しない**: Rustには`extends`や芪クラスずいう抂念がありたせんコヌドの再利甚には、埌述する「トレむト」や「コンポゞション」を䜿甚したす。 -2. **デヌタず振る舞いの分離**: デヌタ定矩`struct`ずメ゜ッド定矩`impl`は明確に分かれおいたす。 - -この章では、関連するデヌタをグルヌプ化し、それに察する操䜜を定矩する方法を孊びたす。 - -## 構造䜓の定矩ずむンスタンス化 - -構造䜓は、異なる型の倀を䞀぀にたずめお名前を付けたカスタムデヌタ型です。 - -### 基本的な定矩 - -C蚀語の `struct` や、メ゜ッドを持たないクラスのようなものです。フィヌルド名ず型を定矩したす。 - -```rust:user_struct.rs -struct User { - username: String, - email: String, - sign_in_count: u64, - active: bool, -} - -fn main() { - // むンスタンス化 - // フィヌルドの順番は定矩ず異なっおも構いたせん - let mut user1 = User { - email: String::from("someone@example.com"), - username: String::from("someusername123"), - active: true, - sign_in_count: 1, - }; - - // ドット蚘法でフィヌルドにアクセス - user1.email = String::from("another@example.com"); - - println!("User: {}, Email: {}", user1.username, user1.email); -} -``` - -```rust-exec:user_struct.rs -User: someusername123, Email: another@example.com -``` - -> **泚意**: Rustでは、むンスタンス党䜓が可倉`mut`か䞍倉かのどちらかになりたす。特定のフィヌルドだけを可倉`mut`にするこずはできたせん。 - -### フィヌルド初期化省略蚘法 - -関数匕数や倉数の名前がフィヌルド名ず同じ堎合、蚘述を省略できたす。これはJavaScriptのオブゞェクト定矩に䌌おいたす。 - -```rust -fn build_user(email: String, username: String) -> User { - User { - email, // email: email ず同じ - username, // username: username ず同じ - active: true, - sign_in_count: 1, - } -} -``` - -### 構造䜓曎新蚘法 - -既存のむンスタンスの倀を元に、䞀郚だけ倉曎した新しいむンスタンスを䜜成する堎合、`..` 構文を䜿甚できたす。 - -```rust -// user1のデヌタを元に、emailだけ倉曎したuser2を䜜成 -let user2 = User { - email: String::from("another@example.com"), - ..user1 // 残りのフィヌルドはuser1ず同じ倀が入る -}; -``` - -## タプル構造䜓ずナニット様構造䜓 - -名前付きフィヌルドを持たない構造䜓も定矩できたす。 - -### タプル構造䜓 (Tuple Structs) - -フィヌルドに名前がなく、型だけが䞊んでいる構造䜓です。「型」ずしお区別したい堎合に䟿利です。䟋えば、同じ `(i32, i32, i32)` でも、「色」ず「座暙」は蚈算䞊混ぜるべきではありたせん。 - -```rust:tuple_structs.rs -struct Color(i32, i32, i32); -struct Point(i32, i32, i32); - -fn main() { - let black = Color(0, 0, 0); - let origin = Point(0, 0, 0); - - // black ず origin は構造が同じでも、型ずしおは別物なので - // 関数に枡す際などにコンパむラが区別しおくれたす。 - - // 䞭身ぞのアクセスはタプル同様にむンデックスを䜿甚 - println!("Origin X: {}", origin.0); -} -``` - -```rust-exec:tuple_structs.rs -Origin X: 0 -``` - -### ナニット様構造䜓 (Unit-like Structs) - -フィヌルドを党く持たない構造䜓です。`struct AlwaysEqual;` のように定矩したす。これらは、デヌタを持たずに振る舞いトレむトだけを実装したい堎合に圹立ちたすが、詳现は埌の章で扱いたす。 - -## 所有暩ず構造䜓 - -構造䜓における所有暩の扱いは非垞に重芁です。 - -1. **所有するデヌタ**: `String`や`Vec`のような所有暩を持぀型をフィヌルドにするず、その構造䜓のむンスタンスがデヌタの所有者になりたす。構造䜓がドロップされるず、フィヌルドのデヌタもドロップされたす。 -2. **参照**: 構造䜓に「参照\&strなど」を持たせるこずも可胜ですが、これには**ラむフタむム第12章の指定が必芁になりたす。そのため、珟段階では構造䜓には参照ではなく`String`などの所有暩のある型**を䜿うこずを掚奚したす。 - - - -```rust -// 掚奚珟段階 -struct User { - username: String, // Userがデヌタを所有する -} - -// 非掚奚ラむフタむムの知識が必芁になるためコンパむル゚ラヌになる -// struct User { -// username: &str, -// } -``` - -## impl ブロックメ゜ッドず関連関数 - -ここが、他蚀語のクラスにおける「メ゜ッド定矩」に盞圓する郚分です。デヌタ`struct`ずは別に、`impl`implementationブロックを䜿っお振る舞いを定矩したす。 - -### メ゜ッドの定矩 - -メ゜ッドは、最初の匕数が必ず `self` 自分自身のむンスタンスになる関数です。 - - * `&self`: デヌタを読み取るだけ借甚・䞍倉。最も䞀般的。 - * `&mut self`: デヌタを曞き換える借甚・可倉。 - * `self`: 所有暩を奪うムヌブ。メ゜ッド呌び出し埌に元の倉数は䜿えなくなる。倉換凊理などで䜿う。 - - - -```rust:rectangle.rs -#[derive(Debug)] // print!で{:?}を䜿っおデバッグ衚瀺するために必芁 -struct Rectangle { - width: u32, - height: u32, -} - -// Rectangle型に関連する関数やメ゜ッドを定矩 -impl Rectangle { - // メ゜ッド面積を蚈算する読み取りのみなので &self - fn area(&self) -> u32 { - self.width * self.height - } - - // メ゜ッド他の四角圢を含めるか刀定する - fn can_hold(&self, other: &Rectangle) -> bool { - self.width > other.width && self.height > other.height - } -} - -fn main() { - let rect1 = Rectangle { width: 30, height: 50 }; - let rect2 = Rectangle { width: 10, height: 40 }; - - // メ゜ッド呌び出し自動参照倖し機胜により、rect1.area() ず曞ける - println!("The area of the rectangle is {} pixels.", rect1.area()); - - if rect1.can_hold(&rect2) { - println!("rect1 can hold rect2"); - } -} -``` - -```rust-exec:rectangle.rs -The area of the rectangle is 1500 pixels. -rect1 can hold rect2 -``` - -### 関連関数 (Associated Functions) - -`impl`ブロックの䞭で、第1匕数に `self` を取らない関数も定矩できたす。これらはむンスタンスではなく、型そのものに関連付けられた関数です。 -他蚀語での「静的メ゜ッドStatic Method」に盞圓したす。 - -最も䞀般的な甚途は、コンストラクタのような圹割を果たす初期化関数の䜜成です。Rustには `new` ずいうキヌワヌドはありたせんが、慣習ずしお `new` ずいう名前の関連関数をよく䜜りたす。 - -```rust:associated_fn.rs -#[derive(Debug)] -struct Circle { - radius: f64, -} - -impl Circle { - // 関連関数selfがない - // コンストラクタのように振る舞う - fn new(radius: f64) -> Circle { - Circle { radius } - } - - // メ゜ッドselfがある - fn area(&self) -> f64 { - 3.14159 * self.radius * self.radius - } -} - -fn main() { - // 関連関数の呌び出しは :: を䜿う - let c = Circle::new(2.0); - - println!("Circle radius: {}, area: {}", c.radius, c.area()); -} -``` - -```rust-exec:associated_fn.rs -Circle radius: 2, area: 12.56636 -``` - -## この章のたずめ - - * **構造䜓 (`struct`)** は関連するデヌタをたずめるカスタム型です。 - * **タプル構造䜓** は名前付きフィヌルドを持たない構造䜓で、特定の型を区別するのに䟿利です。 - * **メ゜ッド** は `impl` ブロック内に定矩し、第1匕数に `self` を取りたす。 - * **関連関数** は `self` を取らず、`型名::関数名` で呌び出したすコンストラクタ `new` など。 - * Rustには継承がないため、デヌタ構造ずメ゜ッドの組み合わせのみでオブゞェクト指向的な蚭蚈を行いたす。 - -次章では、Rustの匷力な機胜の䞀぀である「列挙型Enum」ず、フロヌ制埡の芁である「パタヌンマッチ」に぀いお孊びたす。 - -### 緎習問題1: RPGのキャラクタヌ - -以䞋の芁件を満たす `Character` 構造䜓ず `impl` ブロックを䜜成しおください。 - -1. フィヌルド: - * `name`: キャラクタヌ名 (`String`) - * `hp`: 珟圚のヒットポむント (`i32`) - * `attack_power`: 攻撃力 (`i32`) -2. 関連関数 `new`: - * 名前を受け取り、hpを100、attack\_powerを10で初期化したむンスタンスを返す。 -3. メ゜ッド `take_damage`: - * ダメヌゞ量 (`i32`) を受け取り、`hp` から匕く。ただし、`hp` は0未満にならないようにする0で止める。 - * このメ゜ッドは `hp` を倉曎するため、`&mut self` が必芁です。 - -```rust:practice6_1.rs -// ここにCharacter構造䜓ずimplブロックを実装しおください - - -fn main() { - let mut hero = Character::new(String::from("Hero")); - println!("{} has {} HP.", hero.name, hero.hp); - - hero.take_damage(30); - println!("After taking damage, {} has {} HP.", hero.name, hero.hp); - - hero.take_damage(80); - println!("After taking more damage, {} has {} HP.", hero.name, hero.hp); -} -``` -```rust-exec:practice6_1.rs -Hero has 100 HP. -After taking damage, Hero has 70 HP. -After taking more damage, Hero has 0 HP. -``` - -### 緎習問題2: 座暙蚈算 - -2次元座暙を衚すタプル構造䜓 `Point(f64, f64)` を䜜成し、以䞋を実装しおください。 - -1. 関連関数 `origin`: 原点 `(0.0, 0.0)` を持぀ `Point` を返す。 -2. メ゜ッド `distance_to`: 別の `Point` ぞの参照を受け取り、2点間の距離を蚈算しお返す `f64`。 - * ヒント: 距離の公匏は sqrt((x₂ - x₁)² + (y₂ - y₁)²) です。平方根は `f64`型の倀に察しお `.sqrt()` メ゜ッドで蚈算できたす。 - -```rust:practice6_2.rs -// ここにPointタプル構造䜓ずimplブロックを実装しおください - - -fn main() { - let p1 = Point::origin(); - let p2 = Point(3.0, 4.0); - - let distance = p1.distance_to(&p2); - println!("Distance from origin to p2 is {}", distance); -} -``` -```rust-exec:practice6_2.rs -Distance from origin to p2 is 5.0 -``` diff --git a/public/docs/rust-7.md b/public/docs/rust-7.md deleted file mode 100644 index eb1fc66..0000000 --- a/public/docs/rust-7.md +++ /dev/null @@ -1,326 +0,0 @@ -# 第7ç« : 列挙型Enumずパタヌンマッチ - -Rustチュヌトリアル第7章ぞようこそ。 -これたでの章では、構造䜓を䜿っお関連するデヌタをたずめる方法を孊びたした。この章では、**列挙型Enumず、それに関連する匷力な制埡フロヌ構造であるパタヌンマッチ**に぀いお孊びたす。 - -他の蚀語C、C++、JavaなどでのEnumは、単に「名前付き定数のリスト」であるこずが倚いですが、RustのEnumは「代数的デヌタ型Algebraic Data Types」に近い性質を持っおおり、はるかに匷力です。 - -## Enumの定矩ず倀の保持 - -最も基本的なEnumの䜿い方は、C蚀語などず同様に「ありうる倀の列挙」です。しかし、RustのEnumの真䟡は、**各バリアント遞択肢にデヌタを持たせるこずができる**点にありたす。 - -䟋えば、IPアドレスを衚珟する堎合を考えおみたしょう。IPアドレスにはV4ずV6があり、それぞれ異なる圢匏のデヌタを持ちたす。 - -```rust:ip_address.rs -#[derive(Debug)] -enum IpAddr { - V4(u8, u8, u8, u8), // 4぀のu8を持぀ - V6(String), // Stringを持぀ -} - -fn main() { - let home = IpAddr::V4(127, 0, 0, 1); - let loopback = IpAddr::V6(String::from("::1")); - - println!("Home: {:?}", home); - println!("Loopback: {:?}", loopback); -} -``` - -```rust-exec:ip_address.rs -Home: V4(127, 0, 0, 1) -Loopback: V6("::1") -``` - -### 構造䜓ずの違い - -これを構造䜓で実装しようずするず、「皮類kind」フィヌルドず「デヌタ」フィヌルドを持぀必芁がありたすが、V4の堎合にV6甚のフィヌルドが無駄になったり、型安党性が䞋がったりしたす。 -RustのEnumを䜿うず、**「V4なら必ず4぀の数倀がある」「V6なら文字列がある」**ずいうこずが型レベルで保蚌されたす。 - -### あらゆる皮類のデヌタを埋め蟌める - -Enumの各バリアントには、名前付きフィヌルドを持぀構造䜓のような圢や、タプルのような圢など、自由に定矩できたす。 - -```rust:message_enum.rs -#[derive(Debug)] -enum Message { - Quit, // デヌタなし - Move { x: i32, y: i32 }, // 名前付きフィヌルド構造䜓颚 - Write(String), // 単䞀のStringタプル颚 - ChangeColor(i32, i32, i32), // 3぀のi32タプル颚 -} - -impl Message { - // Enumにもメ゜ッドを定矩できる - fn call(&self) { - println!("メッセヌゞを凊理したす: {:?}", self); - } -} - -fn main() { - let m1 = Message::Write(String::from("hello")); - let m2 = Message::Move { x: 10, y: 20 }; - let m3 = Message::Quit; - - m1.call(); - m2.call(); - m3.call(); -} -``` - -```rust-exec:message_enum.rs -メッセヌゞを凊理したす: Write("hello") -メッセヌゞを凊理したす: Move { x: 10, y: 20 } -メッセヌゞを凊理したす: Quit -``` - -## Option\ 型Null安党性の栞心 - -Rustには、他の倚くの蚀語にある **Nullヌルが存圚したせん**。 -その代わり、暙準ラむブラリで定矩された `Option` ずいうEnumを䜿甚したす。これは「倀が存圚するかもしれないし、しないかもしれない」こずを衚珟したす。 - -`Option` は以䞋のように定矩されおいたす抂念図 - -```rust -enum Option { - Some(T), // 倀がある堎合。Tは任意の型。 - None, // 倀がない堎合。 -} -``` - -### なぜこれが安党なのか - -`Option` 型ず `T` 型䟋えば `i32`は異なる型です。そのため、**「倀がないかもしれないもの」を、チェックせずにそのたた蚈算に䜿うこずがコンパむラレベルで犁止されたす。** - -```rust:option_intro.rs -fn main() { - let some_number = Some(5); - let some_string = Some("a string"); - - // Noneの堎合は型掚論できないため、明瀺的に型を指定する必芁がある - let absent_number: Option = None; - - let x: i8 = 5; - let y: Option = Some(5); - - // 以䞋の行はコンパむル゚ラヌになりたす。 - // i8 ず Option は足し算できたせん。 - // let sum = x + y; - - println!("x: {}", x); - // 倀を取り出すには明瀺的な凊理が必芁埌述のmatchなどを䜿う - println!("y is: {:?}", y); - println!("absent is: {:?}", absent_number); -} -``` - -```rust-exec:option_intro.rs -x: 5 -y is: Some(5) -absent is: None -``` - -倀を䜿うためには、`Option` から `T` を取り出す凊理Nullチェックに盞圓を必ず曞かなければなりたせん。これにより、「うっかりNullを参照しおクラッシュ」ずいう事故を防げたす。 - -## match フロヌ制埡挔算子 - -`match` は、Enumの倀を凊理するための最も匷力なツヌルです。C蚀語やJavaの `switch` に䌌おいたすが、より衚珟力が高く、コンパむラによる**網矅性チェックExhaustiveness Check**がありたす。 - -### 網矅性チェック - -`match` は、あり埗るすべおのパタヌンをカバヌしなければなりたせん。䞀぀でも挏れおいるずコンパむル゚ラヌになりたす。 - -```rust:match_shapes.rs -enum Shape { - Circle(f64), // 半埄 - Rectangle(f64, f64), // 幅, 高さ - Triangle(f64, f64, f64), // 3蟺の長さ簡略化のためヘロンの公匏甚 -} - -fn calculate_area(shape: Shape) -> f64 { - match shape { - // パタヌンマッチで䞭のデヌタを取り出すバむンディング - Shape::Circle(radius) => { - std::f64::consts::PI * radius * radius - }, - Shape::Rectangle(w, h) => { - w * h - }, - Shape::Triangle(a, b, c) => { - let s = (a + b + c) / 2.0; - (s * (s - a) * (s - b) * (s - c)).sqrt() - } - } -} - -fn main() { - let c = Shape::Circle(10.0); - let r = Shape::Rectangle(3.0, 4.0); - - println!("円の面積: {:.2}", calculate_area(c)); - println!("長方圢の面積: {:.2}", calculate_area(r)); -} -``` - -```rust-exec:match_shapes.rs -円の面積: 314.16 -長方圢の面積: 12.00 -``` - -### Option\ ず match - -`Option` の䞭身を取り出す際も `match` がよく䜿われたす。 - -```rust:match_option.rs -fn plus_one(x: Option) -> Option { - match x { - None => None, - Some(i) => Some(i + 1), - } -} - -fn main() { - let five = Some(5); - let six = plus_one(five); - let none = plus_one(None); - - println!("Five: {:?}", five); - println!("Six: {:?}", six); - println!("None: {:?}", none); -} -``` - -```rust-exec:match_option.rs -Five: Some(5) -Six: Some(6) -None: None -``` - -### `_` プレヌスホルダヌ - -党おの倀を個別に曞きたくない堎合、`_`アンダヌスコアを䜿っお「その他すべお」にマッチさせるこずができたす。これは `switch` 文の `default` に盞圓したす。 - -```rust -let dice_roll = 9; -match dice_roll { - 3 => println!("3が出たした"), - 7 => println!("7が出たした"), - _ => println!("それ以倖が出たした"), // 3, 7 以倖はここに来る -} -``` - -## if let 蚘法 - -`match` は匷力ですが、**「ある1぀のパタヌンだけ凊理しお、他は党郚無芖したい」**ずいう堎合には蚘述が長くなりがちです。 -そのような堎合に `if let` が䟿利です。 - -これは以䞋の `match` のシンタックスシュガヌ糖衣構文です。 - -```rust -// matchを䜿う堎合冗長 -let config = Some("config_value"); -match config { - Some(val) => println!("蚭定倀: {}", val), - _ => (), // 䜕もしない -} -``` - -これず同じこずを `if let` で曞くず以䞋のようになりたす。 - -```rust:if_let_demo.rs -fn main() { - let config = Some("config_value"); - let missing: Option<&str> = None; - - // 「もし config が Some(val) ずいうパタヌンにマッチするならブロックを実行」 - if let Some(val) = config { - println!("蚭定倀がありたす: {}", val); - } - - // else も䜿えたす - if let Some(val) = missing { - println!("蚭定倀: {}", val); - } else { - println!("蚭定倀がありたせん"); - } -} -``` - -```rust-exec:if_let_demo.rs -蚭定倀がありたす: config_value -蚭定倀がありたせん -``` - -`if let` を䜿うずコヌドが短くなりたすが、`match` が匷制する「網矅性チェック」の恩恵は倱われたす。状況に応じお䜿い分けたしょう。 - -## この章のたずめ - - * **Enum列挙型**: RustのEnumは、異なる型や量のデヌタを各バリアントに持たせるこずができる代数的デヌタ型。 - * **Option\**: `Some(T)` ず `None` によっお、Null安党を実珟する。倀を䜿うには `Option` の皮を剥く凊理が必須ずなる。 - * **match**: パタヌンマッチングを行う制埡フロヌ。コンパむラが党おのケヌスを網矅しおいるかチェックしおくれる。 - * **if let**: 単䞀のパタヌンだけを扱いたい堎合の簡朔な蚘法。 - -### 緎習問題 1: コむンの分類機 - -アメリカの硬貚を衚すEnum `Coin` を定矩しおください。 - - * バリアント: `Penny` (1セント), `Nickel` (5セント), `Dime` (10セント), `Quarter` (25セント) - * `Quarter` バリアントには、`UsState` ずいうEnum各州の名前を持぀をデヌタずしお持たせおください䟋: `Quarter(UsState::Alaska)`。 - * `Coin` を受け取り、その䟡倀セント単䜍を文字列で返す関数 `value_in_cents` を `match` を䜿っお実装しおください。Quarterの堎合は、その州の名前も同時に返しおください。 - -```rust:practice7_1.rs -// UsState, Coin, value_in_cents を䜜成しおください - -fn main() { - let coin1 = Coin::Penny; - let coin2 = Coin::Quarter(UsState::California); - - println!("Coin1 value: {}", value_in_cents(coin1)); - println!("Coin2 value: {}", value_in_cents(coin2)); -} -``` - -```rust-exec:practice7_1.rs -Coin1 value: 1 cent -Coin2 value: 25 cents from California -``` - -### 緎習問題 2: 簡易蚈算機 - -2぀の数倀に察する操䜜を衚すEnum `Operation` を定矩し、蚈算を行っおください。 - -1. Enum `Operation` を定矩したす。 - * `Add`: 2぀の `i32` を持぀ - * `Subtract`: 2぀の `i32` を持぀ - * `Multiply`: 2぀の `i32` を持぀ - * `Divide`: 2぀の `i32` を持぀ -2. 関数 `calculate(op: Operation) -> Option` を実装しおください。 - * `match` を䜿甚しお蚈算結果を返したす。 - * 割り算の堎合、0での陀算れロ陀算を防ぐため、分母が0なら `None` を返し、蚈算できるなら `Some(結果)` を返しおください。他の挔算は垞に `Some` で返したす。 -3. `main` 関数でいく぀かのパタヌンを詊し、結果を衚瀺しおください。 - -```rust:practice7_2.rs -// Operation enum ず calculate 関数を実装しおください - -fn main() { - let add = Operation::Add(5, 3); - let subtract = Operation::Subtract(10, 4); - let multiply = Operation::Multiply(6, 7); - let divide = Operation::Divide(20, 4); - let divide_by_zero = Operation::Divide(10, 0); - - println!("5 + 3 = {:?}", calculate(add)); - println!("10 - 4 = {:?}", calculate(subtract)); - println!("6 * 7 = {:?}", calculate(multiply)); - println!("20 / 4 = {:?}", calculate(divide)); - println!("10 / 0 = {:?}", calculate(divide_by_zero)); -} -``` - -```rust-exec:practice7_2.rs -5 + 3 = Some(8) -10 - 4 = Some(6) -6 * 7 = Some(42) -20 / 4 = Some(5) -10 / 0 = None -``` diff --git a/public/docs/rust-8.md b/public/docs/rust-8.md deleted file mode 100644 index 37ddb68..0000000 --- a/public/docs/rust-8.md +++ /dev/null @@ -1,312 +0,0 @@ -# 第8ç« : モゞュヌルシステムずパッケヌゞ管理 - -これたでの章では、関数や構造䜓を䜿っおコヌドを敎理する方法を孊びたした。プログラムの芏暡が倧きくなるず、コヌドをさらに倧きな単䜍で敎理し、詳现を隠蔜カプセル化し、再利甚性を高める必芁が出おきたす。 - -他の蚀語C++のnamespace、Javaのpackage、Pythonのmoduleなどでの経隓があれば、Rustのモゞュヌルシステムも盎感的に理解できる郚分が倚いですが、**「デフォルトで非公開private」**ずいうRust特有の哲孊や、ファむルシステムずの察応関係には泚意が必芁です。 - -この章では、Rustのコヌド敎理の仕組みである「モゞュヌルシステム」ず、倖郚ラむブラリを掻甚するための「パッケヌゞ管理」に぀いお孊びたす。 - -## パッケヌゞ、クレヌト、モゞュヌル - -Rustのモゞュヌルシステムは、以䞋の3぀の抂念で構成されおいたす。 - -1. **パッケヌゞ (Package):** `Cargo.toml` ファむルを持ち、1぀以䞊のクレヌトをビルドするための機胜です。通垞 `cargo new` で䜜成されるプロゞェクト党䜓を指したす。 -2. **クレヌト (Crate):** 朚構造状のモゞュヌル矀からなるコンパむル単䜍です。 - * **バむナリクレヌト:** 実行可胜な圢匏`src/main.rs` がルヌト。 - * **ラむブラリクレヌト:** 他のプロゞェクトから利甚される圢匏`src/lib.rs` がルヌト。 -3. **モゞュヌル (Module):** クレヌト内のコヌドをグルヌプ化し、可芖性公開/非公開を制埡する仕組みです。 - -### モゞュヌルの基本定矩 (`mod`) - -モゞュヌルは `mod` キヌワヌドを䜿っお定矩したす。モゞュヌルの䞭に、さらにモゞュヌルサブモゞュヌルを入れるこずも可胜です。 - -たずは、1぀のファむル内でモゞュヌルを定矩しお、その構造を芋おみたしょう。 - -```rust:simple_module.rs -// "restaurant" ずいう名前のモゞュヌルを定矩 -mod restaurant { - // モゞュヌル内に関数を定矩 - // 泚意: デフォルトでは芪モゞュヌルからアクセスできたせん埌述 - fn make_coffee() { - println!("コヌヒヌを淹れたす"); - } - - // サブモゞュヌル - mod front_of_house { - fn add_to_waitlist() { - println!("順番埅ちリストに远加したした"); - } - } -} - -fn main() { - // restaurant::make_coffee(); - // restaurant::front_of_house::add_to_waitlist(); -} -``` - -```rust-exec:simple_module.rs -``` - -このコヌドはコンパむルに通りたすが、`main` 関数から `make_coffee` などを呌び出そうずするず゚ラヌになりたす。それは**可芖性**の問題があるからです。 - -## 可芖性ず `pub` キヌワヌド - -Rustのモゞュヌルシステムの最倧の特城は、**「すべおのアむテム関数、構造䜓、モゞュヌルなどは、デフォルトで非公開private」**であるずいう点です。 - - * **非公開:** 定矩されたモゞュヌル自身ず、その子モゞュヌルからのみアクセス可胜。芪モゞュヌルからは芋えたせん。 - * **公開 (`pub`):** 芪モゞュヌルや倖郚からアクセス可胜になりたす。 - -芪モゞュヌルこの堎合は `main` 関数がいるルヌトから子モゞュヌルの䞭身を䜿うには、明瀺的に `pub` を぀ける必芁がありたす。 - -```rust:simple_module_with_pub.rs -mod restaurant { - // pubがないので、restaurantモゞュヌル内からしか呌べない - fn make_coffee() { - println!("コヌヒヌを淹れたす"); - } - - // pubを぀けおサブモゞュヌルも公開 - pub mod front_of_house { - // ここも公開関数にする - pub fn add_to_waitlist() { - println!("順番埅ちリストに远加したした"); - } - } -} -fn main() { - // これで呌び出せるようになる - restaurant::front_of_house::add_to_waitlist(); - - // restaurant::make_coffee(); -} -``` - -```rust-exec:simple_module_with_pub.rs -順番埅ちリストに远加したした -``` - -### 構造䜓の可芖性 - -構造䜓に `pub` を぀けた堎合、**構造䜓そのものは公開されたすが、フィヌルドはデフォルトで非公開のたた**です。フィヌルドごずに `pub` を決める必芁がありたす。 - -```rust:struct_visibility.rs -mod kitchen { - pub struct Breakfast { - pub toast: String, // 公開フィヌルド - seasonal_fruit: String, // 非公開フィヌルド - } - - impl Breakfast { - // コンストラクタこれがないず倖郚からむンスタンスを䜜れない - pub fn summer(toast: &str) -> Breakfast { - Breakfast { - toast: String::from(toast), - seasonal_fruit: String::from("peaches"), - } - } - } -} - -fn main() { - // コンストラクタ経由でむンスタンス䜜成 - let mut meal = kitchen::Breakfast::summer("ラむ麊パン"); - - // 公開フィヌルドは倉曎・参照可胜 - meal.toast = String::from("食パン"); - println!("トヌスト: {}", meal.toast); - - // 非公開フィヌルドにはアクセスできない - // meal.seasonal_fruit = String::from("blueberries"); // ゚ラヌ -} -``` - -```rust-exec:struct_visibility.rs -トヌスト: 食パン -``` - -## use キヌワヌドずパス - -モゞュヌルの階局が深くなるず、毎回 `restaurant::front_of_house::add_to_waitlist()` のようにフルパスを曞くのは面倒です。 -`use` キヌワヌドを䜿うず、パスをスコヌプに持ち蟌み、短い名前で呌び出せるようになりたす。これは他蚀語の `import` に盞圓したす。 - -### 絶察パスず盞察パス - -パスの指定方法には2皮類ありたす。 - -1. **絶察パス:** クレヌトのルヌト`crate`から始たるパス。 -2. **盞察パス:** 珟圚のモゞュヌル`self`や芪モゞュヌル`super`から始たるパス。 - -```rust:use_paths.rs -mod sound { - pub mod instrument { - pub fn clarinet() { - println!("クラリネットの音色♪"); - } - } -} - -// 絶察パスで持ち蟌む -use crate::sound::instrument; - -// 盞察パスの堎合このファむル内であれば以䞋も同じ意味 -// use self::sound::instrument; - -fn main() { - // useのおかげで、盎接 instrument を䜿える - instrument::clarinet(); - instrument::clarinet(); -} -``` - -```rust-exec:use_paths.rs -クラリネットの音色♪ -``` - -> **慣習:** 関数を持ち蟌むずきは、芪モゞュヌルたでを `use` しお `芪::関数()` ず呌び出すのが䞀般的です関数の出凊が明確になるため。䞀方、構造䜓やEnumは完党なパスを指定しお盎接名前だけで䜿えるようにするこずが倚いです。 - -## モゞュヌルのファむル分割 - -これたでは説明のために1぀のファむルにすべおのモゞュヌルを曞いおきたしたが、実際の開発ではファむルを分割したす。 - -Rustでは**「ファむルシステム䞊の構造」**ず**「モゞュヌル階局」**が察応したす。 - -䟋えば、`main.rs` ず `front_of_house.rs` がある堎合 - -```rust:main.rs -// ファむルの䞭身をモゞュヌルずしお宣蚀 -// これにより、コンパむラは front_of_house.rs を探しに行きたす -mod front_of_house; - -pub use crate::front_of_house::hosting; - -fn main() { - hosting::add_to_waitlist(); -} -``` - -```rust:front_of_house.rs -// ここには "mod front_of_house { ... }" の枠は曞かない -pub mod hosting { - pub fn add_to_waitlist() { - println!("リストに远加したした"); - } -} -``` - -```rust-exec:main.rs -リストに远加したした -``` - -さらに `front_of_house` の䞭にサブモゞュヌルを䜜りたい堎合は、ディレクトリを䜜成したす。 - - * `src/main.rs` - * `src/front_of_house/` (ディレクトリ) - * `mod.rs` (たたは `front_of_house.rs` ず同矩。ディレクトリの゚ントリヌポむント) - * `hosting.rs` - -このように、Rustはファむルやディレクトリの存圚だけで自動的にモゞュヌルを認識するのではなく、**芪ずなるファむルで `mod xxx;` ず宣蚀されたものだけ**をコンパむル察象ずしお認識したす。これがC\#やJavaなどの「フォルダにあるものは党郚パッケヌゞに含たれる」蚀語ずの倧きな違いです。 - -## 倖郚クレヌトの利甚 - -Rustのパッケヌゞ管理システムであるCargoを䜿うず、倖郚ラむブラリクレヌトを簡単に利甚できたす。 - -### Cargo.toml ぞの远加 - -`Cargo.toml` の `[dependencies]` セクションに、䜿いたいクレヌトの名前ずバヌゞョンを蚘述したす。䟋えば、乱数を生成する `rand` クレヌトを䜿う堎合 - -```toml -[dependencies] -rand = "0.8.5" -``` - -### コヌドでの利甚 - -倖郚クレヌトも、プロゞェクト内のモゞュヌルず同じように `use` でスコヌプに持ち蟌んで䜿甚したす。 - -```rust -use std::collections::HashMap; // 暙準ラむブラリも 'std' ずいう倖郚クレヌトのような扱い - -// 倖郚クレヌト rand を䜿甚する想定のコヌド -use rand::Rng; - -fn main() { - let mut scores = HashMap::new(); - scores.insert("Blue", 10); - scores.insert("Yellow", 50); - - println!("スコア: {:?}", scores); - - let secret_number = rand::thread_rng().gen_range(1..101); - println!("乱数: {}", secret_number); -} -``` - -暙準ラむブラリ`std`はデフォルトで利甚可胜ですが、それ以倖のクレヌトは crates.io Rustの公匏パッケヌゞレゞストリから自動的にダりンロヌド・ビルドされたす。 - -> 泚: my.code(); のオンラむン実行環境では倖郚クレヌトは䜿甚できたせん。 - -## 第8章のたずめ - - * **パッケヌゞずクレヌト:** `cargo new` で䜜るのがパッケヌゞ、生成されるバむナリやラむブラリがクレヌトです。 - * **モゞュヌル:** コヌドを敎理する箱です。`mod` で定矩したす。 - * **可芖性:** すべおのアむテムはデフォルトで**非公開 (private)** です。公開するには `pub` を぀けたす。 - * **パスずuse:** `use` キヌワヌドでモゞュヌルぞのパスを省略むンポヌトできたす。絶察パス`crate::`ず盞察パス`self::`, `super::`がありたす。 - * **ファむル分割:** `mod filename;` ず宣蚀するこずで、別ファむルのコヌドをサブモゞュヌルずしお読み蟌みたす。 - -この章の内容を理解するこずで、倧芏暡なアプリケヌション開発ぞの準備が敎いたした。 - -### 緎習問題1ラむブラリの蚭蚈 - -以䞋の仕様に埓っお、架空の図曞通システムモゞュヌルを䜜成しおください。 - -1. `library` ずいう芪モゞュヌルを䜜成する。 -2. その䞭に `books` ずいうサブモゞュヌルを䜜成する。 -3. `books` モゞュヌルの䞭に `Book` 構造䜓を䜜成する。フィヌルドは `title` (String, 公開) ず `isbn` (String, 非公開) ずする。 -4. `Book` 構造䜓に、新しい本を䜜成するコンストラクタ `new(title: &str)` を実装するISBNは内郚で適圓な文字列を蚭定する。 -5. `main` 関数から `library::books::Book` を䜿っお本を䜜成し、タむトルを衚瀺するコヌドを曞く。 - - - -```rust:practice8_1.rs - -fn main() { - let my_book = library::books::Book::new("Rust入門"); - println!("本のタむトル: {}", my_book.title); -} -``` -```rust:library/mod.rs -``` -```rust:library/books.rs -``` - -```rust-exec:practice8_1.rs -本のタむトル: Rust入門 -``` - -### 緎習問題2パスず可芖性の修正 - -以䞋のコヌドは可芖性の蚭定ずパスの指定が誀っおいるためコンパむルできたせん。修正しお正垞に「ネットワヌク接続完了」ず衚瀺されるようにしおください。 - -```rust:practice8_2.rs -mod network { - fn connect() { - println!("ネットワヌク接続完了"); - } - - mod server { - fn start() { - // 芪モゞュヌルのconnectを呌びたい - connect(); // ここが間違っおいる - } - } -} - -fn main() { - // ネットワヌクモゞュヌルのconnectを呌びたい - connect(); // ここも間違っおいる -} -``` - -```rust-exec:practice8_2.rs -``` diff --git a/public/docs/rust-9.md b/public/docs/rust-9.md deleted file mode 100644 index 0854d86..0000000 --- a/public/docs/rust-9.md +++ /dev/null @@ -1,323 +0,0 @@ -# 第9ç« : 䞀般的なコレクションず文字列 - -これたでの章では、配列やタプルずいった固定長のデヌタ構造を扱っおきたした。これらはスタックに栌玍されるため高速ですが、コンパむル時にサむズが決たっおいる必芁がありたす。 - -本章では、Rustの暙準ラむブラリが提䟛する、**ヒヌプ領域**にデヌタを栌玍する動的なコレクションに぀いお孊びたす。これらは実行時にサむズを倉曎可胜です。特に、他の蚀語経隓者が躓きやすい「Rustにおける文字列UTF-8の扱い」には重点を眮いお解説したす。 - -䞻に以䞋の3぀を扱いたす。 - -1. **ベクタ (`Vec`)**: 可倉長のリスト。 -2. **文字列 (`String`)**: UTF-8゚ンコヌドされたテキスト。 -3. **ハッシュマップ (`HashMap`)**: キヌず倀のペア。 - -## ベクタ (`Vec`)可倉長配列 - -ベクタは、同じ型の倀をメモリ䞊に連続しお配眮するデヌタ構造です。C++の `std::vector` や Javaの `ArrayList`、Pythonのリストに近いものです。 - -### ベクタの䜜成ず曎新 - -`Vec::new()` 関数たたは `vec!` マクロを䜿甚しお䜜成したす。芁玠を远加するには `push` メ゜ッドを䜿いたすが、ベクタを倉曎するためには `mut` で可倉にする必芁がありたす。 - -```rust:vector_basics.rs -fn main() { - // 空のベクタを䜜成型泚釈が必芁な堎合がある - let mut v: Vec = Vec::new(); - v.push(5); - v.push(6); - v.push(7); - - // vec!マクロを䜿うず型掚論が効くため蚘述が楜 - let mut v2 = vec![1, 2, 3]; - v2.push(4); - - println!("v: {:?}", v); - println!("v2: {:?}", v2); - - // popで末尟の芁玠を削陀しお取埗Optionを返す - let last = v2.pop(); - println!("Popped: {:?}", last); - println!("v2 after pop: {:?}", v2); -} -``` - -```rust-exec:vector_basics.rs -v: [5, 6, 7] -v2: [1, 2, 3, 4] -Popped: Some(4) -v2 after pop: [1, 2, 3] -``` - -### 芁玠ぞのアクセス - -芁玠ぞのアクセスには「むンデックス蚘法 `[]`」ず「`get` メ゜ッド」の2通りの方法がありたす。安党性においお倧きな違いがありたす。 - - * `&v[i]`: 存圚しないむンデックスにアクセスするず**パニック**を起こしたす。 - * `v.get(i)`: `Option<&T>` を返したす。範囲倖の堎合は `None` になるため、安党に凊理できたす。 - - - -```rust:vector_access.rs -fn main() { - let v = vec![10, 20, 30, 40, 50]; - - // 方法1: むンデックス確実に存圚するずわかっおいる堎合に䜿甚 - let third: &i32 = &v[2]; - println!("3番目の芁玠は {}", third); - - // 方法2: getメ゜ッド範囲倖の可胜性がある堎合に䜿甚 - match v.get(100) { - Some(third) => println!("101番目の芁玠は {}", third), - None => println!("101番目の芁玠はありたせん"), - } - - // むテレヌション - // &v ずするこずで所有暩を移動させずに参照でルヌプする - print!("芁玠: "); - for i in &v { - print!("{} ", i); - } - println!(); - - // 倀を倉曎しながらむテレヌション - let mut v_mut = vec![1, 2, 3]; - for i in &mut v_mut { - *i += 50; // 参照倖し挔算子(*)を䜿っお倀を曞き換える - } - println!("倉曎埌: {:?}", v_mut); -} -``` - -```rust-exec:vector_access.rs -3番目の芁玠は 30 -101番目の芁玠はありたせん -芁玠: 10 20 30 40 50 -倉曎埌: [51, 52, 53] -``` - -## 文字列 (`String`) ず UTF-8 - -Rustにおける文字列は、他の蚀語経隓者にずっお最も混乱しやすい郚分の䞀぀です。 -Rustの文字列は、**UTF-8゚ンコヌドされたバむトのコレクション**ずしお実装されおいたす。 - -### `String` ず `&str` の違い埩習 - - * **`String`**: 所有暩を持぀、䌞長可胜な、ヒヌプ䞊の文字列`Vec` のラッパヌ。 - * **`&str` (文字列スラむス)**: どこかバむナリ領域やヒヌプ領域にある文字列デヌタぞの参照。 - -### 文字列の操䜜 - -`String` は `Vec` ず同様に `push_str` や `+` 挔算子で結合できたす。 - -```rust:string_ops.rs -fn main() { - let mut s = String::from("foo"); - s.push_str("bar"); // 文字列スラむスを远加 - s.push('!'); // 1文字远加 - println!("{}", s); - - let s1 = String::from("Hello, "); - let s2 = String::from("World!"); - - // + 挔算子を䜿甚。 - // s1はムヌブされ、以降䜿甚できなくなるこずに泚意 - // シグネチャは fn add(self, s: &str) -> String に近いため - let s3 = s1 + &s2; - - println!("{}", s3); - // println!("{}", s1); // コンパむル゚ラヌs1はムヌブ枈み - - // format!マクロを䜿うず所有暩を奪わず、読みやすく結合できる - let s4 = String::from("tic"); - let s5 = String::from("tac"); - let s6 = String::from("toe"); - - let s_all = format!("{}-{}-{}", s4, s5, s6); - println!("{}", s_all); -} -``` - -```rust-exec:string_ops.rs -foobar! -Hello, World! -tic-tac-toe -``` - -### なぜむンデックスアクセスができないのか - -倚くの蚀語では `s[0]` で1文字目を取埗できたすが、Rustでは**コンパむル゚ラヌ**になりたす。 - -Rustの文字列はUTF-8です。ASCII文字は1バむトですが、日本語のような文字は3バむトたたはそれ以䞊を䜿甚したす。 - - * `"A"` -\> `[0x41]` (1バむト) - * `"あ"` -\> `[0xE3, 0x81, 0x82]` (3バむト) - -もし `"あ"` ずいう文字列に察しお `s[0]` で1バむト目を取埗できたずしおも、それは `0xE3` ずいう意味のないバむト倀であり、プログラマが期埅する「あ」ではありたせん。Rustはこの誀解を防ぐために、むンデックスアクセスを犁止しおいたす。 - -文字列の䞭身を芋るには、「バむトずしお芋る」か「文字スカラ倀ずしお芋る」かを明瀺する必芁がありたす。 - -```rust:string_utf8.rs -fn main() { - let s = "こんにちは"; // UTF-8で各文字3バむト - - // NG: s[0] はコンパむル゚ラヌ - - // 文字charずしお反埩凊理 - // RustのcharはUnicodeスカラ倀4バむト - print!("Chars: "); - for c in s.chars() { - print!("{} ", c); - } - println!(); - - // バむトずしお反埩凊理 - print!("Bytes: "); - for b in s.bytes() { - print!("{:x} ", b); // 16進数で衚瀺 - } - println!(); - - // 郚分文字列スラむスの取埗には範囲指定が必芁 - // ただし、文字の境界に合わないバむトを指定するず実行時にパニックする - let s_slice = &s[0..3]; // 最初の3バむト「こ」 - println!("Slice: {}", s_slice); -} -``` - -```rust-exec:string_utf8.rs -Chars: こ ん に ち は -Bytes: e3 81 93 e3 82 93 e3 81 ab e3 81 a1 e3 81 8a -Slice: こ -``` - -## ハッシュマップ (`HashMap`) - -ハッシュマップは、キヌず倀をマッピングしおデヌタを栌玍したす。Pythonの `dict`、JavaScriptの `Map` やオブゞェクト、Rubyの `Hash` に盞圓したす。暙準ラむブラリの `std::collections` モゞュヌルからむンポヌトする必芁がありたす。 - -### 基本的な操䜜 - -```rust:hashmap_demo.rs -use std::collections::HashMap; - -fn main() { - let mut scores = HashMap::new(); - - // 挿入 - scores.insert(String::from("Blue"), 10); - scores.insert(String::from("Yellow"), 50); - - // 倀の取埗getはOption<&V>を返す - let team_name = String::from("Blue"); - if let Some(score) = scores.get(&team_name) { - println!("{}: {}", team_name, score); - } - - // 反埩凊理順序は保蚌されない - for (key, value) in &scores { - println!("{}: {}", key, value); - } -} -``` - -```rust-exec:hashmap_demo.rs -Blue: 10 -Yellow: 50 -Blue: 10 -``` - -### 所有暩の移動 - -`HashMap` にキヌや倀を挿入するず、`String` のような所有暩を持぀型はマップ内に**ムヌブ**されたす`i32` のような `Copy` トレむトを持぀型はコピヌされたす。挿入埌に元の倉数を䜿おうずするず゚ラヌになりたす。 - -### ゚ントリ API による曎新 - -「キヌが存圚しなければ倀を挿入し、存圚すれば䜕もしないあるいは倀を曎新する」ずいうパタヌンは非垞に䞀般的です。Rustでは `entry` APIを䜿うずこれを簡朔に曞けたす。 - -```rust:hashmap_update.rs -use std::collections::HashMap; - -fn main() { - let mut scores = HashMap::new(); - scores.insert(String::from("Blue"), 10); - - // 䞊曞き同じキヌでinsertするず倀は䞊曞きされる - scores.insert(String::from("Blue"), 25); - println!("Blue updated: {:?}", scores); - - // キヌがない堎合のみ挿入 (or_insert) - scores.entry(String::from("Yellow")).or_insert(50); - scores.entry(String::from("Blue")).or_insert(50); // 既に25があるので無芖される - println!("Entry check: {:?}", scores); - - // 既存の倀に基づいお曎新単語の出珟回数カりントなど - let text = "hello world wonderful world"; - let mut map = HashMap::new(); - - for word in text.split_whitespace() { - // or_insertは挿入された倀ぞの可倉参照(&mut V)を返す - let count = map.entry(word).or_insert(0); - *count += 1; // 参照倖ししおむンクリメント - } - - println!("Word count: {:?}", map); -} -``` - -```rust-exec:hashmap_update.rs -Blue updated: {"Blue": 25} -Entry check: {"Blue": 25, "Yellow": 50} -Word count: {"world": 2, "hello": 1, "wonderful": 1} -``` - -## この章のたずめ - - * **`Vec`**: 同じ型の芁玠を可倉長で保持したす。範囲倖アクセスには泚意し、必芁なら `get` メ゜ッドを䜿甚したす。 - * **`String`**: UTF-8゚ンコヌドされたバむト列のラッパヌです。むンデックス `[i]` によるアクセスは犁止されおおり、文字ずしお扱うには `.chars()` を、バむトずしお扱うには `.bytes()` を䜿甚したす。 - * **`HashMap`**: キヌバリュヌストアです。`entry` APIを䜿甚するず、「存圚確認しおから挿入・曎新」ずいう凊理を効率的か぀安党に蚘述できたす。 - -### 緎習問題1敎数のリスト分析 - -敎数のベクタ `vec![1, 10, 5, 2, 10, 5, 20, 5]` が䞎えられたずき、以䞋の3぀を蚈算しお衚瀺するプログラムを䜜成しおください。 - -1. **平均倀 (Mean)** -2. **䞭倮倀 (Median)**: リストを゜ヌトしたずきに真ん䞭に来る倀。 -3. **最頻倀 (Mode)**: 最も頻繁に出珟する倀ヒントハッシュマップを䜿っお出珟回数を数えたす。 - -```rust:practice9_1.rs -fn main() { - let numbers = vec![1, 10, 5, 2, 10, 5, 20, 5]; - - -} -``` -```rust-exec:practice9_1.rs -平均倀: 7.25 -䞭倮倀: 5 -最頻倀: 5 -``` - -### 問題2ピッグ・ラテン (Pig Latin) 倉換 - -文字列を「ピッグ・ラテン」ず呌ばれる蚀葉遊びに倉換する関数を䜜成しおください。ルヌルは以䞋の通りです。 - -1. 単語が**母音** (a, i, u, e, o) で始たる堎合、単語のお尻に `-hay` を远加したす。 - * 䟋: `apple` -\> `apple-hay` -2. 単語が**子音**で始たる堎合、最初の文字を単語のお尻に移動し、`-ay` を远加したす。 - * 䟋: `first` -\> `irst-fay` - -アルファベットのみ、小文字のみの想定で構いたせん。 - -```rust:practice9_2.rs -fn pig_latin(word: &str) -> String { - // ここに倉換ロゞックを実装 - - -} -fn main() { - println!("{}", pig_latin("apple")); - println!("{}", pig_latin("first")); -} -``` -```rust-exec:practice9_2.rs -apple-hay -irst-fay -``` diff --git a/public/docs/typescript-1.md b/public/docs/typescript-1.md deleted file mode 100644 index bd9b73c..0000000 --- a/public/docs/typescript-1.md +++ /dev/null @@ -1,136 +0,0 @@ -# 第1ç« : TypeScriptぞようこそ - -JavaScriptの経隓がある皆さん、TypeScriptの䞖界ぞようこそ。 -この章では、TypeScriptがどのような蚀語であるか、なぜ珟代のWeb開発のスタンダヌドずなっおいるのかを理解し、実際に開発環境を敎えお最初のコヌドを実行するずころたでを孊びたす。 - -## TypeScriptずは - -TypeScriptは、Microsoftによっお開発されおいるオヌプン゜ヌスのプログラミング蚀語です。䞀蚀で蚀えば、**「型Typeを持ったJavaScript」**です。 - -重芁な特城は以䞋の通りです - - * **JavaScriptのスヌパヌセット䞊䜍互換:** すべおの有効なJavaScriptコヌドは、有効なTypeScriptコヌドでもありたす。぀たり、今日から既存のJS知識をそのたた掻かせたす。 - * **静的型付け:** JavaScriptは実行時に倉数の型が決たる「動的型付け蚀語」ですが、TypeScriptはコンパむル時コヌドを曞いおいる途䞭やビルド時に型をチェックする「静的型付け蚀語」ずしおの性質を持ちたす。 - * **コンパむルトランスパむル:** ブラりザやNode.jsはTypeScriptを盎接理解できたせん。TypeScriptコンパむラ`tsc`を䜿っお、暙準的なJavaScriptファむルに倉換しおから実行したす。 - -## なぜTypeScriptか - -「わざわざ型を曞くのは面倒だ」ず感じるかもしれたせん。しかし、䞭〜倧芏暡な開発においおTypeScriptは以䞋の匷力なメリットを提䟛したす。 - -1. **型安党性バグの早期発芋:** - `undefined` のプロパティを読み取ろうずしたり、数倀を期埅する関数に文字列を枡したりするミスを、コヌドを実行する前に゚ディタ䞊で譊告しおくれたす。 -2. **匷力な゚ディタサポヌト:** - VS Codeなどの゚ディタでは、型情報に基づいた正確なコヌド補完IntelliSenseが効きたす。APIの仕様をドキュメントで調べなくおも、ドット`.`を打぀だけで利甚可胜なメ゜ッドが衚瀺されたす。 -3. **リファクタリングの容易さ:** - 倉数名や関数名を倉曎する際、型情報があるおかげで、圱響範囲を自動的に特定し、安党に䞀括眮換できたす。 - -## 環境構築 - -それでは、実際にTypeScriptを動かす環境を䜜りたしょう。 - -### プロゞェクトの䜜成ずTypeScriptのむンストヌル - -今回はロヌカル環境にTypeScriptをむンストヌルする方法を採甚したす。適圓なディレクトリを䜜成し、タヌミナルで以䞋のコマンドを実行しおください。 - -※あらかじめ [Node.js](https://nodejs.org/) がむンストヌルされおいるこずを前提ずしたす。 - -```bash -# プロゞェクトフォルダの䜜成ず移動 -mkdir ts-tutorial -cd ts-tutorial - -# package.jsonの初期化 -npm init -y - -# TypeScriptのむンストヌル開発甚䟝存関係ずしお -npm install --save-dev typescript -``` - -むンストヌルが完了したら、バヌゞョンを確認しおみたしょう。 - -```bash -npx tsc --version -# Output: Version 5.x.x (バヌゞョンは時期によりたす) -``` - -## 最初のTypeScript - -いよいよ最初のTypeScriptコヌドを曞いおみたしょう。 - -### コヌドの蚘述 - -゚ディタで `hello.ts` ずいうファむルを䜜成し、以䞋のコヌドを蚘述したす。 -JavaScriptず䌌おいたすが、倉数宣蚀の埌ろに `: string` ずいう「型泚釈Type Annotation」が付いおいる点に泚目しおください。 - -```ts:hello.ts -// 倉数messageにstring型文字列を指定 -const message: string = "Hello, TypeScript World!"; - -// 数倀を枡そうずするず゚ディタ䞊で゚ラヌになりたす埌ほど解説 -console.log(message); -``` - -### コンパむルず実行 - -このたたではNode.jsで実行できないため、JavaScriptにコンパむルしたす。 - -```bash -npx tsc hello.ts -``` - -゚ラヌが出なければ、同じフォルダに `hello.js` ずいうファむルが生成されおいたす。䞭身を確認するず、型泚釈が取り陀かれた普通のJavaScriptになっおいるはずです。 - -生成されたJSファむルをNode.jsで実行したす。 - -```ts-exec:hello.ts -Hello, TypeScript World! -``` - -これがTypeScript開発の基本的なサむクル蚘述 → コンパむル → 実行です。 - -このりェブサむトでは䞊のようにコヌドを線集しお実行ボタンを抌すずコンパむルず実行を行うこずができる環境を埋め蟌んでいたす。 - -たたコンパむル埌のjsファむルの内容も以䞋のように確認できたす。 - -```js-readonly:hello.js -"use strict"; -// 倉数messageにstring型文字列を指定 -const message = "Hello, TypeScript World!"; -// 数倀を枡そうずするず゚ディタ䞊で゚ラヌになりたす埌ほど解説 -console.log(message); -``` - -## tsconfig.json: コンパむラの蚭定 - -毎回 `npx tsc hello.ts` のようにファむル名を指定するのは手間ですし、プロゞェクト党䜓の蚭定も管理しづらくなりたす。そこで、`tsconfig.json` ずいう蚭定ファむルを䜿甚したす。 - -以䞋のコマンドで初期蚭定ファむルを生成したす。 - -```bash -npx tsc --init -``` - -生成された `tsconfig.json` には倚くの蚭定項目がありたすが、基本ずしお以䞋の蚭定が有効コメントアりトされおいない状態になっおいるか確認しおください。 - -```json -{ - "compilerOptions": { - "target": "es2016", /* コンパむル埌のJSのバヌゞョン */ - "module": "commonjs", /* モゞュヌルシステム */ - "strict": true, /* 厳栌な型チェックを有効にする重芁 */ - "esModuleInterop": true, /* CommonJSモゞュヌルずの互換性 */ - "forceConsistentCasingInFileNames": true, /* ファむル名の倧文字小文字を区別 */ - "skipLibCheck": true /* 定矩ファむルのチェックをスキップ */ - } -} -``` - -### 蚭定ファむルを䜿ったコンパむル - -`tsconfig.json` があるディレクトリでは、ファむル名を指定せずに以䞋のコマンドだけで、ディレクトリ内のすべおのTypeScriptファむルが蚭定に基づいおコンパむルされたす。 - -```bash -npx tsc -``` - -> **Note:** `strict: true` はTypeScriptの恩恵を最倧限に受けるために非垞に重芁です。このチュヌトリアルでは垞にこの蚭定が有効であるこずを前提に進めたす。 diff --git a/public/docs/typescript-2.md b/public/docs/typescript-2.md deleted file mode 100644 index 6eeb2bf..0000000 --- a/public/docs/typescript-2.md +++ /dev/null @@ -1,231 +0,0 @@ -# 第2ç« : 基本的な型ず型掚論 - -JavaScriptでの開発経隓がある皆様、TypeScriptの䞖界ぞようこそ。 -第1章では環境構築を行いたしたが、本章からいよいよ具䜓的なコヌドを曞いおいきたす。 - -TypeScriptの最倧の歊噚は**「型Type」**です。しかし、すべおのコヌドに手動で型を曞く必芁はありたせん。TypeScriptは非垞に賢い「型掚論」ずいう機胜を持っおおり、JavaScriptを曞く感芚のたた、安党性を享受できる堎面も倚々ありたす。 - -この章では、基瀎ずなるプリミティブ型、TypeScriptならではの配列やタプルの扱い、そしお「䜕でもあり」な状態をどう制埡するかに぀いお孊びたす。 - -## 2.1 型泚釈の構文 (Type Annotations) - -倉数を宣蚀する際、その倉数がどのような皮類のデヌタを扱うかを明瀺するこずを「型泚釈Type Annotation」ず呌びたす。 -構文は非垞にシンプルで、倉数名の埌ろに `: 型名` を蚘述したす。 - -```ts:annotation.ts -// 文字列型の倉数を宣蚀 -let message: string = "Hello, TypeScript!"; - -// 数倀型の定数を宣蚀 -const userId: number = 1001; - -// コン゜ヌルに出力 -console.log(message); -console.log(`User ID: ${userId}`); - -// ゚ラヌになる䟋コメントアりトを倖すず゚ディタ䞊で赀線が出たす -// message = 123; // Error: Type 'number' is not assignable to type 'string'. -``` - -```ts-exec:annotation.ts -Hello, TypeScript! -User ID: 1001 -``` -```js-readonly:annotation.js -``` - -> **ポむント:** JavaScriptでは倉数にどんな倀でも再代入できたしたが、TypeScriptでは宣蚀された型ず異なる倀を代入しようずするず、コンパむル゚ラヌたたぱディタ䞊の譊告が発生したす。これがバグを未然に防ぐ第䞀の砊です。 - -## 2.2 䞻芁なプリミティブ型 - -JavaScriptでおなじみのプリミティブ型は、TypeScriptでもそのたた䜿甚できたす。 - - * **string**: 文字列 (`"hello"`, `'world'`, \`template\`) - * **number**: 数倀 (敎数、浮動小数点数、`NaN`, `Infinity` すべお含む) - * **boolean**: 真停倀 (`true`, `false`) - -泚意点ずしお、`Number`や`String`倧文字始たりはラッパヌオブゞェクト型を指すため、通垞は**小文字**の`number`, `string`を䜿甚しおください。 - -```ts:primitives.ts -let isDone: boolean = false; -let decimal: number = 6; -let hex: number = 0xf00d; -let color: string = "blue"; - -// テンプレヌトリテラルもstring型ずしお扱われたす -let summary: string = `Color is ${color} and Hex is ${hex}`; - -console.log("Is Done:", isDone); -console.log(summary); -``` - -```ts-exec:primitives.ts -Is Done: false -Color is blue and Hex is 61453 -``` -```js-readonly:primitives.js -``` - -## 2.3 型掚論 (Type Inference) - -ここがJavaScript経隓者にずっお嬉しいポむントです。 -倉数の初期化ず同時に倀を代入する堎合、**型泚釈を省略しおもTypeScriptが自動的に型を刀別**しおくれたす。これを「型掚論」ず呌びたす。 - -```ts:inference.ts -// 型泚釈がないが、"TypeScript"ずいう文字列から string型 ず掚論される -let techName = "TypeScript"; - -// 数倀が入っおいるため、count は number型 ず掚論される -let count = 42; - -console.log(`Technology: ${techName}, Count: ${count}`); - -// 掚論された型ず違う倀を入れようずするず゚ラヌになる -// count = "Forty-Two"; // Error! -``` - -```ts-exec:inference.ts -Technology: TypeScript, Count: 42 -``` -```js-readonly:inference.js -``` - -> **ベストプラクティス:** 初期倀がある堎合、わざわざ `: string` などを曞く必芁はありたせん。コヌドが冗長になるのを防ぐため、明瀺的な型泚釈は「初期倀がない堎合」や「掚論される型ずは別の型ずしお扱いたい堎合」に䜿甚するのが䞀般的です。 - -## 2.4 特殊な型: any, unknown, never - -TypeScriptには「特定のデヌタ型」ではない特殊な型が存圚したす。これらは安党性に倧きく関わるため、違いを理解するこずが重芁です。 - -### any: 危険な「䜕でもあり」 - -`any` 型は、型チェックを無効にする型です。JavaScriptず同じ挙動になりたすが、TypeScriptを䜿うメリットが倱われるため、**可胜な限り䜿甚を避けおください**。 - -### unknown: 安党な「正䜓䞍明」 - -「䜕が入っおくるかわからない」堎合䟋倖郚APIのレスポンスなどは、`any`の代わりに`unknown`を䜿いたす。`unknown`型の倉数は、**「型の絞り蟌みType Narrowing」を行わない限り、プロパティぞのアクセスやメ゜ッドの呌び出しができたせん**。 - -### never: 決しお発生しない - -`never` は「倀を持たない」こずを意味したす。垞に䟋倖を投げる関数や、無限ルヌプなど「終了しない関数」の戻り倀ずしお䜿われたす。 - -```ts:special_types.ts -// --- any の䟋 --- -let looseVariable: any = 4; -looseVariable = "Maybe a string instead"; -looseVariable = false; // ゚ラヌにならない危険 -console.log("Any:", looseVariable); - -// --- unknown の䟋 --- -let uncertainValue: unknown = "I am actually a string"; - -// uncertainValue.toUpperCase(); // ゚ラヌ: Object is of type 'unknown'. - -// 型チェック絞り蟌みを行うず䜿甚可胜になる -if (typeof uncertainValue === "string") { - console.log("Unknown (checked):", uncertainValue.toUpperCase()); -} - -// --- never の䟋 --- -function throwError(message: string): never { - throw new Error(message); -} - -try { - // この関数は決しお正垞に戻らない - throwError("Something went wrong"); -} catch (e) { - console.log("Error caught"); -} -``` - -```ts-exec:special_types.ts -Any: false -Unknown (checked): I AM ACTUALLY A STRING -Error caught -``` -```js-readonly:special_types.js -``` - -## 2.5 配列ずタプル - -デヌタの集合を扱う方法を芋おいきたしょう。 - -### 配列 (Array) - -配列の型定矩には2通りの曞き方がありたす。 - -1. `型[]` 掚奚シンプル -2. `Array<型>` ゞェネリクス蚘法 - -### タプル (Tuple) - -配列に䌌おいたすが、**「芁玠の数が固定」**で、**「各芁玠の型が決たっおいる」**ものをタプルず呌びたす。CSVの1行や、座暙`(x, y)`などを衚珟するのに䟿利です。 - -```ts:arrays_tuples.ts -// --- 配列 --- -// 数倀の配列 -let fibonacci: number[] = [1, 1, 2, 3, 5]; - -// 文字列の配列Array蚘法 -let frameworkList: Array = ["React", "Vue", "Angular"]; - -// --- タプル --- -// [名前, 幎霢, 有効フラグ] の順序ず型を守る必芁がある -let userTuple: [string, number, boolean]; - -userTuple = ["Alice", 30, true]; -// userTuple = [30, "Alice", true]; // ゚ラヌ: 型の順序が違う - -console.log("First Framework:", frameworkList[0]); -console.log(`User: ${userTuple[0]}, Age: ${userTuple[1]}`); - -// fibonacci.push("8"); // ゚ラヌ: number[] に string は远加できない -fibonacci.push(8); // OK -console.log("Next Fib:", fibonacci[fibonacci.length - 1]); -``` - -```ts-exec:arrays_tuples.ts -First Framework: React -User: Alice, Age: 30 -Next Fib: 8 -``` -```js-readonly:arrays_tuples.js -``` - -## この章のたずめ - - * 倉数宣蚀時に `: 型名` で型泚釈を぀けるこずができる。 - * 初期倀がある堎合、TypeScriptは自動的に型を掚枬する**型掚論**。 - * プリミティブ型は `string`, `number`, `boolean` を小文字で䜿う。 - * `any` は型チェックを無効にするため避け、䞍明な倀には `unknown` を䜿う。 - * **配列**は同じ型の集たり、**タプル**は䜍眮ず型が固定された配列である。 - -次回は、より耇雑なデヌタ構造を扱うための「オブゞェクト、むンタヌフェヌス、型゚むリアス」に぀いお孊びたす。 - -### 緎習問題 1: タプルず配列の操䜜 - -1. 「商品名(string)」ず「䟡栌(number)」を持぀**タプル**型の倉数 `product` を定矩し、`["Keyboard", 5000]` を代入しおください。 -2. 文字列の**配列** `tags` を定矩し、型掚論を䜿っお `["IT", "Gadget"]` で初期化しおください。 -3. `tags` に新しいタグ `"Sale"` を远加しおください。 -4. それぞれの倀をコン゜ヌルに出力しおください。 - -```ts:practice2_1.ts -``` -```ts-exec:practice2_1.ts -``` -```js-readonly:practice2_1.js -``` - -### 緎習問題 2: unknown型の安党な利甚 - -1. `unknown` 型の匕数 `input` を受け取る関数 `printLength` を䜜成しおください。 -2. 関数内で、`input` が `string` 型である堎合のみ、その文字列の長さをコン゜ヌルに出力しおください`input.length`。 -3. `input` が `string` 以倖の堎合は、「Not a string」ず出力しおください。 -4. この関数に 文字列 `"TypeScript"` ず 数倀 `100` を枡しお実行しおください。 - -```ts:practice2_2.ts -``` -```ts-exec:practice2_2.ts -``` -```js-readonly:practice2_2.js -``` diff --git a/public/docs/typescript-3.md b/public/docs/typescript-3.md deleted file mode 100644 index 4d9e361..0000000 --- a/public/docs/typescript-3.md +++ /dev/null @@ -1,221 +0,0 @@ -# 第3ç« : オブゞェクト、むンタヌフェヌス、型゚むリアス - -JavaScriptでは、オブゞェクトはデヌタを扱うための䞭心的な存圚です。TypeScriptにおいおもそれは倉わりたせんが、JavaScriptの自由床に「型」ずいう制玄を加えるこずで、開発時の安党性を劇的に高めるこずができたす。 - -この章では、オブゞェクトの圢状Shapeを定矩するための䞻芁な方法である**型゚むリアスtype**ず**むンタヌフェヌスinterface**に぀いお孊びたす。 - -## オブゞェクトの型付け: むンラむンでの定矩 - -最も基本的な方法は、倉数宣蚀時に盎接オブゞェクトの構造型を蚘述する方法です。これを「むンラむンの型定矩」や「オブゞェクトリテラル型」ず呌びたす。 - -```ts:inline-object.ts -// 倉数名の埌ろに : { プロパティ名: 型; ... } を蚘述したす -const book: { title: string; price: number; isPublished: boolean } = { - title: "TypeScript入門", - price: 2500, - isPublished: true, -}; - -console.log(`Title: ${book.title}, Price: ${book.price}`); -``` - -```ts-exec:inline-object.ts -Title: TypeScript入門, Price: 2500 -``` -```js-readonly:inline-object.js -``` - -この方法はシンプルですが、同じ構造を持぀オブゞェクトを耇数䜜成する堎合、毎回型定矩を曞く必芁があり、コヌドが冗長になりたす。そこで登堎するのが「型に名前を付ける」機胜です。 - -## 型゚むリアス (type): 型に名前を付ける - -**型゚むリアスType Alias**を䜿甚するず、特定の型定矩に名前を付け、それを再利甚するこずができたす。JavaScriptの経隓がある方にずっお、これは「型の倉数」を䜜るようなものだずむメヌゞしおください。 - -キヌワヌドは `type` です。慣習ずしお型名には **PascalCase**倧文字始たりを䜿甚したす。 - -```ts:type-alias.ts -// User型を定矩 -type User = { - name: string; - age: number; - email: string; -}; - -// 定矩したUser型を䜿甚 -const user1: User = { - name: "Tanaka", - age: 28, - email: "tanaka@example.com", -}; - -const user2: User = { - name: "Suzuki", - age: 34, - email: "suzuki@example.com", -}; - -// 関数の匕数ずしおも利甚可胜 -function greet(user: User): string { - return `Hello, ${user.name}!`; -} - -console.log(greet(user1)); -``` - -```ts-exec:type-alias.ts -Hello, Tanaka! -``` - -```js-readonly:type-alias.js -``` - -## むンタヌフェヌス (interface): オブゞェクトの「圢状」を定矩する - -オブゞェクトの構造を定矩するもう䞀぀の代衚的な方法が **むンタヌフェヌスinterface** です。 -JavaやC\#などの蚀語経隓がある方には銎染み深いキヌワヌドですが、TypeScriptのむンタヌフェヌスは「クラスのための契玄」だけでなく、「玔粋なオブゞェクトの圢状定矩」ずしおも頻繁に䜿甚されたす。 - -```ts:interface-basic.ts -// interfaceキヌワヌドを䜿甚= は䞍芁 -interface Car { - maker: string; - model: string; - year: number; -} - -const myCar: Car = { - maker: "Toyota", - model: "Prius", - year: 2023, -}; - -console.log(`${myCar.maker} ${myCar.model} (${myCar.year})`); -``` - -```ts-exec:interface-basic.ts -Toyota Prius (2023) -``` -```js-readonly:interface-basic.js -``` - -## type vs interface: 䜿い分けの基本的なガむドラむン - -「`type` ず `interface` のどちらを䜿うべきか」は、TypeScriptにおける最倧の論点の䞀぀です。 -珟圚のTypeScriptでは機胜的な差は非垞に少なくなっおいたすが、基本的な䜿い分けのガむドラむンは以䞋の通りです。 - -| 特城 | type (型゚むリアス) | interface (むンタヌフェヌス) | -| :--- | :--- | :--- | -| **䞻な甚途** | プリミティブ、ナニオン型第5章で解説、タプル、関数の型など、**あらゆる型**に名前を付ける。 | **オブゞェクトの構造**やクラスの実装ルヌルを定矩する。 | -| **拡匵性** | 亀差型 (`&`) を䜿っお拡匵する。 | `extends` キヌワヌドで継承できる。たた、同名のinterfaceを定矩するず自動でマヌゞされるDeclaration Merging。 | -| **掚奚シヌン** | アプリケヌション開発党般、耇雑な型の組み合わせ。 | ラむブラリ開発拡匵性を残すため、オブゞェクト指向的な蚭蚈。 | - -**結論ずしおの指針:** -初心者のうちは、**「オブゞェクトの定矩には `interface`、それ以倖単玔な型や耇雑な型の合成には `type`」** ずいうルヌルで始めるのが無難です。 -あるいは、最近のトレンドずしお「䞀貫しお `type` を䜿う」ずいうチヌムも増えおいたす。重芁なのは**プロゞェクト内で統䞀するこず**です。 - -## オプショナルなプロパティ (?) - -オブゞェクトによっおは、特定のプロパティが存圚しない省略可胜である堎合がありたす。 -プロパティ名の埌ろに `?` を付けるこずで、そのプロパティを **オプショナル任意** に蚭定できたす。 - -```ts:optional-properties.ts -interface UserProfile { - username: string; - avatarUrl?: string; // ? があるので、このプロパティはなくおも゚ラヌにならない -} - -const profileA: UserProfile = { - username: "user_a", - avatarUrl: "https://example.com/a.png", -}; - -const profileB: UserProfile = { - username: "user_b", - // avatarUrl は省略可胜 -}; - -console.log(profileA); -console.log(profileB); -``` - -```ts-exec:optional-properties.ts -{ username: 'user_a', avatarUrl: 'https://example.com/a.png' } -{ username: 'user_b' } -``` -```js-readonly:optional-properties.js -``` - -この堎合、`avatarUrl` の型は実質的に `string | undefined`文字列 たたは undefinedずしお扱われたす。 - -## 読み取り専甚プロパティ (readonly) - -オブゞェクトのプロパティを初期化した埌に倉曎されたくない堎合、`readonly` 修食子を䜿甚したす。これは特に、IDや蚭定倀など、䞍倉であるべきデヌタを扱う際に有甚です。 - -```ts:readonly-properties.ts -type Product = { - readonly id: number; // 曞き換え䞍可 - name: string; // 曞き換え可胜 - price: number; -}; - -const item: Product = { - id: 101, - name: "Laptop", - price: 98000 -}; - -item.price = 95000; // OK: 通垞のプロパティは倉曎可胜 - -// 以䞋の行はコンパむル゚ラヌになりたす -// item.id = 102; // Error: Cannot assign to 'id' because it is a read-only property. - -console.log(item); -``` - -```ts-exec:readonly-properties.ts -{ id: 101, name: 'Laptop', price: 95000 } -``` -```js-readonly:readonly-properties.js -``` - -泚意点ずしお、`readonly` はあくたで TypeScript のコンパむル時のチェックです。実行時の JavaScript コヌドでは通垞のオブゞェクトずしお振る舞うため、無理やり曞き換えるコヌドが混入するず防げない堎合がありたすただし、TSを䜿っおいる限りはその前に゚ラヌで気づけたす。 - -## この章のたずめ - - * **むンラむン定矩**: `{ key: type }` でその堎限りの型定矩が可胜。 - * **型゚むリアス (`type`)**: 型定矩に名前を付けお再利甚しやすくする。柔軟性が高い。 - * **むンタヌフェヌス (`interface`)**: オブゞェクトの構造を定矩するこずに特化しおいる。 - * **オプショナル (`?`)**: プロパティを必須ではなく任意にする。 - * **読み取り専甚 (`readonly`)**: プロパティの再代入を犁止し、䞍倉性を保぀。 - -### 緎習問題 1: 商品圚庫管理 - -以䞋の条件を満たす `Item` むンタヌフェヌスを定矩し、そのオブゞェクトを䜜成しおください。 - -1. `id` は数倀で、読み取り専甚 (`readonly`) であるこず。 -2. `name` は文字列であるこず。 -3. `price` は数倀であるこず。 -4. `description` は文字列だが、省略可胜 (`?`) であるこず。 -5. 䜜成したオブゞェクトの `price` を倉曎し、コン゜ヌルに出力しおください。 - -```ts:practice3_1.ts -``` -```ts-exec:practice3_1.ts -``` -```js-readonly:practice3_1.js -``` - -### 緎習問題 2: ナヌザヌ情報の統合 - -以䞋の2぀の型゚むリアスを定矩しおください。 - -1. `Contact`: `email` (string) ず `phone` (string) を持぀。 -2. `Employee`: `id` (number), `name` (string), `contact` (`Contact`型) を持぀。 - * ぀たり、`Employee` の䞭に `Contact` 型がネスト入れ子されおいる状態です。 -3. この `Employee` 型を䜿っお、あなたの情報を衚珟する倉数を䜜成しおください。 - -```ts:practice3_2.ts -``` -```ts-exec:practice3_2.ts -``` -```js-readonly:practice3_2.js -``` diff --git a/public/docs/typescript-4.md b/public/docs/typescript-4.md deleted file mode 100644 index 7c8a993..0000000 --- a/public/docs/typescript-4.md +++ /dev/null @@ -1,279 +0,0 @@ -# 第4ç« : 関数の型定矩 - -JavaScript開発者にずっお、関数はロゞックの䞭心的な構成芁玠です。JavaScriptでは匕数の数や型が柔軟あるいはルヌズですが、TypeScriptではここを厳密に管理するこずで、実行時゚ラヌの倧半を防ぐこずができたす。 - -この章では、TypeScriptにおける関数の型定矩の基本から、モダンなJavaScript開発で必須ずなるアロヌ関数、そしお高床なオヌバヌロヌドたでを孊習したす。 - -## 匕数ず戻り倀の型 - -TypeScriptの関数定矩においお最も基本的なルヌルは、「匕数」ず「戻り倀」に型を付けるこずです。 - - * **匕数**: 倉数名の埌ろに `: 型` を蚘述したす。 - * **戻り倀**: 匕数リストの閉じ括匧 `)` の埌ろに `: 型` を蚘述したす。 - -戻り倀の型は型掚論Chapter 2参照によっお省略可胜ですが、関数の意図を明確にするために明瀺的に曞くこずが掚奚されたす。戻り倀がない堎合は `void` を䜿甚したす。 - -```ts:basic_math.ts -// 基本的な関数宣蚀 -function add(a: number, b: number): number { - return a + b; -} - -// 戻り倀がない関数 -function logMessage(message: string): void { - console.log(`LOG: ${message}`); -} - -const result = add(10, 5); -logMessage(`Result is ${result}`); - -// ゚ラヌ䟋コメントアりトを倖すず゚ラヌになりたす -// add(10, "5"); // Error: Argument of type 'string' is not assignable to parameter of type 'number'. -``` - -```ts-exec:basic_math.ts -LOG: Result is 15 -``` -```js-readonly:basic_math.js -``` - -## オプショナル匕数ずデフォルト匕数 - -JavaScriptでは匕数を省略するず `undefined` になりたすが、TypeScriptでは定矩された匕数は**必須**ずみなされたす。匕数を省略可胜にするには、特別な構文が必芁です。 - -### オプショナル匕数 (`?`) - -匕数名の埌ろに `?` を付けるこずで、その匕数を省略可胜オプショナルにできたす。省略された堎合の倀は `undefined` です。 - -> **泚意:** オプショナル匕数は、必ず必須匕数の**埌ろ**に配眮する必芁がありたす。 - -### デフォルト匕数 (`=`) - -ES6JavaScriptず同様に、匕数にデフォルト倀を指定できたす。デフォルト倀がある堎合、TypeScriptはその匕数を「型掚論」し、か぀「省略可胜」ずしお扱いたす。 - -```ts:optional_default.ts -// titleは省略可胜 -function greet(name: string, title?: string): string { - if (title) { - return `Hello, ${title} ${name}!`; - } - return `Hello, ${name}!`; -} - -// powerのデフォルト倀は2 -// 戻り倀の型はnumberず掚論されるため省略可胜 -function exponent(base: number, power: number = 2) { - return base ** power; -} - -console.log(greet("Tanaka")); -console.log(greet("Sato", "Dr.")); -console.log(`2^2 = ${exponent(2)}`); -console.log(`2^3 = ${exponent(2, 3)}`); -``` - -```ts-exec:optional_default.ts -Hello, Tanaka! -Hello, Dr. Sato! -2^2 = 4 -2^3 = 8 -``` -```js-readonly:optional_default.js -``` - -## アロヌ関数ず `this` - -### アロヌ関数の型定矩 - -アロヌ関数を倉数に代入する堎合、匕数ず戻り倀の蚘述堎所は通垞の関数ず同様です。 - -```ts:arrow_func.ts -const multiply = (x: number, y: number): number => { - return x * y; -}; - -// 1行で曞く堎合暗黙のreturn -const subtract = (x: number, y: number): number => x - y; - -console.log(multiply(4, 5)); -console.log(subtract(10, 3)); -``` - -```ts-exec:arrow_func.ts -20 -7 -``` -```js-readonly:arrow_func.js -``` - -### `this` の型指定 - -JavaScriptにおいお `this` の挙動は耇雑ですが、TypeScriptでは `this` が䜕を指すかを明瀺的に型定矩できたす。 -これを行うには、関数の**最初の匕数**ずしお `this` ずいう名前の「停の匕数」を定矩したす。これはコンパむル埌のJavaScriptには出力されたせん。 - -```ts:this_context.ts -interface User { - name: string; - count: number; -} - -function counter(this: User) { - this.count += 1; - console.log(`${this.name}: ${this.count}`); -} - -const userA: User = { name: "Alice", count: 0 }; - -// callメ゜ッドを䜿っおthisコンテキストを指定しお実行 -counter.call(userA); -counter.call(userA); - -// アロヌ関数はthisを持たないため、この構文は䜿いたせん -``` - -```ts-exec:this_context.ts -Alice: 1 -Alice: 2 -``` -```js-readonly:this_context.js -``` - -## 関数のオヌバヌロヌド - -JavaScriptでは「匕数の型や数によっお挙動が倉わる関数」をよく曞きたす。TypeScriptでこれを衚珟するには**オヌバヌロヌド**を䜿甚したす。 - -オヌバヌロヌドは以䞋の2぀の郚分で構成されたす - -1. **オヌバヌロヌドシグネチャ**: 関数の呌び出しパタヌンを定矩耇数可。実装は曞きたせん。 -2. **実装シグネチャ**: 実際の関数の凊理。倖郚からは盎接芋えたせん。 - -```ts:overload.ts -// 1. オヌバヌロヌドシグネチャ呌び出し可胜なパタヌン -function double(value: number): number; -function double(value: string): string; - -// 2. 実装シグネチャすべおのパタヌンを網矅できる型定矩にする -function double(value: number | string): number | string { - if (typeof value === 'number') { - return value * 2; - } else { - return value.repeat(2); - } -} - -const numResult = double(10); // 型は number ずしお掚論される -const strResult = double("Hi"); // 型は string ずしお掚論される - -console.log(numResult); -console.log(strResult); - -// double(true); // ゚ラヌ: booleanを受け入れるオヌバヌロヌドはありたせん -``` - -```ts-exec:overload.ts -20 -HiHi -``` -```js-readonly:overload.js -``` - - -> **ポむント:** 実装シグネチャ`number | string` の郚分は盎接呌び出せたせん。必ず䞊で定矩したシグネチャ`number` たたは `string`に䞀臎する必芁がありたす。 - -## 残䜙匕数 (Rest Parameters) - -匕数の数が可倉である堎合可倉長匕数、JavaScriptず同様に `...args` 構文を䜿甚したす。 -TypeScriptでは、この `args` は必ず**配列の型**である必芁がありたす。 - -```ts:rest_params.ts -// 数倀を奜きなだけ受け取り、合蚈を返す -function sumAll(...numbers: number[]): number { - return numbers.reduce((total, num) => total + num, 0); -} - -// 文字列を結合する -function joinStrings(separator: string, ...words: string[]): string { - return words.join(separator); -} - -console.log(sumAll(1, 2, 3, 4, 5)); -console.log(joinStrings("-", "TypeScript", "is", "fun")); -``` - -```ts-exec:rest_params.ts -15 -TypeScript-is-fun -``` -```js-readonly:rest_params.js -``` - -## 関数の型゚むリアス - -コヌルバック関数を匕数に取る堎合など、関数の型定矩が長くなりがちです。 -第3章で孊んだ `type`型゚むリアスを䜿っお、関数のシグネチャそのものに名前を付けるこずができたす。 - -構文: `type 型名 = (匕数: 型) => 戻り倀の型;` - -```ts:func_alias.ts -// 関数の型定矩を䜜成 -type MathOperation = (x: number, y: number) => number; - -// 䜜成した型を適甚 -const addition: MathOperation = (a, b) => a + b; -const multiplication: MathOperation = (a, b) => a * b; - -// 高階関数での利甚䟋関数を受け取る関数 -function compute(x: number, y: number, op: MathOperation): number { - return op(x, y); -} - -console.log(compute(10, 2, addition)); -console.log(compute(10, 2, multiplication)); -``` - -```ts-exec:func_alias.ts -12 -20 -``` -```js-readonly:func_alias.js -``` - - -## この章のたずめ - - * 関数定矩では、匕数ず戻り倀に型を明蚘するのが基本です。 - * `?` でオプショナル匕数、`=` でデフォルト匕数を定矩できたす。 - * アロヌ関数や `this` の型付けもサポヌトされおおり、コンテキストミスを防げたす。 - * **オヌバヌロヌド**を䜿うこずで、匕数によっお戻り倀の型が倉わる柔軟な関数を定矩できたす。 - * **型゚むリアス**を䜿うこずで、耇雑な関数シグネチャを再利甚可胜なパヌツずしお定矩できたす。 - -### 緎習問題 1: ナヌザヌ怜玢関数 - -以䞋の芁件を満たす `findUser` 関数をアロヌ関数ずしお䜜成しおください。 - -1. 匕数 `id` (number) ず `name` (string) を受け取る。 -2. `name` はオプショナル匕数ずする。 -3. 戻り倀は「怜玢䞭: [id] [name]」ずいう文字列nameがない堎合は「怜玢䞭: [id] ゲスト」ずする。 -4. 関数の型定矩Type Aliasを `SearchFunc` ずしお先に定矩し、それを適甚するこず。 - -```ts:practice4_1.ts -``` -```ts-exec:practice4_1.ts -``` -```js-readonly:practice4_1.js -``` - -### 緎習問題 2: デヌタ倉換のオヌバヌロヌド - -以䞋の芁件を満たす `convert` 関数を `function` キヌワヌドで䜜成しおください。 - -1. 匕数が `number` の堎合、それを `string` に倉換しお返す䟋: `100` -\> `"100"`。 -2. 匕数が `string` の堎合、それを `number` に倉換しお返す䟋: `"100"` -\> `100`。 -3. 適切なオヌバヌロヌドシグネチャを2぀定矩するこず。 - -```ts:practice4_2.ts -``` -```ts-exec:practice4_2.ts -``` -```js-readonly:practice4_2.js -``` \ No newline at end of file diff --git a/public/docs/typescript-5.md b/public/docs/typescript-5.md deleted file mode 100644 index 8d4fd62..0000000 --- a/public/docs/typescript-5.md +++ /dev/null @@ -1,299 +0,0 @@ -# 第5ç« : 型を組み合わせる - -これたでの章では、`string` や `number`、あるいは特定のオブゞェクトの圢ずいった「単䞀の型」を扱っおきたした。しかし、珟実のアプリケヌション開発特にJavaScriptの䞖界では、「IDは数倀かもしれないし、文字列かもしれない」「成功時はデヌタを返すが、倱敗時ぱラヌメッセヌゞを返す」ずいった柔軟なデヌタ構造が頻繁に登堎したす。 - -この章では、既存の型をパズルのように組み合わせお、より耇雑で柔軟な状況を衚珟する方法を孊びたす。 - -## Union型 (共甚䜓型) - -Union型共甚䜓型は、**「A たたは B」**ずいう状態を衚珟したす。パむプ蚘号 `|` を䜿甚しお蚘述したす。 - -JavaScriptでは倉数の型が動的であるため、1぀の倉数に異なる型の倀が入るこずがよくありたすが、TypeScriptではUnion型を䜿っおこれを安党に定矩できたす。 - -```ts:union-basic.ts -// idは数倀、たたは文字列を蚱容する -let id: number | string; - -id = 101; // OK -id = "user-a"; // OK -// id = true; // Error: Type 'boolean' is not assignable to type 'string | number'. - -function printId(id: number | string) { - console.log(`Your ID is: ${id}`); -} - -printId(123); -printId("ABC"); -``` - -```ts-exec:union-basic.ts -Your ID is: 123 -Your ID is: ABC -``` -```js-readonly:union-basic.js -``` - -> **泚意点:** Union型を䜿甚しおいる倉数は、その時点では「どの型か確定しおいない」ため、**すべおの候補に共通するプロパティやメ゜ッド**しか操䜜できたせん。特定の型ずしお扱いたい堎合は、埌述する「型ガヌド」を䜿甚したす。 - -## Literal型 (リテラル型) - -`string` や `number` は「あらゆる文字列」や「あらゆる数倀」を受け入れたすが、**「特定の倀だけ」**を蚱可したい堎合がありたす。これをLiteral型リテラル型ず呌びたす。 - -通垞、Literal型は単独で䜿うよりも、Union型ず組み合わせお**「決たった遞択肢のいずれか」**を衚珟するのによく䜿われたすEnumの代わりずしおもよく利甚されたす。 - -```ts:literal-types.ts -// 文字列リテラル型ずUnion型の組み合わせ -type TrafficLight = 'red' | 'yellow' | 'green'; - -let currentLight: TrafficLight = 'red'; - -// currentLight = 'blue'; // Error: Type '"blue"' is not assignable to type 'TrafficLight'. - -// 数倀リテラルも可胜 -type DiceRoll = 1 | 2 | 3 | 4 | 5 | 6; -let dice: DiceRoll = 3; - -console.log(`Light: ${currentLight}, Dice: ${dice}`); -``` - -```ts-exec:literal-types.ts -Light: red, Dice: 3 -``` -```js-readonly:literal-types.js -``` - -## Intersection型 (亀差型) - -Intersection型亀差型は、**「A か぀ B」**を衚したす。アンパサンド `&` を䜿甚したす。 -これは䞻にオブゞェクトの型定矩を合成マヌゞしお、**「耇数の型のすべおのプロパティを持぀新しい型」**を䜜る際によく䜿甚されたす。 - -```ts:intersection-types.ts -type Person = { - name: string; -}; - -type Employee = { - employeeId: number; - department: string; -}; - -// Person か぀ Employee の特城を持぀型 -type CompanyMember = Person & Employee; - -const member: CompanyMember = { - name: "Suzuki", - employeeId: 5001, - department: "Engineering" - // どれか䞀぀でも欠けるず゚ラヌになりたす -}; - -console.log(member); -``` - -```ts-exec:intersection-types.ts -{ name: 'Suzuki', employeeId: 5001, department: 'Engineering' } -``` -```js-readonly:intersection-types.js -``` - -> **補足:** プリミティブ型同士で `string & number` のように亀差させるず、䞡方を満たす倀は存圚しないため、型は `never`ありえない倀になりたす。Intersection型は䞻にオブゞェクト型の合成に䜿われたす。 - -## null ず undefined - -TypeScriptには `null` 型ず `undefined` 型が存圚したす。 -`tsconfig.json` の蚭定で `strictNullChecks: true`掚奚蚭定になっおいる堎合、これらは他の型stringなどには代入できたせん。 - -倀が存圚しない可胜性がある堎合は、Union型を䜿っお明瀺的に `null` や `undefined` を蚱可したす。 - -```ts:nullable.ts -// string たたは null を蚱容する -let userName: string | null = "Tanaka"; - -userName = null; // OK - -// オプショナルなプロパティ?は 「型 | undefined」 の糖衣構文に近い動きをしたす -type UserConfig = { - theme: string; - notification?: boolean; // boolean | undefined -}; - -const config: UserConfig = { - theme: "dark" - // notification は省略可胜 (undefined) -}; - -console.log(`User: ${userName}, Theme: ${config.theme}`); -``` - -```ts-exec:nullable.ts -User: null, Theme: dark -``` -```js-readonly:nullable.js -``` - -## 型ガヌド (Type Guards) - -Union型 (`string | number`) の倉数があるずき、プログラムの䞭で「今は `string` なのか `number` なのか」を区別しお凊理を分けたい堎合がありたす。これを**型の絞り蟌みNarrowing**ず蚀いたす。 - -TypeScriptのコンパむラが「このブロック内ではこの倉数はこの型だ」ず認識できるようにするチェック凊理を**型ガヌド**ず呌びたす。 - -### typeof 挔算子 - -プリミティブ型string, number, boolean, symbol, undefinedの刀定に䜿いたす。 - -```ts:type-guard-typeof.ts -function formatPrice(price: number | string) { - // ここでは price は number | string - - if (typeof price === 'string') { - // このブロック内では price は 'string' 型ずしお扱われる - return parseInt(price).toLocaleString(); - } else { - // このブロック内では price は 'number' 型ずしお扱われる - return price.toLocaleString(); - } -} - -console.log(formatPrice(10000)); -console.log(formatPrice("20000")); -``` - -```ts-exec:type-guard-typeof.ts -10,000 -20,000 -``` -```js-readonly:type-guard-typeof.js -``` - -### in 挔算子 - -オブゞェクトが特定のプロパティを持っおいるかどうかで型を絞り蟌みたす。 - -```ts:type-guard-in.ts -type Fish = { swim: () => void }; -type Bird = { fly: () => void }; - -function move(animal: Fish | Bird) { - if ('swim' in animal) { - // ここでは Fish 型 - animal.swim(); - } else { - // ここでは Bird 型 - animal.fly(); - } -} - -const fish: Fish = { swim: () => console.log("Swimming...") }; -move(fish); -``` - -```ts-exec:type-guard-in.ts -Swimming... -``` -```js-readonly:type-guard-in.js -``` - -### instanceof 挔算子 - -クラスのむンスタンスかどうかを刀定したす第7章のクラスで詳しく扱いたすが、Dateなどの組み蟌みオブゞェクトでも有効です。 - -```ts:type-guard-instanceof.ts -function logDate(value: string | Date) { - if (value instanceof Date) { - console.log(value.toISOString()); - } else { - console.log(value); - } -} -``` -```js-readonly:type-guard-instanceof.js -``` - -## 型アサヌション (Type Assertions) - -時に、プログラマがTypeScriptコンパむラよりも型の詳现を知っおいる堎合がありたす。䟋えば、倖郚APIからのレスポンスや、DOM芁玠の取埗などです。 - -`as` キヌワヌドを䜿うず、コンパむラに察しお「この倉数はこの型であるずしお扱っおくれ」ず匷制できたす。 - -```ts:assertion.ts -// unknown型は䜕でも入るが、そのたたでは操䜜できない型 -let someValue: unknown = "This is a string"; - -// コンパむラに「これはstringだからlengthを䜿わせお」ず䌝える -let strLength: number = (someValue as string).length; - -console.log(strLength); - -// 泚意: 党く互換性のない型ぞの倉換ぱラヌになりたすが、 -// unknownを経由するず無理やり倉換できおしたうため、乱甚は避けおください。 -// let wrong = (123 as string); // Error -// let dangerous = (123 as unknown as string); // OKだが実行時にバグの元 -``` - -```ts-exec:assertion.ts -16 -``` -```js-readonly:assertion.js -``` - -> **泚意:** 型アサヌションはあくたで「コンパむル時の型チェックを黙らせる」機胜であり、実行時の型倉換を行うわけではありたせん。実行時に倀が想定ず違う堎合、クラッシュの原因になりたす。可胜な限り、型ガヌドを䜿っお安党に絞り蟌むこずを掚奚したす。 - -## この章のたずめ - - * **Union型 (`|`)**: 耇数の型のうち「いずれか」を衚す。 - * **Literal型**: 特定の倀のみを蚱容する型。Union型ず組み合わせお列挙型のように䜿える。 - * **Intersection型 (`&`)**: 耇数の型を「合成」しお、すべおのプロパティを持぀型を䜜る。 - * **null / undefined**: `strictNullChecks` 環境䞋では、Union型を䜿っお明瀺的に蚱容する必芁がある。 - * **型ガヌド**: `typeof`, `in`, `instanceof` などを䜿っお、Union型から特定の型ぞ絞り蟌む。 - * **型アサヌション (`as`)**: 型を匷制的に指定するが、安党性のために䜿甚は慎重に行う。 - -### 緎習問題1: 結果の型定矩 - -APIリク゚ストの結果を衚す `Result` 型を定矩しおください。 - - * 成功時は `success: true` ず `data: string` を持ちたす。 - * 倱敗時は `success: false` ず `error: string` を持ちたす。 - * `handleResult` 関数内で型ガヌドを䜿い、成功ならデヌタを、倱敗なら゚ラヌメッセヌゞをログ出力しおください。 - -```ts:practice5_1.ts -// ここに SuccessResult, FailureResult, Result 型を定矩しおください -// type Result = ... - -function handleResult(result: Result) { - // ここに凊理を実装しおください -} - -// テスト甚 -handleResult({ success: true, data: "Data loaded" }); -handleResult({ success: false, error: "Network error" }); -``` -```ts-exec:practice5_1.ts -``` -```js-readonly:practice5_1.js -``` - - -### 緎習問題2: 図圢の面積蚈算 - -`Circle` 型ず `Square` 型を定矩し、それらのUnion型である `Shape` を定矩しおください。 - - * `Circle` は `kind: 'circle'` ず `radius: number` を持ちたす。 - * `Square` は `kind: 'square'` ず `sideLength: number` を持ちたす。 - * `getArea` 関数で、枡された図圢に応じお面積を蚈算しお返しおください円呚率は `Math.PI` を䜿甚。 - -```ts:practice5_2.ts -// ここに型を定矩 - -function getArea(shape: Shape): number { - // ここに実装 (switch文やif文で kind プロパティによる絞り蟌みを行う) - return 0; -} - -// テスト甚 -console.log(getArea({ kind: 'circle', radius: 10 })); -console.log(getArea({ kind: 'square', sideLength: 5 })); -``` -```ts-exec:practice5_2.ts -``` -```js-readonly:practice5_2.js -``` diff --git a/public/docs/typescript-6.md b/public/docs/typescript-6.md deleted file mode 100644 index 955ce5f..0000000 --- a/public/docs/typescript-6.md +++ /dev/null @@ -1,272 +0,0 @@ -# 第6ç« : ゞェネリクス (Generics) - -第6章では、TypeScriptを䜿いこなす䞊で非垞に匷力な機胜である**ゞェネリクス (Generics)** に぀いお孊びたす。JavaやC\#などの蚀語経隓がある方には銎染み深い抂念かもしれたせんが、JavaScriptの䞖界から来た方にずっおは少し抜象的に感じるかもしれたせん。しかし、これを理解するこずで、**「柔軟性」ず「安党性」を䞡立したコヌド**が曞けるようになりたす。 - -## Genericsの必芁性: 型を匕数のように扱う - -プログラミングをしおいるず、「凊理内容は同じだが、扱うデヌタの型だけが違う」ずいう堎面によく遭遇したす。 - -䟋えば、「匕数をそのたた返す関数」を考えおみたしょう。 - -```ts -// 数倀を受け取っお数倀を返す -function returnNumber(arg: number): number { - return arg; -} - -// 文字列を受け取っお文字列を返す -function returnString(arg: string): string { - return arg; -} - -// どんな型でも受け取れるが、戻り倀の型情報が倱われるany -function returnAny(arg: any): any { - return arg; -} -``` - -`returnNumber` ず `returnString` はロゞックが完党に重耇しおいたす。䞀方、`returnAny` は重耇を防げたすが、TypeScriptの利点である型チェックが無効になっおしたいたす。 - -ここで登堎するのが **ゞェネリクス** です。ゞェネリクスを䜿うず、**「型そのもの」を匕数のように受け取る**こずができたす。 - -## Generics関数 - -ゞェネリクスを䜿った関数の定矩を芋おみたしょう。 -型倉数は慣習ずしお `T` (Typeの頭文字) がよく䜿われたす。 - -```ts:identity_func.ts -// は「この関数内で T ずいう名前の型倉数を䜿いたす」ずいう宣蚀 -function identity(arg: T): T { - console.log(`匕数の型: ${typeof arg}, 倀: ${arg}`); - return arg; -} - -// 䜿甚䟋1: 明瀺的に型を指定する -const output1 = identity("Hello Generics"); - -// 䜿甚䟋2: 型掚論に任せる (掚奚) -// 匕数が数倀なので、T は number に自動的に掚論される -const output2 = identity(100); - -// output1は string型、output2は number型 ずしお扱われるため安党 -// output1.toFixed(2); // ゚ラヌ: string型にtoFixedは存圚しない -``` - -```ts-exec:identity_func.ts -匕数の型: string, 倀: Hello Generics -匕数の型: number, 倀: 100 -``` -```js-readonly:identity_func.js -``` - -このように、`identity` 関数は定矩時点では型を固定せず、**呌び出す瞬間に型が決たる**ずいう柔軟な性質を持ちたす。 - -## Genericsむンタヌフェヌス - -関数だけでなく、むンタヌフェヌスもゞェネリクスにできたす。これにより、再利甚性の高いデヌタ構造を定矩できたす。 -䟋えば、「䜕かを入れる箱 (Box)」のような汎甚的な型を䜜る堎合に䟿利です。 - -```ts:generic_box.ts -// T型の倀を持぀ value プロパティがあるむンタヌフェヌス -interface Box { - value: T; -} - -// 文字列を入れる箱 -const stringBox: Box = { - value: "TypeScript" -}; - -// 数倀を入れる箱 -const numberBox: Box = { - value: 42 -}; - -console.log(stringBox.value.toUpperCase()); // 文字列のメ゜ッドが䜿える -console.log(numberBox.value.toFixed(1)); // 数倀のメ゜ッドが䜿える -``` - -```ts-exec:generic_box.ts -TYPESCRIPT -42.0 -``` -```js-readonly:generic_box.js -``` - -JavaScriptでは特に意識せずオブゞェクトに様々な型の倀を入れおいたしたが、TypeScriptではこのようにゞェネリクスを䜿うこずで、「䞭身が䜕かわからない」状態を防ぎ぀぀、どんな型でも蚱容する構造を䜜れたす。 - -## Genericsクラス - -クラスでも同様にゞェネリクスを䜿甚できたす。リストやキュヌ、スタックなどのデヌタ構造を実装する際によく䜿われたす。 - -ここではシンプルな「スタック埌入れ先出し」クラスを䜜っおみたしょう。 - -```ts:simple_stack.ts -class SimpleStack { - private items: T[] = []; - - // デヌタを远加する - push(item: T): void { - this.items.push(item); - } - - // デヌタを取り出す - pop(): T | undefined { - return this.items.pop(); - } - - // 珟圚の䞭身を衚瀺デバッグ甚 - print(): void { - console.log(this.items); - } -} - -// 数倀専甚のスタック -const numberStack = new SimpleStack(); -numberStack.push(10); -numberStack.push(20); -// numberStack.push("30"); // ゚ラヌ: number以倖は入れられない -console.log("Pop:", numberStack.pop()); - -// 文字列専甚のスタック -const stringStack = new SimpleStack(); -stringStack.push("A"); -stringStack.push("B"); -stringStack.print(); -``` - -```ts-exec:simple_stack.ts -Pop: 20 -[ 'A', 'B' ] -``` -```js-readonly:simple_stack.js -``` - -もしゞェネリクスを䜿わずにこれを実装しようずするず、`NumberStack`クラスず`StringStack`クラスを個別に䜜るか、`any`を䜿っお安党性を犠牲にするしかありたせん。ゞェネリクスを䜿えば、1぀のクラス定矩で安党に様々な型に察応できたす。 - -## 型制玄 (extends): Generics型に制玄を蚭ける - -ゞェネリクスは「どんな型でも受け入れられる」のが基本ですが、時には「ある特定の条件を満たす型だけを受け入れたい」ずいう堎合がありたす。 - -䟋えば、匕数の `.length` プロパティにアクセスしたい堎合を考えおみたしょう。 - -```ts:without_constraints.ts -function logLength(arg: T): void { - console.log(arg.length); // ゚ラヌ Tがlengthを持っおいるずは限らない -} -``` -```ts-exec:without_constraints.ts -without_constraints.ts:2:19 - error TS2339: Property 'length' does not exist on type 'T'. - -2 console.log(arg.length); // ゚ラヌ Tがlengthを持っおいるずは限らない - ~~~~~~ -``` -```js-readonly:without_constraints.js -``` - -すべおの型が `length` を持っおいるわけではない䟋: `number`型にはないため、TypeScriptぱラヌを出したす。 -これを解決するために、`extends` キヌワヌドを䜿っお **「T は少なくずもこの型を継承適合しおいなければならない」** ずいう制玄Constraintを蚭けたす。 - -```ts:constraints.ts -// lengthプロパティを持぀型を定矩 -interface Lengthy { - length: number; -} - -// T は Lengthy むンタヌフェヌスを満たす型でなければならない -function logLength(arg: T): void { - console.log(`倀: ${JSON.stringify(arg)}, 長さ: ${arg.length}`); -} - -// 配列は length を持぀のでOK -logLength([1, 2, 3]); - -// 文字列も length を持぀のでOK -logLength("Hello"); - -// オブゞェクトも length プロパティがあればOK -logLength({ length: 10, value: "something" }); - -// 数倀は length を持たないので゚ラヌになる -// logLength(100); -``` - -```ts-exec:constraints.ts -倀: [1,2,3], 長さ: 3 -倀: "Hello", 長さ: 5 -倀: {"length":10,"value":"something"}, 長さ: 10 -``` -```js-readonly:constraints.js -``` - -このように `extends` を䜿うこずで、ゞェネリクスの柔軟性を保ち぀぀、関数内で安党に特定のプロパティやメ゜ッドを利甚するこずができたす。 - -## この章のたずめ - - * **ゞェネリクス (Generics)** は、型を匕数のように扱い、コヌドの再利甚性ず型安党性を䞡立させる機胜です。 - * **``** のように型倉数を宣蚀しお䜿甚したす。 - * **関数、むンタヌフェヌス、クラス** などで利甚可胜です。 - * **`extends`** キヌワヌドを䜿甚するこずで、受け入れる型に制玄「最䜎限このプロパティを持っおいるこず」などを䞎えるこずができたす。 - -ゞェネリクスを理解するず、ラむブラリの型定矩ファむル`.d.ts`も読みやすくなり、TypeScriptでの開発力が䞀気に向䞊したす。 - -### 緎習問題 1: ペアを䜜成する関数 - -2぀の匕数を受け取り、それらを配列タプルにしお返すゞェネリクス関数 `createPair` を䜜成しおください。 -第1匕数ず第2匕数は異なる型でも構いたせん。 - -**芁件:** - - * 型匕数を2぀䟋: `T`, `U`䜿甚するこず。 - * 戻り倀の型は `[T, U]` ずなるこず。 - -```ts:practice6_1.ts -// ここに関数を定矩しおください -function createPair(first: T, second: U): [T, U] { - // 実装 - return [first, second]; -} - -// 実行䟋 -const pair1 = createPair("score", 100); -console.log(pair1); // ["score", 100] - -const pair2 = createPair(true, "valid"); -console.log(pair2); // [true, "valid"] -``` -```ts-exec:practice6_1.ts -``` -```js-readonly:practice6_1.js -``` - -### 緎習問題 2: 制玄付きゞェネリクス - -`id` プロパティ型は `number` たたは `string`を持぀オブゞェクトのみを受け取り、その `id` を衚瀺する関数 `showId` を䜜成しおください。 - -**芁件:** - - * `extends` を䜿甚しお型パラメヌタに制玄をかけるこず。 - * `id` プロパティを持たないオブゞェクトを枡すずコンパむル゚ラヌになるこず。 - -```ts:practice6_2.ts -// 制玄甚のむンタヌフェヌス -interface HasId { - id: number | string; -} - -// ここに関数を定矩しおください -function showId(item: T): void { - console.log(`ID is: ${item.id}`); -} - -// 実行䟋 -showId({ id: 1, name: "UserA" }); // OK -showId({ id: "abc-123", active: true }); // OK - -// 以䞋のコヌドぱラヌになるはずです -// showId({ name: "NoIdUser" }); -``` -```ts-exec:practice6_2.ts -``` -```js-readonly:practice6_2.js -``` diff --git a/public/docs/typescript-7.md b/public/docs/typescript-7.md deleted file mode 100644 index 20be426..0000000 --- a/public/docs/typescript-7.md +++ /dev/null @@ -1,306 +0,0 @@ -# 第7ç« : クラスずアクセス修食子 - -JavaScriptES6以降に慣れ芪しんでいる方であれば、`class`構文自䜓はすでにご存知かず思いたす。TypeScriptにおけるクラスは、JavaScriptのクラス機胜をベヌスにし぀぀、**型安党性**ず**アクセス制埡カプセル化**を匷化するための機胜が远加されおいたす。 - -本章では、TypeScript特有のクラスの曞き方、特にプロパティの定矩、アクセス修食子、そしおむンタヌフェヌスずの連携に぀いお孊びたす。 - -## JSのクラス構文の埩習: constructor, extends - -たずは、基本的なJavaScriptのクラス構文をTypeScriptのファむルずしお曞いおみたしょう。TypeScriptはJavaScriptのスヌパヌセット䞊䜍互換であるため、暙準的なJSの曞き方もほがそのたた動䜜したすが、少しだけ「型」の意識が必芁です。 - -```ts:basic-animal.ts -class Animal { - // TypeScriptでは、ここでプロパティフィヌルドを宣蚀するのが䞀般的ですが、 - // JSのようにconstructor内でthis.name = nameするだけだず゚ラヌになるこずがありたす。 - // (詳しくは次のセクションで解説したす) - name: string; - - constructor(name: string) { - this.name = name; - } - - move(distanceInMeters: number = 0) { - console.log(`${this.name} moved ${distanceInMeters}m.`); - } -} - -class Snake extends Animal { - constructor(name: string) { - // 掟生クラスのコンストラクタでは super() の呌び出しが必須 - super(name); - } - - move(distanceInMeters: number = 5) { - console.log("Slithering..."); - super.move(distanceInMeters); - } -} - -const sam = new Snake("Sammy the Python"); -sam.move(); -``` - -```ts-exec:basic-animal.ts -Slithering... -Sammy the Python moved 5m. -``` -```js-readonly:basic-animal.js -``` - -基本構造はJSず同じですが、匕数に型泚釈`: string`, `: number`が付いおいる点が異なりたす。 - -## TypeScriptのクラス: プロパティの型定矩 - -JavaScriptでは、コンストラクタ内で `this.x = 10` ず曞くだけでプロパティを远加できたしたが、TypeScriptでは**クラスの盎䞋ボディでプロパティずその型を宣蚀する**必芁がありたす。 - -これを省略するず、「プロパティ 'x' は型 'ClassName' に存圚したせん」ずいう゚ラヌになりたす。 - -```ts:property-definition.ts -class Product { - // プロパティの宣蚀必須 - id: number; - name: string; - price: number; - - constructor(id: number, name: string, price: number) { - this.id = id; - this.name = name; - this.price = price; - } - - getDetail(): string { - return `ID:${this.id} ${this.name} (${this.price}円)`; - } -} - -const item = new Product(1, "TypeScript入門曞", 2500); -console.log(item.getDetail()); -``` - -```ts-exec:property-definition.ts -ID:1 TypeScript入門曞 (2500円) -``` -```js-readonly:property-definition.js -``` - -> **泚意:** `strictPropertyInitialization` 蚭定tsconfig.jsonが有効な堎合、プロパティを宣蚀したもののコンストラクタで初期化しおいないず゚ラヌになりたす。初期化を埌で行うこずが確実な堎合は `name!: string;` のように `!` を付けお譊告を抑制するこずもありたす。 - -## アクセス修食子: public, private, protected - -TypeScriptには、クラスのメンバヌプロパティやメ゜ッドぞのアクセスを制埡するための3぀の修食子がありたす。これはJavaやC\#などの蚀語ず同様の抂念です。 - -1. **`public` (デフォルト)**: どこからでもアクセス可胜。 -2. **`private`**: 定矩されたクラスの内郚からのみアクセス可胜。 -3. **`protected`**: 定矩されたクラス、およびそのサブクラス継承先からアクセス可胜。 - -### 埓来の曞き方ず省略蚘法パラメヌタプロパティ - -TypeScriptには、コンストラクタの匕数にアクセス修食子を付けるこずで、**「プロパティ宣蚀」ず「代入」を同時に行う省略蚘法パラメヌタプロパティ**がありたす。実務ではこの曞き方が非垞によく䜿われたす。 - -```ts:access-modifiers.ts -class User { - // 通垞の曞き方 - public name: string; - private _age: number; // 慣習的にprivateフィヌルドには_を぀けるこずがありたす - - // 省略蚘法パラメヌタプロパティ - // constructor匕数に修食子を぀けるこずで、自動的にプロパティずしお定矩・代入される - constructor(name: string, age: number, protected email: string) { - this.name = name; - this._age = age; - // this.email = email; // 自動で行われるため蚘述䞍芁 - } - - public getProfile(): string { - // privateやprotectedはクラス内郚ではアクセス可胜 - return `${this.name} (${this._age}) - ${this.email}`; - } -} - -const user = new User("Alice", 30, "alice@example.com"); - -console.log(user.name); // OK (public) -console.log(user.getProfile()); // OK (public) - -// 以䞋の行はコンパむル゚ラヌになりたす -// console.log(user._age); // Error: Property '_age' is private... -// console.log(user.email); // Error: Property 'email' is protected... -``` - -```ts-exec:access-modifiers.ts -Alice -Alice (30) - alice@example.com -``` - -```js-readonly:access-modifiers.js -``` - -> **Note:** TypeScriptの `private` はあくたでコンパむル時のチェックです。JavaScriptにトランスパむルされるず単なるプロパティになるため、実行時にはアクセスしようず思えばできおしたいたす。厳密な実行時プラむベヌトが必芁な堎合は、JavaScript暙準の `#` (䟋: `#field`) を䜿甚しおください。 - -## readonly修食子: クラスプロパティぞの適甚 - -`readonly` 修食子を付けるず、そのプロパティは**読み取り専甚**になりたす。 -倀の代入は「プロパティ宣蚀時」たたは「コンストラクタ内」でのみ蚱可されたす。 - -```ts:readonly-modifier.ts -class Configuration { - // 宣蚀時に初期化 - readonly version: string = "1.0.0"; - readonly apiKey: string; - - constructor(apiKey: string) { - // コンストラクタ内での代入はOK - this.apiKey = apiKey; - } - - updateConfig() { - // ゚ラヌ: 読み取り専甚プロパティに代入しようずしおいたす - // this.version = "2.0.0"; - } -} - -const config = new Configuration("xyz-123"); -console.log(`Version: ${config.version}, Key: ${config.apiKey}`); - -// ゚ラヌ: クラスの倖からも倉曎䞍可 -// config.apiKey = "abc-999"; -``` - -```ts-exec:readonly-modifier.ts -Version: 1.0.0, Key: xyz-123 -``` -```js-readonly:readonly-modifier.js -``` - -## implements: むンタヌフェヌスによるクラスの圢状の匷制 - -第3章で孊んだむンタヌフェヌスは、オブゞェクトの型定矩だけでなく、**クラスが特定の実装を持っおいるこずを保蚌する契玄を結ぶ**ためにも䜿われたす。これを `implements` ず呌びたす。 - -```ts:implements-interface.ts -interface Printable { - print(): void; -} - -interface Loggable { - log(message: string): void; -} - -// 耇数のむンタヌフェヌスを実装可胜 -class DocumentFile implements Printable, Loggable { - constructor(private title: string) {} - - // Printableの実装 - print() { - console.log(`Printing document: ${this.title}...`); - } - - // Loggableの実装 - log(message: string) { - console.log(`[LOG]: ${message}`); - } -} - -const doc = new DocumentFile("ProjectPlan.pdf"); -doc.print(); -doc.log("Print job started"); -``` - -```ts-exec:implements-interface.ts -Printing document: ProjectPlan.pdf... -[LOG]: Print job started -``` -```js-readonly:implements-interface.js -``` - -もし `print()` メ゜ッドを実装し忘れるず、TypeScriptコンパむラは即座に゚ラヌを出したす。これにより、倧芏暡開発での実装挏れを防げたす。 - -## 抜象クラス (abstract): 継承専甚の基底クラス - -「むンスタンス化はさせたくないが、共通の機胜を継承させたい」堎合や、「メ゜ッドの名前だけ決めおおいお、具䜓的な凊理はサブクラスに任せたい」堎合に **抜象クラス (`abstract class`)** を䜿甚したす。 - - * `abstract` クラス: `new` で盎接むンスタンス化できたせん。 - * `abstract` メ゜ッド: 実装䞭身を持ちたせん。継承先のクラスで必ず実装する必芁がありたす。 - -```ts:abstract-class.ts -abstract class Shape { - constructor(protected color: string) {} - - // 具䜓的な実装を持぀メ゜ッド - describe(): void { - console.log(`This is a ${this.color} shape.`); - } - - // 抜象メ゜ッド眲名のみ定矩 - // サブクラスで必ず getArea を実装しなければならない - abstract getArea(): number; -} - -class Circle extends Shape { - constructor(color: string, private radius: number) { - super(color); - } - - // 抜象メ゜ッドの実装 - getArea(): number { - return Math.PI * this.radius ** 2; - } -} - -// const shape = new Shape("red"); // ゚ラヌ: 抜象クラスはむンスタンス化できない - -const circle = new Circle("blue", 5); -circle.describe(); // 芪クラスのメ゜ッド -console.log(`Area: ${circle.getArea().toFixed(2)}`); // 実装したメ゜ッド -``` - -```ts-exec:abstract-class.ts -This is a blue shape. -Area: 78.54 -``` -```js-readonly:abstract-class.js -``` - -## この章のたずめ - - * **プロパティ定矩:** TypeScriptではクラスボディ内でプロパティの宣蚀が必芁です。 - * **アクセス修食子:** `public`, `private`, `protected` でカプセル化を制埡したす。 - * **パラメヌタプロパティ:** コンストラクタ匕数に修食子を぀けるこずで、宣蚀ず初期化を簡朔に曞けたす。 - * **readonly:** プロパティを䞍倉読み取り専甚にしたす。 - * **implements:** クラスが特定のむンタヌフェヌスの仕様を満たすこずを匷制したす。 - * **abstract:** むンスタンス化できない基底クラスや、実装を匷制する抜象メ゜ッドを定矩したす。 - -### 緎習問題 1: 埓業員クラスの䜜成 - -以䞋の芁件を満たす `Employee` クラスを䜜成し、動䜜確認コヌドを曞いおください。 - -1. **プロパティ**: - * `name` (string): パブリック - * `id` (number): 読み取り専甚 - * `salary` (number): プラむベヌト -2. **コンストラクタ**: 省略蚘法パラメヌタプロパティを䜿っおこれらを初期化しおください。 -3. **メ゜ッド**: - * `getSalaryInfo()`: "埓業員 [name] の絊䞎は [salary] です" ず出力するメ゜ッドクラス内郚からは `salary` にアクセスできるこずを確認。 - -```ts:practice7_1.ts -``` -```ts-exec:practice7_1.ts -``` -```js-readonly:practice7_1.js -``` - -### 緎習問題 2: 図圢クラスの継承 - -以䞋の芁件でコヌドを曞いおください。 - -1. **むンタヌフェヌス `AreaCalculator`**: `calculateArea(): number` メ゜ッドを持぀。 -2. **クラス `Rectangle`**: `AreaCalculator` を実装(`implements`)する。 - * プロパティ: `width` (number), `height` (number) - * メ゜ッド: `calculateArea` を実装しお面積を返す。 -3. `Rectangle` のむンスタンスを䜜成し、面積をコン゜ヌルに出力しおください。 - -```ts:practice7_2.ts -``` -```ts-exec:practice7_2.ts -``` -```js-readonly:practice7_2.js -``` \ No newline at end of file diff --git a/public/docs/typescript-8.md b/public/docs/typescript-8.md deleted file mode 100644 index 8a39192..0000000 --- a/public/docs/typescript-8.md +++ /dev/null @@ -1,285 +0,0 @@ -# 第8ç« : 非同期凊理ずナヌティリティ型 - -JavaScriptにおいお `Promise` や `async/await` は日垞的に䜿甚したすが、TypeScriptでは「将来どのような倀が返っおくるか」を明瀺する必芁がありたす。 -たた、既存の型を再利甚しお新しい型を䜜る「ナヌティリティ型」を孊ぶこずで、コヌドの重耇を劇的に枛らすこずができたす。 - -## 非同期凊理の型: Promise ず async/await - -JavaScriptでは、非同期関数の戻り倀は垞に `Promise` オブゞェクトです。TypeScriptでは、このPromiseが**解決Resolveされたずきに持぀倀の型**をゞェネリクスを䜿っお `Promise` の圢匏で衚珟したす。 - -### 基本的な定矩 - - * 戻り倀が文字列の堎合: `Promise` - * 戻り倀が数倀の堎合: `Promise` - * 戻り倀がないvoid堎合: `Promise` - -`async` キヌワヌドが぀いた関数は、自動的に戻り倀が `Promise` でラップされたす。 - -```ts:async-fetch.ts -type User = { - id: number; - name: string; - email: string; -}; - -// 擬䌌的なAPIコヌル関数 -// 戻り倀の型ずしお Promise を指定したす -const fetchUser = async (userId: number): Promise => { - // 実際はfetchなどを行いたすが、ここでは擬䌌的に遅延させお倀を返したす - return new Promise((resolve) => { - setTimeout(() => { - resolve({ - id: userId, - name: "Yamada Taro", - email: "taro@example.com", - }); - }, 500); - }); -}; - -const main = async () => { - console.log("Fetching data..."); - - // awaitを䜿うこずで、user倉数の型は自動的に User 型Promiseが解けた状態になりたす - const user = await fetchUser(1); - - console.log(`ID: ${user.id}`); - console.log(`Name: ${user.name}`); -}; - -main(); -``` - -```ts-exec:async-fetch.ts -Fetching data... -ID: 1 -Name: Yamada Taro -``` -```js-readonly:async-fetch.js -``` - -### ゚ラヌハンドリングず型 - -Promiseが拒吊Rejectされる堎合の゚ラヌ型は、珟状のTypeScriptではデフォルトで `any` たたは `unknown` ずしお扱われたす`try-catch` ブロックの `error` オブゞェクトなど。 - -## ナヌティリティ型 (Utility Types) - -TypeScriptには、既存の型定矩を倉換しお新しい型を生成するための䟿利な型が暙準で甚意されおいたす。これらを䜿うず、「䞀郚のプロパティだけ倉曎したい」「党おオプショナルにしたい」ずいった堎合に、いちいち新しい型を定矩し盎す必芁がなくなりたす。 - -ここでは、特によく䜿われる4぀のナヌティリティ型を玹介したす。 - -### ベヌスずなる型 - -以䞋の `Product` 型を䟋に䜿甚したす。 - -```ts -interface Product { - id: number; - name: string; - price: number; - description: string; -} -``` - -### 1\. Partial\: 党おをオプショナルにする - -`Partial` は、型 `T` のすべおのプロパティを「必須」から「任意Optional / `?`付き」に倉曎したす。デヌタの曎新凊理パッチなどで、䞀郚のフィヌルドだけ送信したい堎合に䟿利です。 - -```ts:utility-partial.ts -interface Product { - id: number; - name: string; - price: number; - description: string; -} - -// プロパティの䞀郚だけを曎新する関数 -// updateDataは { name?: string; price?: number; ... } のようになりたす -function updateProduct(id: number, updateData: Partial) { - console.log(`Updating product ${id} with:`, updateData); -} - -// nameずpriceだけ曎新descriptionやidがなくおも゚ラヌにならない -updateProduct(100, { - name: "New Product Name", - price: 5000 -}); -``` - -```ts-exec:utility-partial.ts -Updating product 100 with: { name: 'New Product Name', price: 5000 } -``` -```js-readonly:utility-partial.js -``` - -### 2\. Readonly\: 党おを読み取り専甚にする - -`Readonly` は、型 `T` のすべおのプロパティを曞き換え䞍可readonlyにしたす。関数内でオブゞェクトを倉曎されたくない堎合や、ReactのState管理などで圹立ちたす。 - -```ts:utility-readonly.ts -interface Product { - id: number; - name: string; - price: number; -} - -const originalProduct: Product = { id: 1, name: "Pen", price: 100 }; - -// 倉曎䞍可のオブゞェクトずしお扱う -const frozenProduct: Readonly = originalProduct; - -// 読み取りはOK -console.log(frozenProduct.name); - -// コンパむル゚ラヌ: 倀の代入はできたせん -// frozenProduct.price = 200; -``` - -```ts-exec:utility-readonly.ts -Pen -``` -```js-readonly:utility-readonly.js -``` - -### 3\. Pick\: 特定のキヌだけ抜き出す - -`Pick` は、型 `T` から `K` で指定したプロパティのみを抜出しお新しい型を䜜りたす。 -「ナヌザヌ情報党䜓から、衚瀺甚の名前ず画像URLだけ欲しい」ずいった堎合に䜿いたす。 - -```ts:utility-pick.ts -interface Product { - id: number; - name: string; - price: number; - description: string; - stock: number; -} - -// 商品䞀芧衚瀺甚に、IDず名前ず䟡栌だけが必芁な型を䜜る -type ProductPreview = Pick; - -const item: ProductPreview = { - id: 1, - name: "Laptop", - price: 120000, - // description: "..." // ゚ラヌ: ProductPreviewにはdescriptionは存圚したせん -}; - -console.log(item); -``` - -```ts-exec:utility-pick.ts -{ id: 1, name: 'Laptop', price: 120000 } -``` -```js-readonly:utility-pick.js -``` - -### 4\. Omit\: 特定のキヌだけ陀倖する - -`Omit` は `Pick` の逆で、指定したプロパティを陀倖したす。 -「デヌタベヌスのモデルから、機密情報や内郚管理甚のIDを陀倖しおクラむアントに返したい」ずいった堎合に有甚です。 - -```ts:utility-omit.ts -interface Product { - id: number; - name: string; - price: number; - secretCode: string; // 倖郚に出したくない情報 - internalId: string; // 倖郚に出したくない情報 -} - -// 倖郚公開甚の型secretCodeずinternalIdを陀倖 -type PublicProduct = Omit; - -const publicItem: PublicProduct = { - id: 1, - name: "Mouse", - price: 3000 -}; - -console.log(publicItem); -``` - -```ts-exec:utility-omit.ts -{ id: 1, name: 'Mouse', price: 3000 } -``` -```js-readonly:utility-omit.js -``` - -## 高床な型操䜜抂芁 - -ここでは詳现な文法たでは螏み蟌みたせんが、ラむブラリの型定矩などを読む際に遭遇する高床な抂念を玹介したす。これらは䞊蚘のナヌティリティ型の内郚実装にも䜿われおいたす。 - -### Mapped Types (マップ型) - -既存の型のプロパティをルヌプ凊理しお、新しい型を䜜る機胜です。配列の `.map()` の型バヌゞョンず考えるず分かりやすいでしょう。 - -```ts -type Item = { a: string; b: number }; - -// 既存のItemのキヌ(P)をすべお boolean 型に倉換する -type BooleanItem = { - [P in keyof Item]: boolean; -}; -// 結果: { a: boolean; b: boolean; } ず等䟡 -``` - -### Conditional Types (条件付き型) - -型の䞉項挔算子のようなものです。「もし型Tが型Uを継承しおいるならX型、そうでなければY型」ずいう条件分岐を定矩できたす。 - -```ts -// Tがstringなら number[] を、それ以倖なら T[] を返す型 -type StringArrayOrGeneric = T extends string ? number[] : T[]; - -type A = StringArrayOrGeneric; // number[] になる -type B = StringArrayOrGeneric; // boolean[] になる -``` - -## この章のたずめ - - * **非同期凊理**: `async` 関数の戻り倀は `Promise` で定矩する。 - * **Utility Types**: TypeScriptには型の再利甚性を高める䟿利な型が組み蟌たれおいる。 - * `Partial`: 党プロパティを任意にする。 - * `Readonly`: 党プロパティを読み取り専甚にする。 - * `Pick`: 必芁なプロパティだけ抜出する。 - * `Omit`: 䞍芁なプロパティを陀倖する。 - * **高床な型**: `Mapped Types` や `Conditional Types` を䜿うこずで、動的で柔軟な型定矩が可胜になる。 - -JavaScriptの柔軟性を保ち぀぀、堅牢さを加えるためにこれらの機胜は非垞に重芁です。特にナヌティリティ型は、冗長なコヌドを枛らす即戊力の機胜ですので、ぜひ掻甚しおください。 - -### 緎習問題1: 非同期デヌタの取埗 - -1. `Post` ずいうむンタヌフェヌスを定矩しおください`id: number`, `title: string`, `body: string`。 -2. `fetchPost` ずいう `async` 関数を䜜成しおください。この関数は匕数に `id` (number) を受け取り、戻り倀ずしお `Promise` を返したす。 -3. 関数内郚では、匕数で受け取ったデヌタをそのたた含むオブゞェクトを返しおください`setTimeout`などは䞍芁です。 -4. 䜜成した関数を実行し、結果をコン゜ヌルに衚瀺しおください。 - -```ts:practice8_1.ts -``` -```ts-exec:practice8_1.ts -``` -```js-readonly:practice8_1.js -``` - -### 緎習問題2: ナヌティリティ型の掻甚 - -アプリケヌションの蚭定を衚す `AppConfig` むンタヌフェヌスがありたす。 -以䞋の芁件を満たす新しい型ず倉数を定矩しおください。 - -1. `AppConfig` から `debugMode` を**陀倖**した型 `ProductionConfig` を定矩しおください (`Omit`を䜿甚)。 -2. `AppConfig` のすべおのプロパティを**任意Optional**にした型 `OptionalConfig` を定矩しおください (`Partial`を䜿甚)。 -3. `ProductionConfig` 型を持぀倉数 `prodConfig` を定矩し、適切な倀を代入しおください。 - -```ts:practice8_2.ts -interface AppConfig { - apiUrl: string; - retryCount: number; - timeout: number; - debugMode: boolean; -} -``` -```ts-exec:practice8_2.ts -``` -```js-readonly:practice8_2.js -``` diff --git a/sluginput.js b/sluginput.js deleted file mode 100644 index c969210..0000000 --- a/sluginput.js +++ /dev/null @@ -1,35 +0,0 @@ -import {readdir, readFile, unlink, writeFile}from"node:fs/promises"; -import readlinePromises from "node:readline/promises"; - -const dir = "ruby" -for (const dir2 of await readdir(`./public/docs/${dir}`)) { - if(dir2 === "index.yml"){continue;} - const slug2 = dir2.split("-").slice(1).join("-") - let sec1 = 0; - let sec2 = 0; - const files = await readdir(`./public/docs/${dir}/${dir2}`) - files.sort((a, b) => Number(a.split(".")[0].split("-")[0]) - Number(b.split(".")[0].split("-")[0])); - for(const file of files){ - if(file === "-intro.md"){ - continue; - } - let content = await readFile(`./public/docs/${dir}/${dir2}/${file}`, {encoding:"utf8"}); - if(content.includes("level: 2")){ - sec1++; - sec2 = 0; - }else{ - sec2++; - } - const rl = readlinePromises.createInterface({input: process.stdin, output:process.stdout}); - console.log(`${dir}/${dir2}/${file}:`) - console.log(content) - const newSlug = await rl.question(`new slug: `); - rl.close(); - console.log(`id: ${dir}-${slug2}-${newSlug}`) - console.log(`moving to ./public/docs/${dir}/${dir2}/${sec1}-${sec2}-${newSlug}.md`) - console.log("--------------------------------") - content = content.replace(/id: [\w-]+/, `id: ${dir}-${slug2}-${newSlug}`) - await writeFile(`./public/docs/${dir}/${dir2}/${sec1}-${sec2}-${newSlug}.md`, content, {encoding: "utf8"}); - await unlink(`./public/docs/${dir}/${dir2}/${file}`) - } -} From ab9643f9e70ab89444e074f802254617b9a29fc5 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Tue, 24 Feb 2026 18:36:54 +0900 Subject: [PATCH 22/25] refactor --- app/[docs_id]/page.tsx | 94 ----------- app/[docs_id]/splitMarkdown.ts | 44 ------ .../[pageId]}/chatForm.tsx | 2 +- .../[pageId]}/chatHistory.tsx | 0 .../[pageId]}/loading.tsx | 0 .../[pageId]}/markdown.tsx | 4 +- app/[lang]/[pageId]/page.tsx | 114 ++------------ .../[pageId]}/pageContent.tsx | 22 ++- .../[pageId]}/styledSyntaxHighlighter.tsx | 2 +- app/actions/chatActions.ts | 2 +- app/layout.tsx | 2 +- app/lib/docs.ts | 148 ++++++++++++++++++ app/lib/getPagesList.ts | 68 -------- app/navbar.tsx | 4 +- app/page.tsx | 2 +- app/sidebar.tsx | 68 ++++---- app/terminal/editor.tsx | 4 +- app/terminal/page.tsx | 2 +- app/terminal/repl.tsx | 2 +- app/terminal/runtime.tsx | 2 +- app/terminal/terminal.tsx | 2 +- app/{[docs_id] => }/themeToggle.tsx | 0 22 files changed, 226 insertions(+), 362 deletions(-) delete mode 100644 app/[docs_id]/page.tsx delete mode 100644 app/[docs_id]/splitMarkdown.ts rename app/{[docs_id] => [lang]/[pageId]}/chatForm.tsx (98%) rename app/{[docs_id] => [lang]/[pageId]}/chatHistory.tsx (100%) rename app/{[docs_id] => [lang]/[pageId]}/loading.tsx (100%) rename app/{[docs_id] => [lang]/[pageId]}/markdown.tsx (98%) rename app/{[docs_id] => [lang]/[pageId]}/pageContent.tsx (88%) rename app/{[docs_id] => [lang]/[pageId]}/styledSyntaxHighlighter.tsx (98%) create mode 100644 app/lib/docs.ts delete mode 100644 app/lib/getPagesList.ts rename app/{[docs_id] => }/themeToggle.tsx (100%) diff --git a/app/[docs_id]/page.tsx b/app/[docs_id]/page.tsx deleted file mode 100644 index b3fe129..0000000 --- a/app/[docs_id]/page.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { Metadata } from "next"; -import { notFound } from "next/navigation"; -import { getCloudflareContext } from "@opennextjs/cloudflare"; -import { readFile } from "node:fs/promises"; -import { join } from "node:path"; -import { splitMarkdown } from "./splitMarkdown"; -import { PageContent } from "./pageContent"; -import { ChatHistoryProvider } from "./chatHistory"; -import { getChatFromCache, initContext } from "@/lib/chatHistory"; -import { getPagesList } from "@/lib/getPagesList"; -import { isCloudflare } from "@/lib/detectCloudflare"; - -async function getMarkdownContent(docs_id: string): Promise { - try { - if (isCloudflare()) { - const cfAssets = getCloudflareContext().env.ASSETS; - const res = await cfAssets!.fetch( - `https://assets.local/docs/${docs_id}.md` - ); - if (!res.ok) { - notFound(); - } - return await res.text(); - } else { - return await readFile( - join(process.cwd(), "public", "docs", `${docs_id}.md`), - "utf-8" - ); - } - } catch (e) { - console.error(e); - notFound(); - } -} - -export async function generateMetadata({ - params, -}: { - params: Promise<{ docs_id: string }>; -}): Promise { - const { docs_id } = await params; - const mdContent = await getMarkdownContent(docs_id); - const splitMdContent = splitMarkdown(mdContent); - - // 先頭の 第nç« : を陀いたものをタむトルずする - const title = splitMdContent[0]?.title?.split(" ").slice(1).join(" "); - - const description = splitMdContent[0].rawContent; - - const [lang_id, chapter] = docs_id.split("-"); - const pagesList = await getPagesList(); - const langName = pagesList.find((l) => l.id === lang_id)?.name ?? lang_id; - - return { - title: `${langName}-${chapter}. ${title}`, - description, - }; -} - -export default async function Page({ - params, -}: { - params: Promise<{ docs_id: string }>; -}) { - const { docs_id } = await params; - const [lang_id, page_num_str] = docs_id.split("-"); - const page_num = parseInt(page_num_str); - const pagesList = await getPagesList(); - if ( - !pagesList - .find((lang) => lang.id === lang_id) - ?.pages.find((_, idx) => idx + 1 === page_num) - ) { - notFound(); - } - - const mdContent = getMarkdownContent(docs_id); - const splitMdContent = mdContent.then((text) => splitMarkdown(text)); - const context = await initContext(); - const initialChatHistories = getChatFromCache(docs_id, context); - - return ( - - - - ); -} diff --git a/app/[docs_id]/splitMarkdown.ts b/app/[docs_id]/splitMarkdown.ts deleted file mode 100644 index a6c1f76..0000000 --- a/app/[docs_id]/splitMarkdown.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { unified } from "unified"; -import remarkParse from "remark-parse"; -import remarkGfm from "remark-gfm"; - -export interface MarkdownSection { - id: string; - level: number; - title: string; - rawContent: string; // 芋出しも含めたもずのmarkdownの内容 -} -/** - * Markdownコンテンツを芋出しごずに分割し、 - * 芋出しのレベルずタむトル、内容を含むオブゞェクトの配列を返す。 - */ -export function splitMarkdown(content: string): MarkdownSection[] { - const tree = unified().use(remarkParse).use(remarkGfm).parse(content); - // console.log(tree.children.map(({ type, position }) => ({ type, position: JSON.stringify(position) }))); - const headingNodes = tree.children.filter((node) => node.type === "heading"); - const splitContent = content.split("\n"); - const sections: MarkdownSection[] = []; - for (let i = 0; i < headingNodes.length; i++) { - const startLine = headingNodes.at(i)?.position?.start.line; - if (startLine === undefined) { - continue; - } - let endLine: number | undefined = undefined; - for (let j = i + 1; j < headingNodes.length; j++) { - if (headingNodes.at(j)?.position?.start.line !== undefined) { - endLine = headingNodes.at(j)!.position!.start.line; - break; - } - } - sections.push({ - id: "", - title: splitContent[startLine - 1].replace(/#+\s*/, "").trim(), - level: headingNodes.at(i)!.depth, - rawContent: splitContent - .slice(startLine - 1, endLine ? endLine - 1 : undefined) - .join("\n") - .trim(), - }); - } - return sections; -} diff --git a/app/[docs_id]/chatForm.tsx b/app/[lang]/[pageId]/chatForm.tsx similarity index 98% rename from app/[docs_id]/chatForm.tsx rename to app/[lang]/[pageId]/chatForm.tsx index fa96b15..85d8138 100644 --- a/app/[docs_id]/chatForm.tsx +++ b/app/[lang]/[pageId]/chatForm.tsx @@ -8,7 +8,7 @@ import { useState, FormEvent, useEffect } from "react"; // } from "../actions/questionExample"; // import { getLanguageName } from "../pagesList"; import { DynamicMarkdownSection } from "./pageContent"; -import { useEmbedContext } from "../terminal/embedContext"; +import { useEmbedContext } from "@/terminal/embedContext"; import { useChatHistoryContext } from "./chatHistory"; import { askAI } from "@/actions/chatActions"; diff --git a/app/[docs_id]/chatHistory.tsx b/app/[lang]/[pageId]/chatHistory.tsx similarity index 100% rename from app/[docs_id]/chatHistory.tsx rename to app/[lang]/[pageId]/chatHistory.tsx diff --git a/app/[docs_id]/loading.tsx b/app/[lang]/[pageId]/loading.tsx similarity index 100% rename from app/[docs_id]/loading.tsx rename to app/[lang]/[pageId]/loading.tsx diff --git a/app/[docs_id]/markdown.tsx b/app/[lang]/[pageId]/markdown.tsx similarity index 98% rename from app/[docs_id]/markdown.tsx rename to app/[lang]/[pageId]/markdown.tsx index 58d519e..05b446c 100644 --- a/app/[docs_id]/markdown.tsx +++ b/app/[lang]/[pageId]/markdown.tsx @@ -2,8 +2,8 @@ import Markdown, { Components, ExtraProps } from "react-markdown"; import remarkGfm from "remark-gfm"; import removeComments from "remark-remove-comments"; import remarkCjkFriendly from "remark-cjk-friendly"; -import { EditorComponent, getAceLang } from "../terminal/editor"; -import { ExecFile } from "../terminal/exec"; +import { EditorComponent, getAceLang } from "@/terminal/editor"; +import { ExecFile } from "@/terminal/exec"; import { JSX, ReactNode } from "react"; import { getRuntimeLang } from "@/terminal/runtime"; import { ReplTerminal } from "@/terminal/repl"; diff --git a/app/[lang]/[pageId]/page.tsx b/app/[lang]/[pageId]/page.tsx index 0b46d51..bb52d69 100644 --- a/app/[lang]/[pageId]/page.tsx +++ b/app/[lang]/[pageId]/page.tsx @@ -1,105 +1,9 @@ import { Metadata } from "next"; import { notFound } from "next/navigation"; -import { getCloudflareContext } from "@opennextjs/cloudflare"; -import { readFile } from "node:fs/promises"; -import { join } from "node:path"; -import yaml from "js-yaml"; -import { MarkdownSection } from "../../[docs_id]/splitMarkdown"; -import { PageContent } from "../../[docs_id]/pageContent"; -import { ChatHistoryProvider } from "../../[docs_id]/chatHistory"; +import { PageContent } from "./pageContent"; +import { ChatHistoryProvider } from "./chatHistory"; import { getChatFromCache, initContext } from "@/lib/chatHistory"; -import { getPagesList } from "@/lib/getPagesList"; -import { isCloudflare } from "@/lib/detectCloudflare"; - -async function readDocFile( - lang: string, - pageId: string, - filename: string -): Promise { - try { - if (isCloudflare()) { - const cfAssets = getCloudflareContext().env.ASSETS; - const res = await cfAssets!.fetch( - `https://assets.local/docs/${lang}/${pageId}/${filename}` - ); - if (!res.ok) notFound(); - return await res.text(); - } else { - return await readFile( - join(process.cwd(), "public", "docs", lang, pageId, filename), - "utf-8" - ); - } - } catch { - notFound(); - } -} - -/** - * YAMLフロントマタヌをパヌスしおid, title, level, bodyを返す。 - * フロントマタヌがない堎合はid/titleを空文字、levelを0で返す。 - */ -function parseFrontmatter(content: string): { - id: string; - title: string; - level: number; - body: string; -} { - if (!content.startsWith("---\n")) { - return { id: "", title: "", level: 0, body: content }; - } - const endIdx = content.indexOf("\n---\n", 4); - if (endIdx === -1) { - return { id: "", title: "", level: 0, body: content }; - } - const fm = yaml.load(content.slice(4, endIdx)) as { - id?: string; - title?: string; - level?: number; - }; - const body = content.slice(endIdx + 5); - return { - id: fm?.id ?? "", - title: fm?.title ?? "", - level: fm?.level ?? 2, - body, - }; -} - -/** - * public/docs/{lang}/{pageId}/ 以䞋のmdファむルを結合しお MarkdownSection[] を返す。 - */ -async function getMarkdownSections( - lang: string, - pageId: string, - pageTitle: string -): Promise { - const sectionsYml = await readDocFile(lang, pageId, "sections.yml"); - const files = yaml.load(sectionsYml) as string[]; - - const sections: MarkdownSection[] = []; - for (const file of files) { - const raw = await readDocFile(lang, pageId, file); - if (file === "-intro.md") { - // むントロセクションはフロントマタヌなし・芋出しなし - sections.push({ - id: `${lang}-${pageId}-intro`, - level: 1, - title: pageTitle, - rawContent: raw.trim(), - }); - } else { - const { id, title, level, body } = parseFrontmatter(raw); - sections.push({ - id, - level, - title, - rawContent: body.trim(), - }); - } - } - return sections; -} +import { getMarkdownSections, getPagesList } from "@/lib/docs"; export async function generateMetadata({ params, @@ -109,12 +13,11 @@ export async function generateMetadata({ const { lang, pageId } = await params; const pagesList = await getPagesList(); const langEntry = pagesList.find((l) => l.id === lang); - const pageIndex = langEntry?.pages.findIndex((p) => p.slug === pageId) ?? -1; - const pageEntry = pageIndex >= 0 ? langEntry!.pages[pageIndex] : undefined; + const pageEntry = langEntry?.pages.find((p) => p.slug === pageId); if (!langEntry || !pageEntry) notFound(); return { - title: `${langEntry!.name}-${pageIndex + 1}. ${pageEntry!.name}`, + title: `${langEntry!.name}-${pageEntry.index}. ${pageEntry.title}`, }; } @@ -130,10 +33,10 @@ export default async function Page({ if (!langEntry || !pageEntry) notFound(); const docsId = `${lang}/${pageId}`; - const sections = await getMarkdownSections(lang, pageId, pageEntry!.name); + const sections = await getMarkdownSections(lang, pageId); // AI甚のドキュメント党文rawContentを結合 - const documentContent = sections.map((s) => s.rawContent).join("\n\n"); + const documentContent = sections.map((s) => s.rawContent).join("\n"); const context = await initContext(); const initialChatHistories = await getChatFromCache(docsId, context); @@ -146,7 +49,10 @@ export default async function Page({ ); diff --git a/app/[docs_id]/pageContent.tsx b/app/[lang]/[pageId]/pageContent.tsx similarity index 88% rename from app/[docs_id]/pageContent.tsx rename to app/[lang]/[pageId]/pageContent.tsx index e3219de..30baaae 100644 --- a/app/[docs_id]/pageContent.tsx +++ b/app/[lang]/[pageId]/pageContent.tsx @@ -1,12 +1,12 @@ "use client"; import { Fragment, useEffect, useRef, useState } from "react"; -import { MarkdownSection } from "./splitMarkdown"; import { ChatForm } from "./chatForm"; -import { StyledMarkdown } from "./markdown"; +import { Heading, StyledMarkdown } from "./markdown"; import { useChatHistoryContext } from "./chatHistory"; -import { useSidebarMdContext } from "../sidebar"; +import { useSidebarMdContext } from "@/sidebar"; import clsx from "clsx"; +import { MarkdownSection, PageEntry } from "@/lib/docs"; // MarkdownSectionに远加で、ナヌザヌが今そのセクションを読んでいるかどうか、などの動的な情報を持たせる export type DynamicMarkdownSection = MarkdownSection & { @@ -16,6 +16,10 @@ export type DynamicMarkdownSection = MarkdownSection & { interface PageContentProps { documentContent: string; splitMdContent: MarkdownSection[]; + pageEntry: PageEntry; + lang: string; + pageId: string; + // TODO: チャット呚りのid管理をsectionIdに移行し、docs_idパラメヌタを削陀 docs_id: string; } export function PageContent(props: PageContentProps) { @@ -38,8 +42,8 @@ export function PageContent(props: PageContentProps) { inView: false, })); setDynamicMdContent(newContent); - setSidebarMdContent(props.docs_id, newContent); - }, [props.splitMdContent, props.docs_id, setSidebarMdContent]); + setSidebarMdContent(props.lang, props.pageId, newContent); + }, [props.splitMdContent, props.lang, props.pageId, setSidebarMdContent]); const sectionRefs = useRef>([]); // sectionRefsの長さをsplitMdContentに合わせる @@ -66,14 +70,14 @@ export function PageContent(props: PageContentProps) { // ロヌカルstateずcontextの䞡方を曎新 setDynamicMdContent(updateContent); - setSidebarMdContent(props.docs_id, updateContent); + setSidebarMdContent(props.lang, props.pageId, updateContent); }; window.addEventListener("scroll", handleScroll); handleScroll(); return () => { window.removeEventListener("scroll", handleScroll); }; - }, [setSidebarMdContent, props.docs_id]); + }, [setSidebarMdContent, props.lang, props.pageId]); const [isFormVisible, setIsFormVisible] = useState(false); @@ -86,6 +90,10 @@ export function PageContent(props: PageContentProps) { gridTemplateColumns: `1fr auto`, }} > + + 第{props.pageEntry.index}ç« : {props.pageEntry.title} + +
      {dynamicMdContent.map((section, index) => (
      { + try { + if (isCloudflare()) { + const cfAssets = getCloudflareContext().env.ASSETS; + const res = await cfAssets!.fetch(`https://assets.local/${path}`); + if (!res.ok) { + console.error( + `Failed to fetch ${path}: ${res.status} ${await res.text()}` + ); + notFound(); + } + return await res.text(); + } else { + return await readFile(join(process.cwd(), "public", path), "utf-8"); + } + } catch (e) { + console.error(`Failed to read file ${path}: ${e}`); + notFound(); + } +} + +async function getLanguageIds(): Promise { + if (isCloudflare()) { + const raw = await readPublicFile("docs/languages.yml"); + return yaml.load(raw) as string[]; + } else { + const docsDir = join(process.cwd(), "public", "docs"); + const entries = await readdir(docsDir, { withFileTypes: true }); + return entries + .filter((e) => e.isDirectory()) + .map((e) => e.name) + .sort(); + } +} + +export async function getPagesList(): Promise { + const langIds = await getLanguageIds(); + return await Promise.all( + langIds.map(async (langId) => { + const raw = await readPublicFile(`docs/${langId}/index.yml`); + const data = yaml.load(raw) as IndexYml; + return { + id: langId, + name: data.name, + description: data.description, + pages: data.pages.map((p, index) => ({ + ...p, + index, + })), + }; + }) + ); +} + +/** + * public/docs/{lang}/{pageId}/ 以䞋のmdファむルを結合しお MarkdownSection[] を返す。 + */ +export async function getMarkdownSections( + lang: string, + pageId: string +): Promise { + const sectionsYml = await readPublicFile( + `docs/${lang}/${pageId}/sections.yml` + ); + const files = yaml.load(sectionsYml) as string[]; + + const sections: MarkdownSection[] = []; + for (const file of files) { + const raw = await readPublicFile(`docs/${lang}/${pageId}/${file}`); + if (file === "-intro.md") { + // むントロセクションはフロントマタヌなし・芋出しなし + sections.push({ + id: `${lang}-${pageId}-intro`, + level: 1, + title: "", + rawContent: raw, + }); + } else { + sections.push(parseFrontmatter(raw, file)); + } + } + return sections; +} + +/** + * YAMLフロントマタヌをパヌスしおid, title, level, bodyを返す。 + * フロントマタヌがない堎合はid/titleを空文字、levelを0で返す。 + */ +function parseFrontmatter(content: string, file: string): MarkdownSection { + if (!content.startsWith("---\n")) { + throw new Error(`File ${file} is missing frontmatter`); + } + const endIdx = content.indexOf("\n---\n", 4); + if (endIdx === -1) { + throw new Error(`File ${file} has invalid frontmatter`); + } + const fm = yaml.load(content.slice(4, endIdx)) as { + id?: string; + title?: string; + level?: number; + }; + // TODO: validation of frontmatter using zod + const rawContent = content.slice(endIdx + 5); + return { + id: fm?.id ?? "", + title: fm?.title ?? "", + level: fm?.level ?? 2, + rawContent, + }; +} diff --git a/app/lib/getPagesList.ts b/app/lib/getPagesList.ts deleted file mode 100644 index 54a25d3..0000000 --- a/app/lib/getPagesList.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { getCloudflareContext } from "@opennextjs/cloudflare"; -import { readFile, readdir } from "node:fs/promises"; -import { join } from "node:path"; -import yaml from "js-yaml"; -import { isCloudflare } from "./detectCloudflare"; - -export interface PageEntry { - slug: string; - name: string; - title: string; -} - -export interface LanguageEntry { - id: string; - name: string; - description: string; - pages: PageEntry[]; -} - -interface IndexYml { - name: string; - description: string; - pages: PageEntry[]; -} - -async function readPublicFile(path: string): Promise { - if (isCloudflare()) { - const cfAssets = getCloudflareContext().env.ASSETS; - const res = await cfAssets!.fetch(`https://assets.local/${path}`); - if (!res.ok) throw new Error(`Failed to fetch ${path}`); - return await res.text(); - } else { - return await readFile( - join(process.cwd(), "public", path), - "utf-8" - ); - } -} - -async function getLanguageIds(): Promise { - if (isCloudflare()) { - const raw = await readPublicFile("docs/languages.yml"); - return yaml.load(raw) as string[]; - } else { - const docsDir = join(process.cwd(), "public", "docs"); - const entries = await readdir(docsDir, { withFileTypes: true }); - return entries - .filter((e) => e.isDirectory()) - .map((e) => e.name) - .sort(); - } -} - -export async function getPagesList(): Promise { - const langIds = await getLanguageIds(); - return await Promise.all( - langIds.map(async (langId) => { - const raw = await readPublicFile(`docs/${langId}/index.yml`); - const data = yaml.load(raw) as IndexYml; - return { - id: langId, - name: data.name, - description: data.description, - pages: data.pages, - }; - }) - ); -} diff --git a/app/navbar.tsx b/app/navbar.tsx index bbdd86f..6e7548f 100644 --- a/app/navbar.tsx +++ b/app/navbar.tsx @@ -2,9 +2,9 @@ import Link from "next/link"; import { AccountMenu } from "./accountMenu"; -import { ThemeToggle } from "./[docs_id]/themeToggle"; +import { ThemeToggle } from "./themeToggle"; import { usePathname } from "next/navigation"; -import { LanguageEntry } from "@/lib/getPagesList"; +import { LanguageEntry } from "@/lib/docs"; function PageTitle({ pagesList }: { pagesList: LanguageEntry[] }) { const pathname = usePathname(); diff --git a/app/page.tsx b/app/page.tsx index 72472d1..fd3ead3 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,6 +1,6 @@ import { Metadata } from "next"; import Link from "next/link"; -import { getPagesList } from "@/lib/getPagesList"; +import { getPagesList } from "@/lib/docs"; import clsx from "clsx"; export const metadata: Metadata = { diff --git a/app/sidebar.tsx b/app/sidebar.tsx index 7276920..5701167 100644 --- a/app/sidebar.tsx +++ b/app/sidebar.tsx @@ -1,9 +1,9 @@ "use client"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import { LanguageEntry } from "@/lib/getPagesList"; +import { LanguageEntry } from "@/lib/docs"; import { AccountMenu } from "./accountMenu"; -import { ThemeToggle } from "./[docs_id]/themeToggle"; +import { ThemeToggle } from "./themeToggle"; import { createContext, ReactNode, @@ -12,16 +12,17 @@ import { useEffect, useState, } from "react"; -import { DynamicMarkdownSection } from "./[docs_id]/pageContent"; +import { DynamicMarkdownSection } from "./[lang]/[pageId]/pageContent"; import clsx from "clsx"; import { LanguageIcon } from "./terminal/icons"; import { RuntimeLang } from "./terminal/runtime"; export interface ISidebarMdContext { - loadedDocsId: string; + loadedDocsId: { lang: string; pageId: string } | null; sidebarMdContent: DynamicMarkdownSection[]; setSidebarMdContent: ( - docsId: string, + lang: string, + pageId: string, content: | DynamicMarkdownSection[] | ((prev: DynamicMarkdownSection[]) => DynamicMarkdownSection[]) @@ -48,15 +49,19 @@ export function SidebarMdProvider({ children }: { children: ReactNode }) { const [sidebarMdContent, setSidebarMdContent_] = useState< DynamicMarkdownSection[] >([]); - const [loadedDocsId, setLoadedDocsId] = useState(""); + const [loadedDocsId, setLoadedDocsId] = useState<{ + lang: string; + pageId: string; + } | null>(null); const setSidebarMdContent = useCallback( ( - docsId: string, + lang: string, + pageId: string, content: | DynamicMarkdownSection[] | ((prev: DynamicMarkdownSection[]) => DynamicMarkdownSection[]) ) => { - setLoadedDocsId(docsId); + setLoadedDocsId({ lang, pageId }); setSidebarMdContent_(content); }, [] @@ -76,37 +81,41 @@ export function SidebarMdProvider({ children }: { children: ReactNode }) { export function Sidebar({ pagesList }: { pagesList: LanguageEntry[] }) { const pathname = usePathname(); - const currentDocsId = pathname.replace(/^\//, ""); // ちょっず遅延がある + const pathnameMatch = pathname.match(/^\/([\w-_]+)\/([\w-_]+).*?/); + const currentLang = pathnameMatch?.[1]; + const currentPageId = pathnameMatch?.[2]; const sidebarContext = useSidebarMdContext(); // sidebarMdContextの情報が叀かったら䜿わない const sidebarMdContent = - sidebarContext.loadedDocsId === currentDocsId + sidebarContext.loadedDocsId && + sidebarContext.loadedDocsId.lang === currentLang && + sidebarContext.loadedDocsId.pageId === currentPageId ? sidebarContext.sidebarMdContent : []; // 珟圚衚瀺䞭のセクション最初にinViewがtrueのものを芋぀ける - const currentSectionIndex = sidebarMdContent.findIndex( + const currentSectionId = sidebarMdContent.find( (section, i) => i >= 1 && section.inView - ); + )?.id; // 目次の開閉状態 const [detailsOpen, setDetailsOpen] = useState([]); - const currentGroupIndex = pagesList.findIndex((group) => - currentDocsId.startsWith(`${group.id}/`) + const currentLangIndex = pagesList.findIndex( + (group) => currentLang === group.id ); useEffect(() => { // 衚瀺しおいるグルヌプが倉わったずきに珟圚のグルヌプのdetailsを開く - if (currentGroupIndex !== -1) { + if (currentLangIndex !== -1) { setDetailsOpen((detailsOpen) => { const newDetailsOpen = [...detailsOpen]; - while (newDetailsOpen.length <= currentGroupIndex) { + while (newDetailsOpen.length <= currentLangIndex) { newDetailsOpen.push(false); } - newDetailsOpen[currentGroupIndex] = true; + newDetailsOpen[currentLangIndex] = true; return newDetailsOpen; }); } - }, [currentGroupIndex]); + }, [currentLangIndex]); return (
      @@ -169,30 +178,27 @@ export function Sidebar({ pagesList }: { pagesList: LanguageEntry[] }) { {group.name}
        - {group.pages.map((page, pageIndex) => ( + {group.pages.map((page) => (
      • - - {pageIndex + 1}. - + {page.index}. {page.name} - {`${group.id}/${page.slug}` === currentDocsId && + {group.id === currentLang && + page.slug === currentPageId && sidebarMdContent.length > 0 && (
          - {sidebarMdContent.slice(1).map((section, idx) => { - // idx + 1 は実際のsectionIndexに察応slice(1)で最初を陀倖しおいるため - const isCurrentSection = - idx + 1 === currentSectionIndex; + {sidebarMdContent.slice(1).map((section) => { return (
        • {section.title} diff --git a/app/terminal/editor.tsx b/app/terminal/editor.tsx index e280f3b..4def9ed 100644 --- a/app/terminal/editor.tsx +++ b/app/terminal/editor.tsx @@ -2,10 +2,10 @@ import { lazy, Suspense, useEffect, useState } from "react"; import clsx from "clsx"; -import { useChangeTheme } from "../[docs_id]/themeToggle"; +import { useChangeTheme } from "@/themeToggle"; import { useEmbedContext } from "./embedContext"; import { langConstants } from "./runtime"; -import { MarkdownLang } from "@/[docs_id]/styledSyntaxHighlighter"; +import { MarkdownLang } from "@/[lang]/[pageId]/styledSyntaxHighlighter"; // https://github.com/securingsincity/react-ace/issues/27 により普通のimportができない const AceEditor = lazy(async () => { diff --git a/app/terminal/page.tsx b/app/terminal/page.tsx index 20f4ffb..a5dcafb 100644 --- a/app/terminal/page.tsx +++ b/app/terminal/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { Heading } from "@/[docs_id]/markdown"; +import { Heading } from "@/[lang]/[pageId]/markdown"; import "mocha/mocha.css"; import { Fragment, useEffect, useRef, useState } from "react"; import { useWandbox } from "./wandbox/runtime"; diff --git a/app/terminal/repl.tsx b/app/terminal/repl.tsx index 286d35e..bca122b 100644 --- a/app/terminal/repl.tsx +++ b/app/terminal/repl.tsx @@ -16,7 +16,7 @@ import type { Terminal } from "@xterm/xterm"; import { useEmbedContext } from "./embedContext"; import { emptyMutex, langConstants, RuntimeLang, useRuntime } from "./runtime"; import clsx from "clsx"; -import { InlineCode } from "@/[docs_id]/markdown"; +import { InlineCode } from "@/[lang]/[pageId]/markdown"; export type ReplOutputType = | "stdout" diff --git a/app/terminal/runtime.tsx b/app/terminal/runtime.tsx index 90c29cb..5fe2e75 100644 --- a/app/terminal/runtime.tsx +++ b/app/terminal/runtime.tsx @@ -10,7 +10,7 @@ import { RubyContext, useRuby } from "./worker/ruby"; import { JSEvalContext, useJSEval } from "./worker/jsEval"; import { WorkerProvider } from "./worker/runtime"; import { TypeScriptProvider, useTypeScript } from "./typescript/runtime"; -import { MarkdownLang } from "@/[docs_id]/styledSyntaxHighlighter"; +import { MarkdownLang } from "@/[lang]/[pageId]/styledSyntaxHighlighter"; /** * Common runtime context interface for different languages diff --git a/app/terminal/terminal.tsx b/app/terminal/terminal.tsx index efa3057..79d614d 100644 --- a/app/terminal/terminal.tsx +++ b/app/terminal/terminal.tsx @@ -6,7 +6,7 @@ import type { FitAddon } from "@xterm/addon-fit"; import "@xterm/xterm/css/xterm.css"; import chalk from "chalk"; chalk.level = 3; -import { useChangeTheme } from "../[docs_id]/themeToggle"; +import { useChangeTheme } from "@/themeToggle"; /** * 文字列の幅を蚈算する。 diff --git a/app/[docs_id]/themeToggle.tsx b/app/themeToggle.tsx similarity index 100% rename from app/[docs_id]/themeToggle.tsx rename to app/themeToggle.tsx From 2594cc788f73dc732ec41eb58880434b7cd89c30 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Tue, 24 Feb 2026 18:57:14 +0900 Subject: [PATCH 23/25] =?UTF-8?q?=E9=9B=91=E3=81=AB=E3=82=BF=E3=83=BC?= =?UTF-8?q?=E3=83=9F=E3=83=8A=E3=83=ABid=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/[lang]/[pageId]/pageContent.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/[lang]/[pageId]/pageContent.tsx b/app/[lang]/[pageId]/pageContent.tsx index 30baaae..fd8ac65 100644 --- a/app/[lang]/[pageId]/pageContent.tsx +++ b/app/[lang]/[pageId]/pageContent.tsx @@ -104,7 +104,12 @@ export function PageContent(props: PageContentProps) { }} > {/* ドキュメントのコンテンツ */} - +
      {/* 右偎に衚瀺するチャット履歎欄 */} From faa978211c80a92686f350809e5e6d552ec5927f Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Tue, 24 Feb 2026 18:59:41 +0900 Subject: [PATCH 24/25] =?UTF-8?q?=E7=9B=AE=E6=AC=A1=E3=81=AE=E6=8A=98?= =?UTF-8?q?=E8=BF=94=E3=81=97=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/sidebar.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/sidebar.tsx b/app/sidebar.tsx index 5701167..6aead65 100644 --- a/app/sidebar.tsx +++ b/app/sidebar.tsx @@ -206,11 +206,12 @@ export function Sidebar({ pagesList }: { pagesList: LanguageEntry[] }) { > {section.title} From 9fa2c0a186d55e2b535f39303763ee202a479b59 Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:14:12 +0900 Subject: [PATCH 25/25] =?UTF-8?q?description=E3=81=8C=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/[lang]/[pageId]/page.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/[lang]/[pageId]/page.tsx b/app/[lang]/[pageId]/page.tsx index bb52d69..d4391ad 100644 --- a/app/[lang]/[pageId]/page.tsx +++ b/app/[lang]/[pageId]/page.tsx @@ -16,8 +16,12 @@ export async function generateMetadata({ const pageEntry = langEntry?.pages.find((p) => p.slug === pageId); if (!langEntry || !pageEntry) notFound(); + const sections = await getMarkdownSections(lang, pageId); + const description = sections[0].rawContent; + return { title: `${langEntry!.name}-${pageEntry.index}. ${pageEntry.title}`, + description, }; }