投稿

9月, 2026の投稿を表示しています

#25 PHPで学ぶAI API(ChatGPT等)の呼び出し方の基本

ChatGPTのようなAI(人工知能)が回答を生成してくれる仕組みを、自分のプログラムから呼び出せたら便利だと思いませんか。実はそれほど難しいことではなく、PHPからでも数十行のコードでAI API(AIの機能をインターネット経由で使えるようにした窓口)を呼び出すことができます。この記事では、PHPを使ってAI APIにアクセスする基本の流れを、初めての方にもわかるように解説します。 AI APIとは何か API(Application Programming Interface)とは、あるプログラムが別のプログラムの機能を呼び出すための「窓口」のようなものです。AI APIは、ChatGPTのような対話型AIの機能を、インターネット経由でリクエスト(依頼)を送ることで使えるようにしたサービスです。自分のパソコンでAIモデルを動かす必要はなく、質問文を送るとAIが考えた回答が返ってくる、という仕組みになっています。 PHPからAI APIを呼び出す準備 APIキーとは AI APIを使うには、多くの場合「APIキー」と呼ばれる文字列が必要です。これは、誰がどれだけAPIを使ったかを識別するための、いわば「合言葉」のようなものです。AIサービスの提供元(例えばOpenAI社)のサイトでアカウントを作成すると、このAPIキーを発行してもらえます。 APIキーの安全な管理方法 APIキーはパスワードと同じくらい大切な情報です。もし他人に知られてしまうと、勝手にAPIを使われて利用料金が発生してしまう恐れがあります。そのため、APIキーをソースコードの中に直接書き込むのは避けましょう。代わりに、環境変数(プログラムの外側で管理する設定値)や、Gitの管理対象から外した .env ファイルに保存し、プログラムから読み込む方法が一般的です。もしGitHubなどにコードを公開する場合は、 .gitignore ファイルに .env を必ず追加しておきましょう。 cURLで実際に呼び出してみる PHPには「cURL」という、外部のWebサービスと通信するための仕組みが標準で備わっています。ここでは、OpenAIのAPIを例に、簡単な質問を送って回答を受け取るコードを見てみましょう。 <?php // APIキーは環境変数から読み込む(直接書き込ま...

#25 Scalaで学ぶAI API(ChatGPT等)の呼び出し方の基本

#25 Scalaで学ぶAI API(ChatGPT等)の呼び出し方の基本 ChatGPTのようなAI(人工知能)が返す文章を、自分のプログラムから使ってみたいと思ったことはありませんか。実はこうしたAIの多くは「API」という仕組みを通じて、誰でもプログラムから呼び出せるようになっています。今回はScalaという言語を使って、AI APIを呼び出す基本のやり方を見ていきましょう。 AI APIとは何か API(エーピーアイ)とは「Application Programming Interface」の略です。あるソフトウェアの機能を、別のプログラムから使えるようにするための窓口のようなものです。ChatGPTなどのAIサービスは、インターネット経由でリクエスト(依頼)を送ると、AIが考えた答えをレスポンス(返答)として返してくれるAPIを公開しています。 このやり取りは多くの場合「REST API」と呼ばれる形式で行われます。難しく聞こえますが、要するに「決まった形のURLに、決まった形のデータを送ると、決まった形のデータが返ってくる」というシンプルな約束事だと考えれば大丈夫です。データのやり取りには「JSON」というテキスト形式がよく使われます。JSONは`{"key": "value"}`のように、名前と値をペアで書く、人にも読みやすいデータの書き方です。 ScalaでHTTP通信をするには ScalaはJava仮想マシン(JVM)上で動く言語で、Javaの豊富なライブラリ(便利な部品集)がそのまま使える点が特徴です。ただ、素のJavaのHTTP通信の書き方はやや冗長なので、Scala向けのHTTPクライアントライブラリを使うのが一般的です。代表的なものに「sttp」というライブラリがあります。 sttpを使うと、次のようなイメージでリクエストを組み立てられます。 import sttp.client3._ val request = basicRequest .header("Authorization", s"Bearer $apiKey") .header("Content-Type", "applicat...

#25 Dartで学ぶAI API(ChatGPT等)の呼び出し方の基本

ChatGPTのようなAI(人工知能)が提供する「API」を、自分のプログラムから呼び出してみたいと思ったことはありませんか。APIとは「Application Programming Interface」の略で、あるサービスが持つ機能を、外部のプログラムから使えるようにする窓口のことです。今回は、Googleが開発したプログラミング言語「Dart」を使って、AI APIを呼び出す基本の流れを見ていきます。Dartは主にスマートフォンアプリ開発フレームワーク「Flutter」で使われる言語ですが、単体のプログラムとしても動かせます。 AI APIを呼び出すとはどういうことか ChatGPTなどのAIサービスの多くは、「HTTPリクエスト」という仕組みでやり取りできる窓口(API)を用意しています。HTTPリクエストとは、インターネット上のサーバーに対して「このデータをください」「この内容を処理してください」とお願いする通信の形式です。私たちがブラウザでWebページを見るときも、裏側では同じ仕組みが使われています。 AI APIの場合、こちらから「こんな質問をします」という文章(プロンプトと呼びます)をサーバーに送ります。すると、AIが考えた返事がデータとして返ってくる、という流れになります。つまり、プログラムからAPIを呼び出すというのは、この「送って、受け取る」という一連の通信処理をコードで書くことに他なりません。 Dartでの基本の書き方 Dartには標準で dart:io というHTTP通信用のライブラリが含まれています。ただし実務では、もう少し使いやすい http という外部パッケージ(他の人が作って公開している便利な部品集)を使うのが一般的です。パッケージは pubspec.yaml というファイルに依存関係として書き加え、 dart pub get コマンドで取り込みます。 実際にAPIを呼び出すコードのイメージは、次のようになります。 import 'dart:convert'; import 'package:http/http.dart' as http; Future<void> askAI(String question) async { final url = Uri.par...

#20 TypeScriptで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

TypeScriptで関数を書いていると、「引数を渡さなかったときは決まった値を使いたい」「いくつ渡されるか分からない引数を受け取りたい」という場面によく出会います。今回はそんなときに役立つ「デフォルト引数」と「可変長引数(レスト引数)」という2つの機能を紹介します。どちらも、関数をより柔軟で使いやすくするための仕組みです。 デフォルト引数とは 「デフォルト引数」とは、関数を呼び出すときに引数を省略した場合に、あらかじめ決めておいた値(初期値)を自動的に使ってくれる仕組みです。呼び出し側が毎回すべての引数を指定しなくてもよくなるので、関数を使う側の手間が減ります。 書き方はとてもシンプルで、引数の後ろに = 初期値 を付けるだけです。 function greet(name: string, greeting: string = "こんにちは"): string { return `${greeting}、${name}さん!`; } console.log(greet("田中")); // こんにちは、田中さん! console.log(greet("鈴木", "おはよう")); // おはよう、鈴木さん! 上の例では、 greeting に値を渡さなければ自動的に「こんにちは」が使われます。JavaScriptにも同じ書き方のデフォルト引数はありますが、TypeScriptでは型注釈と組み合わせられる点がポイントです。型注釈とは、その変数がどんな種類のデータかを示すラベルのようなものです。 greeting: string = "こんにちは" のように書いておけば、「greetingは文字列型で、省略時は"こんにちは"になる」という情報がコード上ではっきりします。 なお、デフォルト引数は必ず引数リストの後ろの方に置くのが基本です。省略できない引数を先に、省略可能な引数を後にする順番を意識すると、呼び出し側も迷いにくくなります。 可変長引数(レスト引数)とは 「可変長引数」とは、いくつ渡されるか事前にわからない数の引数を、まとめて1つの配列として受け取る仕組みです。TypeScript(JavaSc...

#20 Rustで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

はじめに PythonやJavaScriptで関数を書いていると、「引数を省略したら自動でデフォルトの値が使われる」機能や、「引数の数を自由に増やせる」機能を使ったことがある人は多いと思います。たとえばPythonなら def greet(name, greeting="こんにちは") のように、引数に最初から値を入れておく「デフォルト引数」が書けます。また、 def total(*numbers) のように、いくつでも数値を渡せる「可変長引数」も気軽に書けます。 ところが、Rustにはこの2つの機能が言語として用意されていません。最初は「不便だな」と感じるかもしれませんが、Rustには代わりの書き方がいくつも用意されています。今回は、Rustで「デフォルト引数っぽいこと」「可変長引数っぽいこと」を実現する方法を、初心者向けにやさしく紹介します。 なぜRustにはデフォルト引数がないのか Rustは「関数のシグネチャ(引数の型や数などの定義)を見ただけで、呼び出し方を誤解なく判断できる」ことを重視している言語です。デフォルト引数を許すと、呼び出す側がどの引数を省略したのか読み取りにくくなる場合があるため、あえて言語機能として採用していません。その代わり、次のような書き方で似たことを実現できます。 方法1: Option型を使う Option型 とは、「値があるかもしれないし、ないかもしれない」ことを表すRust特有の型です。値がある場合は Some(値) 、ない場合は None という形で表現します。これを引数に使うと、「省略したい場合はNoneを渡す」という形でデフォルト引数のような動きを再現できます。 fn greet(name: &str, greeting: Option<&str>) { let greeting = greeting.unwrap_or("こんにちは"); println!("{}、{}さん", greeting, name); } fn main() { greet("太郎", None); // こんにちは、太郎さん greet("花子...

#20 Goで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

Pythonを触ったことがある人なら、関数を定義するときに「引数を省略したらこの値を使う」というデフォルト引数を書いた経験があるかもしれません。ところが、Goで同じ書き方をしようとすると、そんな構文はどこにもないことに気づきます。今回は、Goに「デフォルト引数」がない理由と、その代わりにどう書けばよいのかを紹介します。あわせて、渡す個数を自由に変えられる「可変長引数」についても解説します。 Goにはデフォルト引数がない PythonやJavaScript、C++などでは、関数の引数に初期値をあらかじめ設定しておく「デフォルト引数」という仕組みがあります。呼び出し側が値を渡さなければ、その初期値が自動的に使われる、というものです。 ところがGoの設計方針は「言語仕様をできるだけシンプルに保つ」ことを重視しており、デフォルト引数の構文はあえて用意されていません。同じように、同じ関数名で引数の型や数が違うバージョンを複数定義できる「関数オーバーロード」もGoには存在しません。慣れないうちは不便に感じるかもしれませんが、これはGoが「関数を読んだときに、何が起きるか一目でわかること」を大事にしているためです。 可変長引数(...構文)の使い方 デフォルト引数はありませんが、「引数の個数を呼び出し側が自由に決められる」可変長引数はGoにもちゃんと用意されています。型の前に ... を付けるだけです。 func sum(nums ...int) int { total := 0 for _, n := range nums { total += n } return total } func main() { fmt.Println(sum()) // 0 fmt.Println(sum(1, 2)) // 3 fmt.Println(sum(1, 2, 3)) // 6 } 関数の中では、 nums はint型のスライス(可変長の配列のようなもの)として扱われます。引数を1つも渡さなければ空のスライスになるため、上のように sum() を呼んでもエラーにはなりません。標準ライブラリの fmt.Println も、実はこの可変長引数を使って実装されています。 すで...

#20 Javaで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

「関数(メソッド)に、状況に応じて渡す引数の数を変えたい」——そんな場面に出会ったことはありませんか。たとえば「割引率を指定しなかったら0%として計算する」とか、「数値をいくつでも渡せる合計関数を作りたい」といった要望です。 Python など一部の言語には、こうした要望に応える「デフォルト引数」という仕組みが標準で用意されています。関数を定義するときに引数の初期値をあらかじめ決めておき、呼び出し側で省略できるようにする機能です。しかし、Javaにはこのデフォルト引数という言語仕様が存在しません。今回は、Javaがその代わりにどんな方法で同じような柔軟さを実現しているのかを見ていきましょう。 Javaにデフォルト引数がない理由と代替手段 まず前提として、Javaの設計方針では「引数の数や型によって呼び出し方を明確に区別する」ことが重視されています。デフォルト引数のような「省略できる引数」を許すと、コードを読む人が「実際に何が渡されているのか」を把握しにくくなります。そう考えられているためです。良し悪しというより、言語ごとの設計思想の違いだと捉えておくとよいでしょう。 では、Javaで「引数を省略したような呼び出し」をしたい場合はどうするのか。答えは「メソッドのオーバーロード(overload)」です。オーバーロードとは、同じ名前のメソッドを、引数の数や型を変えて複数定義できる仕組みのことです。呼び出し側が渡した引数の内容に応じて、コンパイラが自動的にどのメソッドを使うかを判断してくれます。 オーバーロードの具体例 たとえば「割引率を指定しない場合は0%として計算する」処理は、以下のように2つのメソッドを用意することで実現できます。 public class Shop { // 割引率を指定するバージョン static int calcPrice(int price, double discountRate) { return (int) (price * (1 - discountRate)); } // 割引率を省略した場合のバージョン(0%扱い) static int calcPrice(int price) { return calcPrice(price, ...

#20 Kotlinで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

Kotlinの関数、もう基本は書けるようになってきたでしょうか。今回はもう一歩進んで、関数をより便利に使うための2つのテクニック「デフォルト引数」と「可変長引数」を紹介します。どちらもコードをシンプルに保つための機能で、Kotlinらしさが感じられる部分でもあります。少しずつ確認していきましょう。 デフォルト引数とは 関数を呼び出すとき、いつも「毎回同じ値を渡しているな」と感じる引数(関数に渡す値のこと)はありませんか。そんなときに便利なのが「デフォルト引数」です。これは、引数に「もし呼び出し側が値を指定しなかったら、この値を使う」というあらかじめ決まった初期値を設定できる機能です。 基本の書き方 例えば、挨拶のメッセージを作る関数を考えてみましょう。 fun greet(name: String, greeting: String = "こんにちは") { println("$greeting、$name さん") } greet("田中") // こんにちは、田中 さん greet("鈴木", "おはよう") // おはよう、鈴木 さん 引数の後ろに = 値 と書くだけで、デフォルト値を設定できます。 greeting を省略すれば自動的に「こんにちは」が使われ、指定すればその値が優先されます。JavaやC言語のように、同じ処理を複数のパターンで用意する「オーバーロード」(同名の関数を引数の数や型違いで複数定義すること)を書く必要がありません。この手軽さも、Kotlinの大きなメリットです。 名前付き引数と組み合わせる デフォルト引数を持つ関数が増えてくると、「後ろの引数だけ指定したい」という場面が出てきます。そんなときは「名前付き引数」を使いましょう。これは、引数名を明示して値を渡す書き方です。 fun greet(name: String, greeting: String = "こんにちは", punctuation: String = "!") { println("$greeting、$name さん$punctuation...

#20 Swiftで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

Swiftで関数を書けるようになると、次に気になるのが「毎回同じ値を渡すのが面倒」「引数の数が決まっていない関数を作りたい」といった悩みではないでしょうか。実はSwiftの関数には、こうした悩みを解決してくれる便利な仕組みが用意されています。それが「デフォルト引数」と「可変長引数」です。今回はこの2つの機能について、初心者の方にもわかりやすく解説していきます。 デフォルト引数とは 「デフォルト引数」とは、関数を呼び出すときに値を省略できる引数のことです。あらかじめ関数の定義側で「値が渡されなかった場合はこの値を使う」という初期値(デフォルト値)を決めておくことで、呼び出し側は必要なときだけ値を指定すればよくなります。 実際のコードを見てみましょう。 func greet(name: String, greeting: String = "こんにちは") { print("\(greeting), \(name)さん") } greet(name: "田中") // こんにちは, 田中さん greet(name: "佐藤", greeting: "おはよう") // おはよう, 佐藤さん この例では、 greeting という引数に "こんにちは" という初期値を設定しています。呼び出す側は greeting を省略すればデフォルト値が使われますし、指定すればその値で上書きされます。 Swiftでは、デフォルト引数は基本的に引数リストの後ろのほうに置くのが読みやすいとされています。これは、呼び出し側で引数名を省略できる「先頭の引数」との組み合わせを考えたときに、順序がわかりやすくなるからです。ちなみに、PythonにもJavaScriptにも似た仕組みはありますが、Swiftは引数名(ラベル)を明示して呼び出すのが基本スタイルという点が特徴的です。慣れないうちは少し冗長に感じるかもしれませんが、コードを読んだときにどの値が何を意味しているか一目でわかるという利点があります。 可変長引数とは 次に「可変長引数」です。これは、関数を呼び出すときに渡す値の個数を自由に決められる引数のことです...

#20 C ++で学ぶ関数の応用(デフォルト引数・可変長引数)の基本

はじめに C++で関数を書いていると、「引数の数を省略できたらいいのに」「引数の個数が決まっていない関数を作りたい」と思う場面が出てきます。たとえば、ログ出力用の関数で「毎回同じ設定値を渡すのは面倒」「渡す値の数がそのときどきで変わる」といったケースです。C++にはこうした要望に応える仕組みとして、 デフォルト引数 と 可変長引数 という2つの機能が用意されています。この記事では、それぞれの書き方と注意点を、初心者の方にもわかりやすく解説していきます。 デフォルト引数とは デフォルト引数とは、関数を呼び出すときに引数を省略した場合に使われる「あらかじめ決めておいた値」のことです。関数の宣言時に引数へ初期値を設定しておくことで、呼び出し側は必要なときだけ値を指定し、それ以外は省略できるようになります。 #include <iostream> void greet(std::string name, std::string honorific = "さん") { std::cout << name << honorific << "、こんにちは" << std::endl; } int main() { greet("田中"); // 田中さん、こんにちは greet("鈴木", "先生"); // 鈴木先生、こんにちは } 上の例では、 honorific に「さん」というデフォルト値を設定しているため、2つ目の引数を省略しても関数を呼び出せます。 デフォルト引数の制約 デフォルト引数には守るべきルールがあります。それは「デフォルト引数は必ず引数リストの後ろ側から設定する」という制約です。たとえば void func(int a = 1, int b) のように、デフォルト値のある引数の後ろにデフォルト値のない引数を置くことはできません。呼び出し時にどの引数を省略したのかコンパイラが判断できなくなるためです。C言語にはデフォルト引数という機能自体が存在しないため、これはC++で新しく学ぶポイントになります。またPythonのようにキーワード引数(...

#20 Rubyで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

はじめに Ruby(プログラミング言語の一つ)で関数(Rubyでは「メソッド」と呼びます)を書いていると、引数に関する悩みによく出会います。たとえば「引数を省略できるようにしたい」「引数の数が決まっていない処理を書きたい」といった場面です。そんなときに便利なのが「デフォルト引数」と「可変長引数」です。この記事では、この2つの使い方と、実務でつまずきやすいポイントを初心者向けに解説します。 デフォルト引数とは デフォルト引数とは、呼び出し側が値を指定しなかった場合に、あらかじめ決めておいた値が自動的に使われる仕組みです。「引数の初期値」と考えるとイメージしやすいでしょう。Rubyでは以下のように書きます。 def greet(name, greeting = "こんにちは") puts "#{greeting}, #{name}さん" end greet("田中") # => こんにちは, 田中さん greet("田中", "おはよう") # => おはよう, 田中さん greeting = "こんにちは" のように、引数名の後に = で初期値を書くだけです。呼び出し側で2つ目の引数を省略すると、自動的に「こんにちは」が使われます。呼び出す側のコードがすっきりするのが最大のメリットです。 注意点として、デフォルト引数はできるだけ「後ろ側」にまとめるのがマナーです。 def greet(greeting = "こんにちは", name) のように省略可能な引数を先に置いても動作はしますが、どの引数が省略できるのか一目で分かりにくくなり、コードを読む人を混乱させてしまいます。省略できる引数はできるだけ引数リストの末尾に置く、という書き方を覚えておきましょう。 可変長引数(*args)とは 可変長引数とは、呼び出すたびに引数の個数が変わっても対応できる仕組みです。Rubyでは引数名の前に * (アスタリスク)を付けることで実現できます。これを「スプラット引数」と呼ぶこともあります。 def total(*numbers) numbers.sum end total(1,...

#20 PHPで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

関数をもっと便利に使いこなそう PHPで関数を書けるようになると、次に気になるのが「もっと柔軟に引数を受け取れないか」という悩みではないでしょうか。呼び出し側で引数を省略できたり、いくつでも値を渡せたりすると、関数の使い勝手はぐっと上がります。この記事では、PHPの「デフォルト引数」と「可変長引数」という2つの機能を、初心者の方にもわかりやすく解説します。関数(function)とは、決まった処理をひとまとめにして名前を付け、何度も呼び出せるようにする仕組みのことです。すでに基本的な関数の書き方を知っている前提で読み進めてください。 デフォルト引数とは デフォルト引数とは、関数を呼び出すときに値(引数)を省略した場合に自動で使われる初期値のことです。引数(パラメータ)の右側に = 値 の形で指定します。 function greet($name, $honorific = "さん") { echo "{$name}{$honorific}、こんにちは!\n"; } greet("田中"); // 田中さん、こんにちは! greet("鈴木", "先生"); // 鈴木先生、こんにちは! ここで注意したいのは、デフォルト引数は必ず「引数リストの後ろの方」に置く必要があるという点です。 function greet($honorific = "さん", $name) のように、デフォルト値を持つ引数の後ろに省略できない引数を置くと、意図しない結果になることがあります。場合によってはエラーになることもあるので注意しましょう。PHP 8以降は「名前付き引数」も使えるようになり、 greet(name: "田中") のように引数名を明示して呼び出すことも可能です。名前付き引数を使えば順番の制約を気にせず、省略したい引数だけを飛ばして指定できるので、あわせて覚えておくと便利です。 可変長引数とは 可変長引数とは、いくつ渡されるかわからない数の引数を、まとめて1つの配列として受け取れる機能です。引数の前に ... (3つのドット)を付けます。これは「スプレッド演算子」とも呼ばれ、JavaSc...

#20 Scalaで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

はじめに Scalaの関数の書き方に慣れてきたら、次に押さえたいのが関数をもっと柔軟にする書き方です。今回は デフォルト引数 (引数を省略したときに自動で使われる値)と 可変長引数 (渡す値の個数を自由に変えられる引数)の2つを取り上げます。どちらも比較的シンプルな書き方で実現できるので、安心して読み進めてください。 デフォルト引数とは何か デフォルト引数とは、関数を呼び出すときに値を渡さなかった場合に、あらかじめ決めておいた値が自動的に使われる仕組みです。「引数を省略できる」と考えるとイメージしやすいでしょう。 def greet(name: String, message: String = "こんにちは"): String = { s"$name さん、$message" } println(greet("田中")) // 田中 さん、こんにちは println(greet("鈴木", "おはよう")) // 鈴木 さん、おはよう 引数の型のあとに = 値 を書くだけで、その引数はデフォルト引数になります。JavaやC言語では引数の数だけ関数を用意する「オーバーロード」でこれに近いことを実現しますが、Scalaでは1つの定義だけで済むのが特徴です。 途中の引数だけ省略したいとき デフォルト引数を複数指定していて、途中の引数だけを省略したい場合は「名前付き引数」を使います。 def order(item: String, quantity: Int = 1, note: String = ""): String = s"$item を $quantity 個(備考: $note)" println(order("りんご", note = "贈答用")) 名前付き引数( note = "贈答用" のように引数名を明示する書き方)を使わずに位置だけで途中を省略しようとすると、コンパイルエラーになります。省略されやすい引数ほど後ろに置く、という並び順を意識すると使いやすい関数になります。 可変長引数とは何か ...

#20 Dartで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

Dart(ダート)は、Googleが開発した言語で、スマホアプリを作れるFlutter(フラッター)というフレームワークの土台としてよく使われています。今回は、Dartの関数をもう一歩使いこなすための「デフォルト引数」と「可変長引数っぽい書き方」を紹介します。関数(function)とは、特定の処理をひとまとめにして名前を付けたもので、何度も同じ処理を書かずに済む便利な仕組みです。基本の書き方は知っている前提で、「引数を省略できるようにする方法」に焦点を当てます。 Dartの引数には2種類の「省略可能」がある 多くの言語では、引数(ひきすう。関数に渡す値のこと)は基本的にすべて必須で、可変長引数(渡す個数を自由に変えられる引数)には専用の記法が用意されています。ところがDartでは、引数を省略可能にする仕組みが最初から用意されており、「デフォルト引数」も「可変長引数のような処理」も自然に書けます。省略可能な引数には「位置引数のオプション化」と「名前付き引数」の2種類があります。 位置引数をオプションにする(角括弧 [] ) 順番通りに値を渡す普通の引数(位置引数)を角括弧 [] で囲むと省略可能になり、省略時の値(デフォルト値)は = で指定します。 String greet(String name, [String honorific = "さん"]) { return "$name$honorificこんにちは"; } void main() { print(greet("田中")); // 田中さんこんにちは print(greet("田中", "先生")); // 田中先生こんにちは } 2つ目の引数を省略すると自動的に "さん" が使われます。呼び出し側のコードをシンプルに保ちたいときに便利です。 名前付き引数にする(波括弧 {} ) もう1つの方法が、波括弧 {} を使う「名前付き引数」です。呼び出すときに引数名を明示するため、どの値が何を表しているか一目で分かります。 void showProfile({String name = "名無し", int...

#21 Pythonで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに Pythonでリストや辞書を扱っていると、「条件に合うものだけ取り出したい」「全部の要素を加工したい」という場面によく出会います。今回はそんなときに便利な「フィルタ(filter)」と「マップ(map)」という考え方を紹介します。どちらも「コレクション(複数の値をまとめて持つデータ、リストや辞書など)の中身を、1件ずつループで書かなくても扱える」という共通点があります。覚えるとコードがぐっとすっきりします。 フィルタ的な考え方:条件に合うものだけ選ぶ 「フィルタ」とは、コレクションの中から条件に合う要素だけを選び出す操作のことです。たとえば「テストの点数リストから80点以上だけ取り出したい」というケースを考えてみます。 scores = [55, 82, 91, 40, 76, 88] # for文で書く場合 passed = [] for s in scores: if s >= 80: passed.append(s) # リスト内包表記で書く場合 passed = [s for s in scores if s >= 80] print(passed) # [82, 91, 88] Pythonには filter() という関数も用意されています。 filter(条件を判定する関数, コレクション) という形で使い、条件に合う要素だけを残した結果を返します。 passed = list(filter(lambda s: s >= 80, scores)) ここで出てきた lambda (ラムダ)は、名前を付けずにその場限りで使う小さな関数を作る書き方です。 lambda 引数: 戻り値の式 という形になっており、「関数をわざわざdefで定義するほどでもない、ちょっとした処理」を書きたいときに使います。 マップ的な考え方:全部の要素を加工する 「マップ」とは、コレクションの全要素に同じ処理を適用して、新しいコレクションを作る操作です。たとえば全員の点数を10点加算したいときはこう書けます。 bonus_scores = [s + 10 for s in scores] # または bonus_scores = list(map(lambda s: s + 10, scores))...

#21 JavaScriptで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに 以前の記事「#7 JavaScriptで学ぶ配列の基本」では、配列(複数の値をまとめて扱うための入れ物、これを「コレクション」とも呼びます)の基本操作に軽く触れました。具体的には、条件に合う要素だけを残す filter() と、各要素を加工して新しい配列にする map() の2つです。今回はその発展編として、これらを組み合わせて実務でよく使う書き方や、似たようなメソッドとの使い分けを詳しく見ていきます。 filter・map・reduceをチェーンして使う 実際の開発では、「絞り込み→加工→集計」という一連の流れを一度に書くことがよくあります。例えば、商品データの配列から「在庫がある商品」だけを選び、「税込価格」に変換し、その合計金額を求めてみましょう。 const products = [ { name: "ノート", price: 100, inStock: true }, { name: "ペン", price: 50, inStock: false }, { name: "消しゴム", price: 80, inStock: true }, ]; const total = products .filter(p => p.inStock) // 在庫があるものだけ残す .map(p => p.price * 1.1) // 税込価格(10%)に変換 .reduce((sum, price) => sum + price, 0); // 合計を計算 console.log(total); // 198 reduce() は「複数の値をまとめて1つの値にする」ためのメソッドです。初心者にはやや取っつきにくいですが、合計・最大値・グループ化など応用範囲が広く、ぜひ覚えておきたいメソッドです。第1引数には「コールバック関数(処理のたびに呼び出される関数)」を渡し、その中では「これまでの計算結果(sum)」と「今見ている要素(price)」を受け取れます。第2引数の 0 は計算の初期値です。 このように .filter().map().reduce() とメソッドを「.」でつなげて書くスタイルを「メ...

#21 TypeScriptで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに 以前の記事「#7 TypeScriptで学ぶ配列の基本」では、配列の基本操作に軽く触れました。配列とは複数の値をまとめて扱うための入れ物のことで、これを「コレクション」とも呼びます。具体的には、条件に合う要素だけを残す filter() と、各要素を加工して新しい配列にする map() を紹介しました。今回はその発展編として、これらを実務でよく使う形で組み合わせる書き方と、TypeScriptならではの「型」が絡む注意点を見ていきます。 filter・map・reduceをチェーンして使う 実際の開発では、「絞り込み→加工→集計」という一連の流れを一度に書くことがよくあります。商品データの配列から「在庫がある商品」だけを選び、「税込価格」に変換し、その合計金額を求める例を見てみましょう。 interface Product { name: string; price: number; inStock: boolean; } const products: Product[] = [ { name: "ノート", price: 100, inStock: true }, { name: "ペン", price: 50, inStock: false }, { name: "消しゴム", price: 80, inStock: true }, ]; const total: number = products .filter((p) => p.inStock) // 在庫があるものだけ残す .map((p) => p.price * 1.1) // 税込価格(10%)に変換 .reduce((sum, price) => sum + price, 0); // 合計を計算 console.log(total); // 198 reduce() は「複数の値をまとめて1つの値にする」ためのメソッドです。第1引数のコールバック関数(処理のたびに呼び出される関数)では、「これまでの計算結果(sum)」と「今見ている要素(price)」を受け取れます。第2引数の 0 は計算の初期値です。こ...

#21 Rustで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに プログラミングを学んでいくと、配列やリストのようなたくさんのデータ(まとめて「コレクション」と呼びます)を扱う場面によく出会います。そこから条件に合うものだけを取り出したり、全部の値を別の形に変換したりしたい、と思うことも多いでしょう。多くの言語では、これを「フィルタ(filter)」や「マップ(map)」という考え方で実現します。Rustにもこの考え方はしっかり用意されていて、しかも安全性とスピードの両立にこだわった作りになっています。今回は、Rustの「イテレータ(iterator)」という仕組みを使って、コレクション操作の基本を学んでいきましょう。 イテレータとは何か イテレータとは、簡単に言うと「コレクションの中身を1つずつ順番に取り出してくれる仕組み」のことです。RustではVec(可変長の配列のようなもの)などに対して .iter() というメソッドを呼ぶことで、このイテレータを作ることができます。イテレータそのものは値を1つずつ渡すだけの存在ですが、これに filter や map といった「アダプタ」と呼ばれるメソッドをつなげていくことで、柔軟なデータ加工ができるようになります。 filterで条件に合う値だけを残す filterは「条件に合う値だけを残す」ためのメソッドです。次の例を見てみましょう。 let numbers = vec![1, 2, 3, 4, 5, 6]; let evens: Vec<&i32> = numbers.iter().filter(|n| **n % 2 == 0).collect(); println!("{:?}", evens); // [2, 4, 6] filterには「条件」を書いた関数(ここでは無名関数、いわゆるクロージャ)を渡します。 |n| **n % 2 == 0 の部分は「nが偶数かどうか」を判定しています。 **n のように*(アスタリスク)が2つ付いているのは、Rust特有の書き方です。 iter() は値そのものではなく「参照」というアドレスのようなものを渡してくるため、参照を1段外す必要があり、それがこの*にあたります。最初は戸惑いやすいポイントなので、エラーが出たら「参照が二重になっていないか」を疑ってみてください。 ...

#21 Goで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに Pythonの filter() や map() 、JavaScriptの Array.prototype.filter や Array.prototype.map のような便利な関数を使ったことがある人は多いでしょう。しかしGo言語を学び始めると、「同じような関数がGoには見当たらない」と戸惑うことがよくあります。 filter(フィルタ) とは、集まったデータ(コレクション)の中から条件に合うものだけを選び出す処理のことです。 map(マップ) とは、コレクションの各要素を一つずつ別の形に変換する処理のことを指します。Goは言語仕様をシンプルに保つ方針を取っているため、これらは標準の書き方としては用意されていません。基本的には スライス (可変長の配列のようなデータ構造)と forループ を組み合わせて自分で書く必要があります。本記事では、初心者の方向けに、Goでフィルタ・マップ的な処理をどう書くか、そしてGo1.21以降で使えるようになった便利なパッケージについても解説します。 フィルタ的な処理を書く まずは「条件に合う要素だけを取り出す」フィルタ処理です。例えば整数のスライスから偶数だけを取り出すコードは次のように書きます。 package main import "fmt" func main() { nums := []int{1, 2, 3, 4, 5, 6} var evens []int for _, n := range nums { if n%2 == 0 { evens = append(evens, n) } } fmt.Println(evens) // [2 4 6] } ポイントは2つあります。1つ目は、結果を格納する空のスライス( var evens []int )を先に用意しておくことです。2つ目は、 range で元のスライスを1件ずつ確認しながら、条件を満たしたものだけ append (スライスへの要素追加)していくことです。他言語の filter() のように1行では書けませんが、そのぶん処理の流れが目に見えるので、慣れると「今何をしているか」が追いやすいという利点もあります。 マ...

#21 Javaで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに Javaで配列やリストを扱っていると、「条件に合うものだけ取り出したい」「中身を全部別の形に変換したい」という場面によく出会います。これまでfor文とif文を組み合わせて書いていた処理も、Java 8以降で使えるようになった Stream API を使うと驚くほどすっきり書けます。Stream APIとは、コレクションの要素を一列に並べて順番に処理する仕組みのことです。この記事では、コレクション操作の中でも特によく使う「フィルタ」と「マップ」という考え方を、初心者向けに丁寧に解説します。 フィルタとマップとは何か まず言葉の意味を整理しましょう。「フィルタ(filter)」は、コレクションの中から 条件に合う要素だけを選び出す 操作です。「マップ(map)」は、コレクションの 各要素を別の値に変換する 操作です。どちらも「元のリストを直接いじらず、新しい結果を作る」という点が共通しています。この考え方は関数型プログラミング(処理を小さな関数の組み合わせとして表現するスタイル)由来のものです。Python(リスト内包表記)やJavaScript(Array.filter/map)にも似た機能があります。 従来のfor文との比較 たとえば「整数リストから偶数だけを取り出し、2倍にする」処理を、従来のfor文で書くとこうなります。 List<Integer> result = new ArrayList<>(); for (int n : numbers) { if (n % 2 == 0) { result.add(n * 2); } } Stream APIを使うと、同じ処理が次のように書けます。 List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) .map(n -> n * 2) .collect(Collectors.toList()); stream() でリストをストリーム(処理の流れ)に変換し、 filter で条件を絞り込み、 map で値を変換し、最後に collect で再びリストに戻す、という流れです。「何をしたいか」が処理の順番通りに読め...

#21 Kotlinで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに プログラミングを学んでいると、リストの中から条件に合うものだけを取り出したい、あるいはリストの中身をまとめて別の形に変えたい、という場面によく出会います。Kotlinでは、こうした処理を コレクション操作 という仕組みでシンプルに書くことができます。コレクションとは、複数のデータをひとまとめにして扱う入れ物のことで、リストや配列のようなものを指します。今回は特によく使う「絞り込み(フィルタ)」と「変換(マップ)」という考え方を中心に、初心者向けにやさしく解説します。 filterで「絞り込み」をする まずは絞り込みです。たとえば数字のリストから偶数だけを取り出したいとします。for文とif文を組み合わせて書くこともできますが、Kotlinには filter という専用の関数があります。 val numbers = listOf(1, 2, 3, 4, 5, 6) val evenNumbers = numbers.filter { it % 2 == 0 } println(evenNumbers) // [2, 4, 6] filter は、リストの中身を1つずつ確認し、中括弧の中に書いた条件が true になるものだけを新しいリストとして返してくれます。ここで登場する it は、処理中の1つひとつの要素を指す省略記法です。「今チェックしている値そのもの」と考えると分かりやすいでしょう。条件がわかりにくくなってきたら、 { number -> number % 2 == 0 } のように自分で名前をつけることもできます。 mapで「変換」をする 次は変換です。リストの中身を別の値や形に作り替えたいときに使うのが map です。たとえば数字のリストをすべて2倍にしたい場合はこう書けます。 val numbers = listOf(1, 2, 3, 4, 5) val doubled = numbers.map { it * 2 } println(doubled) // [2, 4, 6, 8, 10] map は filter と違い、要素の数を減らすのではなく、1つずつを新しい値に置き換えて、同じ数だけの新しいリストを作ります。「絞り込み」と「変換」は似ているようで役割が全く異なるので、この違いを意識しておくと使い分けがスム...

#21 Swiftで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

はじめに Swiftで配列(複数の値をまとめて扱う入れ物、 Array )を使っていると、いくつかの処理をしたくなる場面によく出会います。たとえば「条件に合う要素だけ取り出したい」「全要素を別の形に変換したい」「全要素を集計して1つの値にしたい」といった場面です。こうした処理は for 文でも書けますが、Swiftには filter ・ map ・ reduce という専用のメソッド(コレクション操作の応用)が用意されています。これらを使うと、目的が一目で分かる短いコードになります。この記事では、この3つの基本的な使い方と、初心者がつまずきやすいポイントを解説します。 filter:条件に合う要素だけを絞り込む filter は、配列の中から「条件を満たす要素だけ」を新しい配列として取り出すメソッドです。条件を判定する処理(クロージャと呼ばれる、その場で書ける小さな関数のようなもの)を引数として渡します。 let numbers = [1, 2, 3, 4, 5, 6] let evens = numbers.filter { $0 % 2 == 0 } // evens は [2, 4, 6] $0 は「クロージャに渡された1つ目の引数」を指す省略記法で、ここでは配列の各要素を表します。 { $0 % 2 == 0 } は「2で割った余りが0(=偶数)」という条件です。 filter は条件がtrueだった要素だけを集めて新しい配列を返すので、元の numbers は変更されません。この「元の配列を壊さず、新しい配列を作る」性質は、Swiftのコレクション操作全体に共通する特徴です。意図せず元データを書き換えてしまうバグを防いでくれます。 map:全要素を別の形に変換する map は、配列の全要素に同じ処理を適用し、変換後の値を新しい配列として返します。 let names = ["taro", "hanako", "jiro"] let upperNames = names.map { $0.uppercased() } // upperNames は ["TARO", "HANAKO", "JIRO"] ここでは upp...

#21 Rubyで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

Rubyの「コレクション操作」って何? Rubyでプログラムを書いていると、配列(複数の値をまとめて入れておく入れ物)やハッシュ(キーと値のペアを保存する入れ物)を何度も操作することになります。こうした「複数のデータをまとめて扱うもの」のことを、まとめて コレクション と呼びます。 こうした操作を「for文で1件ずつ処理する」代わりに、Rubyでは Enumerable という仕組み(モジュール、いわば「メソッドの詰め合わせセット」)を使います。これにより、短く読みやすく書けます。この記事では初心者がつまずきやすい点を中心に紹介します。 条件で絞り込む: select / reject 配列から条件に合う要素だけを取り出したいときは select (または filter 、同じ意味です)を使います。逆に「条件に合わないものだけ」を残したいときは reject を使います。 numbers = [1, 2, 3, 4, 5, 6] evens = numbers.select { |n| n.even? } # => [2, 4, 6] odds = numbers.reject { |n| n.even? } # => [1, 3, 5] { |n| ... } の部分はブロックと呼ばれ、「各要素に対して行う処理」を書く場所です。 n には配列の要素が1つずつ入り、その結果がtrueかfalseかで残すかどうかが決まります。他の言語のif文のように書けるので、慣れると直感的です。 値を加工する: map / collect すべての要素に同じ処理を適用して新しい配列を作りたいときは map ( collect でも同じ)を使います。 prices = [100, 200, 300] with_tax = prices.map { |p| (p * 1.1).round } # => [110, 220, 330] ここで注意したいのが、 map と each の違いです。 each は「1件ずつ処理を実行するだけ」で戻り値は元の配列のままですが、 map は「ブロックの戻り値を集めた新しい配列」を返します。初心者がよく混同するポイントなので、「加工した結果の配列がほしいならmap、単に処理をしたいだけならeach」と覚えて...

#21 PHPで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

配列を「ループ」ではなく「操作」で考える PHPでプログラムを書いていると、配列(複数の値をまとめて入れておく箱のようなデータ構造)を扱う場面がよく出てきます。その中から条件に合うものだけを取り出したり、全部の値を加工したりすることも多いはずです。こうした「集まったデータ(コレクション)に対してまとめて処理を行うこと」を、一般に「コレクション操作」と呼びます。 初心者のうちは foreach ループで1つずつ処理を書きがちです。しかしPHPには「フィルタ(絞り込み)」や「マップ(変換)」といった考え方に対応した便利な関数が標準で用意されています。今回はその代表格である array_filter ・ array_map ・ array_reduce を使って、コードを短く読みやすくする方法を紹介します。 array_filterで条件に合う要素だけ残す 「フィルタ」とは、配列の中から条件を満たす要素だけを選び出す操作です。PHPでは array_filter 関数を使います。 $numbers = [1, 2, 3, 4, 5, 6]; $evens = array_filter($numbers, function ($n) { return $n % 2 === 0; }); print_r($evens); // [1 => 2, 3 => 4, 5 => 6] ここで注意したいのが、 array_filter は元の配列の「キー(添字番号)」をそのまま保持するという点です。上の例では偶数だけが残りますが、添字は0から連番になり直さず、元の位置(1, 3, 5番目)のままになります。連番に振り直したい場合は array_values($evens) を組み合わせましょう。この挙動は他の言語の filter と比べてPHPらしい癖なので、覚えておくとハマりにくくなります。 array_mapで要素をまとめて変換する 「マップ」は、配列の各要素に同じ処理を適用して、新しい配列を作る操作です。値を2倍にしたり、文字列を大文字にしたりする場合に便利です。 $prices = [100, 200, 300]; $taxed = array_map(function ($p) { return (int)(...

#21 Scalaで学ぶコレクション操作の応用の基本

はじめに プログラミングをしていると、「リストの中から条件に合うものだけ取り出したい」「リストの中身をすべて別の形に変換したい」という場面によく出会います。Scalaでは、こうした処理を for ループで何行も書く必要はありません。コレクション(複数の値をまとめて扱うためのデータの入れ物。リストや配列などの総称)に用意されたメソッド一つで、簡潔に書けます。今回は、その代表格である filter (フィルタ)と map (マップ)、そして少し発展的な reduce を中心に、Scalaらしいコレクション操作の考え方を紹介します。 filterで条件に合う要素だけを取り出す filter は、コレクションの中から「条件を満たす要素だけ」を残して新しいコレクションを作るメソッドです。例えば整数のリストから偶数だけを取り出したいときは、次のように書けます。 val numbers = List(1, 2, 3, 4, 5, 6) val evens = numbers.filter(n => n % 2 == 0) // evens: List(2, 4, 6) n => n % 2 == 0 の部分は「無名関数(名前を付けずにその場で定義する関数)」です。「引数nを受け取り、nが2で割り切れるかどうかを判定して返す」という処理を、その場で書いています。他の言語のfor文で「if文で条件を判定し、合致したら新しいリストにappendする」という処理を、Scalaでは1行で表現できるのがポイントです。 mapで要素をすべて変換する map は、コレクションの各要素に同じ処理を適用し、その結果を新しいコレクションとして返すメソッドです。例えば、すべての数値を2倍にしたい場合は次のように書きます。 val numbers = List(1, 2, 3) val doubled = numbers.map(n => n * 2) // doubled: List(2, 4, 6) filterが「要素を選ぶ」処理であるのに対し、mapは「要素を作り変える」処理だと覚えておくと区別しやすいです。Pythonのリスト内包表記( [x*2 for x in numbers] )や、Javaのストリームでの .map() に近い考え方です。ただしSc...

#21 Dartで学ぶコレクション操作の応用の基本

はじめに Dartでリスト(複数の値をまとめて扱う入れ物、 List )を扱っていると、「条件に合う要素だけ取り出したい」「全要素を別の形に変換したい」「全要素を集計して1つの値にまとめたい」という場面によく出会います。こうした処理は for 文でも書けます。しかしDartには where ・ map ・ fold (または reduce )という専用のメソッドが用意されており、これらを使ったコレクション操作の応用テクニックを覚えると便利です。他言語の「フィルタ」「マップ」「集約」に相当し、使いこなすと処理の意図が一目で分かる短いコードになります。Flutter(Dartのアプリ開発フレームワーク)でも頻出なので押さえておきましょう。 where:条件に合う要素だけを絞り込む where は、リストの中から「条件を満たす要素だけ」を取り出すメソッドです。条件を判定する処理(ラムダ式と呼ばれる、その場で書ける小さな関数)を引数として渡します。 final numbers = [1, 2, 3, 4, 5, 6]; final evens = numbers.where((n) => n % 2 == 0).toList(); // evens は [2, 4, 6] (n) => n % 2 == 0 は「2で割った余りが0(=偶数)」という条件を表すラムダ式です。注意したいのが、 where の戻り値は List ではなく Iterable (反復可能な要素の集まり)という型になる点です。リストとして使うには .toList() で変換する必要があり、これを忘れて直接 List 型に代入すると型エラーになるので注意しましょう。 map:全要素を別の形に変換する map は、リストの全要素に同じ処理を適用し、変換後の値をまとめて返すメソッドです。 final names = ['taro', 'hanako', 'jiro']; final upperNames = names.map((n) => n.toUpperCase()).toList(); // upperNames は [TARO, HANAKO, JIRO] toUpperCase() (文字列を大文字に変換するメ...

#22 Pythonで学ぶ正規表現の基本

はじめに 「特定のパターンに一致する文字列だけを取り出したい」「電話番号やメールアドレスの形式をチェックしたい」。こういった作業を手作業でやろうとすると、if文とfor文だらけの複雑なコードになりがちです。そんなときに役立つのが「正規表現(せいきひょうげん)」です。正規表現とは、文字列のパターンを記号の組み合わせで表現し、それに一致する部分を検索・置換・抽出するための仕組みです。Pythonでは標準ライブラリの re モジュールを使うだけで、正規表現を簡単に扱うことができます。この記事ではPythonでの正規表現の基本を、初心者の方にも分かりやすく解説します。 reモジュールを使う準備 Pythonで正規表現を使うには、まずファイルの先頭で re モジュールをインポートします。 import re これだけで準備は完了です。外部ライブラリを別途インストールする必要はなく、Pythonをインストールした時点で最初から使える「標準ライブラリ」に含まれているため手軽です。 基本的な検索:search関数とmatch関数 文字列の中にパターンが含まれているかを調べるには、 re.search() を使います。 import re text = "私の電話番号は090-1234-5678です" result = re.search(r"\d{2,4}-\d{2,4}-\d{4}", text) if result: print("見つかりました:", result.group()) else: print("見つかりませんでした") ここで登場する \d は「数字1文字」を表す記号で、 {2,4} は「直前のパターンが2〜4回繰り返される」ことを意味します。つまり \d{2,4}-\d{2,4}-\d{4} は電話番号らしいパターンを表しています。一致した部分は result.group() で取り出せます。 似た関数に re.match() がありますが、こちらは文字列の先頭からの一致しか調べません。文字列のどこかにパターンが含まれるか調べたい場合は search() を使う、と覚えておきましょう。 rの意味:生文字列(raw string)に注意...

#22 JavaScriptで学ぶ正規表現の基本

はじめに 「メールアドレスの形式が正しいかチェックしたい」「文章の中から電話番号だけを抜き出したい」——こういった作業を一気に片付けてくれるのが 正規表現(せいきひょうげん) です。正規表現とは、文字列の「パターン」を専用の記号で表現し、そのパターンに一致する部分を検索・抽出・置換するための仕組みのことです。最初は記号の羅列で身構えますが、基本の型さえ覚えれば強力な武器になります。この記事では、JavaScriptにおける正規表現の書き方と、よく使うメソッドの使い方を初心者向けに解説します。 正規表現オブジェクトの作り方 JavaScriptで正規表現を使うには、大きく分けて2つの書き方があります。 // 1. リテラル記法(スラッシュで囲む) const re1 = /abc/; // 2. RegExpコンストラクタを使う方法 const re2 = new RegExp("abc"); ほとんどの場合はリテラル記法で十分ですが、パターンを変数として動的に組み立てたいときはRegExpコンストラクタを使います。文字列として渡すため、バックスラッシュを二重にする点に注意してください。 基本のメソッドを使ってみる test()で「含まれているか」を判定する もっともシンプルなのが test() メソッドです。パターンに一致する部分が文字列内にあるかどうかを、true/falseの真偽値で返してくれます。 const re = /\d{3}-\d{4}/; // 数字3桁-数字4桁 console.log(re.test("郵便番号は123-4567です")); // true \d は「0〜9のいずれか1文字」を表す特殊な記号で、 {3} は直前の要素を3回繰り返す、という意味です。組み合わせることで「数字が3個続く」というパターンを表現できます。 match()・matchAll()で抜き出す 一致した部分の文字列そのものが欲しいときは、文字列側のメソッド match() を使います。 const text = "電話は03-1234-5678、携帯は090-1111-2222です"; const result = text.match(/\d{2,4}-\d{3,4}-...

#20 C#で学ぶ関数の応用(デフォルト引数・可変長引数)の基本

C#のメソッド(関数のこと)には、呼び出し方を柔軟にする便利な仕組みがいくつか用意されています。今回はその中から「デフォルト引数」と「可変長引数」という2つの機能を、初心者向けに丁寧に解説します。以前の記事でメソッドの基本を扱いましたが、今回はその応用編です。 デフォルト引数とは デフォルト引数とは、メソッドを呼び出すときに引数を省略した場合に使われる「既定値」をあらかじめ設定しておく仕組みです。毎回すべての引数を指定しなくても済むため、呼び出し側のコードがすっきりします。 基本の書き方 static void Greet(string name = "ゲスト", int times = 1) {     for (int i = 0; i < times; i++)     {         Console.WriteLine($"こんにちは、{name}さん");     } } 引数名の後ろに「= 値」を書くだけで、既定値を設定できます。呼び出すときは次のように、引数を省略しても、一部だけ指定してもかまいません。 Greet(); // name="ゲスト", times=1 Greet("太郎"); // name="太郎", times=1 Greet("太郎", 3); // name="太郎", times=3 つまずきやすい点 デフォルト引数には順序のルールがあります。デフォルト値を持つ引数は、必ず引数リストの後ろ側にまとめて書かなければなりません。前半の必須引数の後にデフォルト引数を置くのが正しい順序で、逆にすると、コンパイルエラーになります。また、引数が多くなると「途中の引数だけ省略して、後ろの引数だけ指定したい」という場面が出てきます。そのときは前回の記事で紹介した「名前付き引数」( Greet(times: 3) のように引数名を指定する書き方)と組み合わせると便利です。 可変長引数(paramsキーワード)とは 可変長引数とは、呼び出すたびに渡...