Ruby
本書は、Rubyのチュートリアルです。 Rubyは、比較的習得が容易なオブジェクト指向スクリプティング言語です。 まつもとゆきひろによって開発されました。 Ruby on Railsの記述言語として選ばれたことで有名になりましたが、ウェブアプリケーション以外にもシステム管理やネットワークアプリケーションなどさまざまな用途に用いられます。
Rubyとは

Rubyには、強力で多用途な言語とするための多くの特徴があります。その特徴とは以下の通りです:
Rubyとは

Rubyは強力で汎用性の高い言語であり、さまざまなタスクに適しています。Rubyの学習と使用は簡単で、開発者の大規模で活発なコミュニティがあります。強力で汎用性が高く、習得が容易な言語をお探しなら、Rubyは良い選択です。
初級編

Rubyを利用するためには、公式ウェブサイトからインストーラーをダウンロードしてインストールします。
初級編

以下は、主要なプラットフォームへのインストール手順の概要です:
初級編

RubyでのHello Worldプログラムは非常に簡単です。以下は、コンソールに"Hello, World!"と出力するプログラムです:
初級編

これをhello.rbという名前で保存し、ターミナルでruby hello.rbと実行すると、"Hello, World!"が表示されます。
初級編

Rubyでは、様々なデータ型が利用できます。文字列、数値、配列、ハッシュなどがその代表的なものです。動的型付け言語であるRubyでは、変数の型宣言が不要です。以下に、主要なデータ型と変数の宣言と代入について詳細を示します。
初級編

変数は代入演算子 = を使用して宣言および初期化されます。変数名はアルファベットまたはアンダースコア _ で始まり、その後にはアルファベット、数字、アンダースコアを組み合わせることができます。型宣言は不要であり、変数は動的に型が決まります。
初級編

以下は、変数の宣言と代入の例です。
初級編

これらの例では、それぞれの変数に適切なデータ型の値が代入されています。
初級編

Rubyには様々な制御構造が用意されており、以下のようなものがあります。
初級編

Rubyの制御構造はPerlやBashなどとよく似ていますが、独自の構文も存在します。 また、Rubyはブロックの概念があり、それを活用した制御構造があるのが特徴です。
初級編

Rubyには条件実行を簡潔に記述するためのいくつかのイディオムがあります。
初級編

これらのイディオムを適切に使うことで、条件実行を簡潔で読みやすく記述できます。
初級編

Rubyには反復実行を簡潔に記述するためのいくつかのイディオムがあります。
初級編

Rubyの反復構文はループだけでなく、ブロックやイテレータによる関数型のスタイルの記述も可能です。状況に応じて適切な方法を選ぶことで、簡潔でわかりやすいコードを書くことができます。
初級編

条件分岐は、プログラムの中で特定の条件が満たされた場合に異なる処理を実行するための制御構造です。 Rubyには、if-elsif-else-end 構文、case-when-else-end 構文があります。
初級編

if、elsif、elseキーワードを使用して条件分岐を記述します。以下はその基本的な構文です:
初級編

例えば、次のように使用します:
初級編

この場合、ageが20以上の場合は"You are an adult."が出力され、それ以外の場合は"You are not an adult yet."が出力されます。
初級編

Rubyのcase-when-else-end文は、条件に応じて異なる処理を行うための制御構造です。
初級編

以下に、基本的な構文と使い方を解説します。
初級編

caseの後に評価したい式を置きます。その式の評価結果と、when節の各条件を比較し、合致する場合に対応するブロックが実行されます。else節は、どの条件にも合致しない場合のデフォルトの処理を提供します。
初級編

例えば、以下はcase-when-else-end文の使用例です。
初級編

この例では、変数gradeの値に応じて異なるメッセージが出力されます。gradeが'A'の場合は"Excellent!"が出力され、'B'の場合は"Good job!"が出力されます。gradeが'C'の場合は"You passed, but you could do better."が出力され、どの条件にも一致しない場合は"Sorry, you failed."が出力されます。
初級編

case-when-else-end文は、複数の条件をテストする必要がある場合や、条件に基づいてさまざまな処理を行う必要がある場合に便利です。
初級編

パターンマッチングは、プログラムの中で特定のパターンに処理を実行するための制御構造です。 Rubyには、case-in-else-end 構文と=>演算子とin演算子があります。
初級編

Rubyのパターンマッチング(Pattern Matching)は、構造化された値の深いマッチングを可能にする機能です。これにより、構造をチェックし、一致した部分をローカル変数にバインドすることができます。
初級編

Rubyのパターンマッチングは、case/in式を使用して実装されています。
初級編

以下に、その基本的な構文と使い方を示します。
初級編

case式の中のinブロックは、パターンと一致するかどうかをチェックし、マッチした場合に対応するコードを実行します。else節は、どのパターンにも一致しない場合のデフォルトの処理を提供します。
初級編

以下は、パターンマッチングの使用例です。
初級編

このコードは、パターンマッチングを利用して、与えられた配列の最初の要素に応じて異なる処理を行います。与えられた配列 [2, 3, 5] の最初の要素が特定のパターンに一致するかどうかをテストし、一致する場合に対応するメッセージを出力します。
初級編

具体的には、与えられた配列 [2, 3, 5] の最初の要素が各条件に一致するかどうかをテストします。
初級編

最終的に "最初の素数、三番目は7" というメッセージが出力されます。
初級編

else 節は、どの条件にも一致しない場合に実行されますが、この場合、どの数列でもないことを示すメッセージが出力されることになります。
初級編

=>演算子とin演算子 は、パターンマッチングを簡潔に行う方法の1つです。通常、パターンマッチングは複数の行にわたるケース式や条件分岐を使用しますが、=>演算子とin演算子 は1行の式でパターンをマッチングする手法です。
初級編

具体的には、次のような形式で表現されます:
初級編

あるいは
初級編

この形式では、式 の値が パターン にマッチするかどうかを評価します。 =>演算子とin演算子 でパターンマッチングに失敗すると、NoMatchingPatternKeyError例外が raise されます。
初級編

パターンマッチングにはさまざまなパターンがあります:
初級編

これらのパターンを組み合わせて、複雑なデータ構造をマッチングできます。また、パターンマッチングではマッチした部分をローカル変数にバインドすることもできます。
初級編

Rubyにおける反復(ループ)は、いくつかの方法で行うことができます。主な方法は以下の通りです。
初級編

配列やハッシュなどのコレクションに対して使われる最も一般的な反復方法です。以下はその例です。
初級編

for文も使用できますが、Rubyではあまり一般的ではありません。
初級編

while文を使って条件が満たされている間、ブロック内のコードを実行します。
初級編

until文は条件が満たされるまでループします。
初級編

固定回数のループを行う場合に便利です。
初級編

これらの方法を組み合わせて、さまざまな反復のニーズに対応できます。 ただし、Rubyではeachメソッドが最も一般的で、他の方法よりも好まれることが多いです。
初級編

メソッドは、Rubyプログラムで特定の処理を実行するための手段を提供します。メソッドは、関数や手続きと同様の機能を持ち、再利用可能なコードブロックを定義します。Rubyでは、メソッドはオブジェクト指向プログラミングの基本的な概念であり、ほとんどの処理がメソッドとして定義されます。
初級編

メソッドは以下のような形式で定義されます:
初級編

ここで、defキーワードを使ってメソッドを定義し、メソッド名を指定します。メソッドが引数を取る場合は、引数のリストを指定します。メソッドの本体は、endキーワードで終了します。
初級編

以下は、簡単なメソッドの例です:
初級編

この例では、greetという名前のメソッドが定義されています。このメソッドはnameという引数を取り、それを使用して挨拶を表示します。greet("Alice")という呼び出しでは、"Hello, Alice!"というメッセージが表示されます。
初級編

endキーワードを伴わず、代入に似た形式でも定義できます:
初級編

ここで、defキーワードと=を使ってメソッドを定義し、メソッド名を指定します。メソッドが引数を取る場合は、引数のリストを指定します。
初級編

以下は、簡単なメソッドの例です:
初級編

また、Rubyではメソッド内で最後に評価された式が自動的にメソッドの戻り値となります。明示的なreturn文は省略することができますが、必要に応じて使用することもできます。
初級編

さらに、メソッドはオプションのブロックを受け取ることができます。ブロックを受け取るメソッドは、yieldキーワードを使ってブロックを実行します。
初級編

このメソッドでは、引数として受け取ったnameに対して挨拶を出力し、その後にyieldを使ってブロックを実行しています。block_given?メソッドは、メソッドがブロックを受け取ったかどうかを判定します。
初級編

メソッドを呼び出す際には、通常の引数と一緒にブロックを渡すことができます。
初級編

このコードは、以下を出力します。
初級編

配列は複数の要素を格納するためのデータ構造であり、それぞれの要素は順序付けされています。Rubyでは、配列は角かっこ [ ] で囲まれ、コンマで区切られた要素のリストとして表現されます。
初級編

ハッシュは、キーと値のペアを格納するデータ構造であり、各要素はキーを使用して参照されます。Rubyでは、波かっこ { } を使用してハッシュを定義します。
初級編

クラスは、オブジェクトの設計図として機能し、それぞれのオブジェクトはそのクラスのインスタンスです。Rubyでは、classキーワードを使用してクラスを定義します。
初級編

この例では、Personという名前のクラスが定義されています。initializeメソッドは、新しいインスタンスが作成されるときに呼び出され、インスタンス変数 @name と @age に値を設定します。introduceメソッドは、そのインスタンスの情報を出力します。
初級編

これにより、Personクラスの新しいインスタンス alice と bob が作成されます。それぞれのインスタンスは、initializeメソッドによって設定された名前と年齢を持ちます。
初級編

各インスタンスは、クラス内で定義されたメソッドを呼び出すことができます。
初級編

オブジェクト指向プログラミング(OOP)は、プログラムをオブジェクトとそれらの相互作用に基づいて構造化する方法です。OOPには、次のような重要な概念があります:
初級編

これらの概念を使用することで、コードをより柔軟で保守しやすくすることができます。
中級編

例外処理は、予期しないエラーが発生した場合にプログラムの実行を中断せずに制御を継続するための仕組みです。Rubyでは、begin、rescue、endキーワードを使用して例外処理を実装します。
中級編

上記の例では、beginブロック内でゼロ除算エラーが発生する可能性があります。rescueブロックでは、特定の例外(ここではZeroDivisionError)が発生した場合の処理を指定します。例外が発生した場合、その例外オブジェクトがrescueブロックの変数eに割り当てられ、messageメソッドを使ってエラーメッセージを取得します。
中級編

ファイルの読み書きは、プログラムでよく行われる操作の1つです。Rubyでは、Fileクラスを使用してファイルの読み書きを行います。
中級編

ファイルポインタを移動して、ファイル内の特定の位置から読み書きを行うこともできます。
中級編

モジュールは、関連するメソッドや定数をまとめるための仕組みであり、クラスにインクルードすることでその機能を利用することができます。
中級編

上記の例では、Greetingモジュールを定義し、MyClassクラスにインクルードしています。その結果、MyClassのインスタンスであるobjからsay_helloメソッドが利用できるようになります。
中級編

Mix-inは、複数のクラスに同じメソッドや振る舞いを提供するためのデザインパターンです。モジュールを使ってMix-inを実現することができます。
中級編

Debugモジュールは、debug_infoメソッドを提供し、このメソッドを含むクラスにMix-inします。これにより、クラスのインスタンスがデバッグ情報を表示するメソッドを利用できるようになります。
中級編

Minitestは、Rubyプログラミング言語用の軽量なテストフレームワークです。Minitestは、Rubyの標準ライブラリに含まれており、Rubyのバージョン1.9以降で利用可能です。Minitestは、テスト駆動開発(Test-Driven Development、TDD)や振る舞い駆動開発(Behavior-Driven Development、BDD)などのソフトウェア開発手法を支援するために使用されます。
中級編

Minitestは、単体テストや統合テストなど、さまざまな種類のテストをサポートしています。また、アサーションを用いて期待される振る舞いを確認するための豊富な機能も提供しています。Minitestの特徴は、シンプルで使いやすいインターフェース、高速な実行速度、そしてRubyの標準ライブラリに含まれているため、追加の依存関係を導入せずに利用できることです。
中級編

開発者がMinitestを使用することで、安定性や品質を向上させることができます。また、テストコードの記述や実行が容易であるため、素早く効果的なテストを作成することができます。
中級編

実際のコードを観てみましょう。
中級編

下記は、逆ポーランド記法の式を評価する機能を配列を継承して実装した例で、コメントを合わせても30行のコードですが、各演算子の実装の確認など基礎的なテストケースを書くだけで、数倍のコード量になります。
中級編

このコードは、逆ポーランド記法(Reverse Polish Notation)の式を評価するためのRPN(Reverse Polish Notation)クラスを定義しています。このクラスは、与えられた式をスタックを使用して解析し、計算します。以下に、このコードの機能と構造についての解説を行います。
中級編

このコードは、逆ポーランド記法の式の評価に関する機能を提供し、テストによってその正確性が検証されています。
中級編

RSpecは、Rubyでのテストを行うためのフレームワークの1つです。RSpecを使用すると、テストをより明確に記述し、テスト結果を見やすく出力することができます。
中級編

ユニットテストは、個々のコンポーネント(クラスやメソッドなど)が正しく機能するかをテストするものです。一方、統合テストは複数のコンポーネントが互いに連携して正しく動作するかをテストします。
中級編

RSpecを使ってユニットテストと統合テストを書くことで、コードの品質を向上させ、予期せぬバグを見つけるのに役立ちます。
上級編

継承は、既存のクラスから新しいクラスを作成し、そのクラスが親クラスのすべての特性を引き継ぐことができる機能です。ポリモーフィズムは、同じ名前のメソッドが異なるクラスで異なる振る舞いをすることを指します。カプセル化は、データやメソッドをオブジェクト内部に隠蔽し、外部からのアクセスを制限することです。これらの概念を活用することで、より柔軟で効率的なコードを書くことができます。
上級編

上記の例では、Animalクラスが親クラスとして定義され、speakメソッドが定義されています。DogクラスとCatクラスはそれぞれAnimalクラスを継承し、speakメソッドをオーバーライドしています。これにより、DogクラスとCatクラスは同じ名前のメソッドを持ちつつも、それぞれ異なる振る舞いをします。
上級編

オブジェクト指向デザインパターンは、再利用可能なソフトウェア設計のガイドラインです。これらのパターンは、特定の問題に対する解決策を提供し、コードの再利用性、拡張性、保守性を向上させます。代表的なデザインパターンには、Singleton、Factory、Observer、Decoratorなどがあります。
上級編

上記の例では、Singletonパターンを使用して、特定のクラスのインスタンスが常に1つしか存在しないことを保証しています。Singletonモジュールをインクルードすることで、インスタンスが複数作成されることを防ぎます。
上級編

Rubyにおける並行プログラミングは、スレッドとプロセスを使用して実現されます。スレッドはプロセス内で動作し、複数のスレッドが同時に実行されることで並行処理が可能になります。一方、プロセスは独立した実行単位であり、それぞれが独自のメモリ空間を持ちます。
上級編

以下では、Rubyにおけるスレッドとプロセスの管理について解説し、コード例を示します。
上級編

RubyではThreadクラスを使用してスレッドを作成し、Thread.newメソッドを使って新しいスレッドを生成します。生成されたスレッドは並行して実行され、メインスレッドと同時に動作します。スレッドの制御にはjoinメソッドを使用して、メインスレッドがスレッドの終了を待機することができます。
上級編

上記の例では、2つのスレッドを生成し、それぞれが一定間隔でメッセージを出力しています。joinメソッドにより、メインスレッドが全てのスレッドの終了を待機します。
上級編

Rubyでは、forkメソッドを使用して新しいプロセスをフォークし、子プロセス内で処理を実行することができます。プロセスの終了を待機するにはProcess.waitメソッドを使用します。
上級編

上記の例では、親プロセスが子プロセスをフォークし、子プロセスが一定時間待機した後に終了します。親プロセスはProcess.waitメソッドで子プロセスの終了を待機します。
上級編

Rubyのスレッドとプロセスを使った並行プログラミングには、他にも多くの機能や制御方法がありますが、基本的な部分はこのようになります。
上級編

Rubyには、スレッドとプロセス以外にも並行プログラミングを行うためのさまざまな手段があります。以下にいくつかの方法を紹介します。
上級編

Fiberは、イテレータと似たコンテキストを持つ軽量なスレッドのようなものです。複数のFiberを作成し、それらを切り替えながら処理を行うことで、非同期の並行処理を実現することができます。
上級編

Concurrent Ruby gemは、並行プログラミングを行うための機能を提供するGemです。ThreadPoolやFuture、Promise、Actorなどの機能を使って、複雑な並行処理を実現することができます。
上級編

Celluloid gemは、アクターモデルをベースにした並行プログラミングを行うためのGemです。アクターモデルでは、個々のアクターがメッセージを送受信しながら処理を実行します。
上級編

これらの手法を使うことで、Rubyでより効果的な並行プログラミングを実現することができます。選択肢はプロジェクトの要件や好みに応じて異なりますが、Rubyの並行処理に関する柔軟性と機能性は広範囲にわたっています。
上級編

並行プログラミングでは、競合状態やデッドロックなどの問題が発生する可能性があります。競合状態は、複数のスレッドが同時に共有されたリソースにアクセスしようとすることで起こります。デッドロックは、複数のスレッドがお互いにリソースを解放するのを待ち合わせることで発生します。
上級編

これらの問題を回避するための解決策として、適切なロックの使用、スレッドセーフなデータ構造の選択、並行処理の慎重な設計などがあります。
上級編

並行処理の問題点と解決策について、コード例を示して説明します。
上級編

競合状態は、複数のスレッドが同時に共有されたリソースにアクセスしようとすることで発生します。
上級編

以下は、競合状態が発生する可能性のあるコード例です。
上級編

このコードでは、複数のスレッドがcounter変数にアクセスしています。しかし、counter += 1の操作は複数のスレッドで同時に実行される可能性があり、結果として期待通りにカウンターが増加しない可能性があります。
上級編

競合状態を回避するために、ロックを使用して複数のスレッドが同時に共有されたリソースにアクセスできないようにします。Rubyでは、Mutexクラスを使用してスレッドセーフなロックを実装できます。
上級編

このコードでは、Mutexを使用してcounter変数へのアクセスを同期化しています。 これにより、複数のスレッドが同時にcounter変数にアクセスすることができず、競合状態が回避されます。
上級編

デッドロックは、複数のスレッドがお互いにリソースを解放するのを待ち合わせることで発生します。
上級編

以下は、デッドロックが発生する可能性のあるコード例です。
上級編

このコードでは、thread1がmutex1をロックし、同時にthread2がmutex2をロックする可能性があります。その後、各スレッドは相手のロックを解放するのを待ち合わせることになり、デッドロックが発生します。
上級編

デッドロックを回避するために、ロックを取得する順序を一貫させることが重要です。 この方法により、複数のスレッドが同じ順序でロックを取得しようとしても、デッドロックを引き起こすことがありません。
上級編

この修正では、thread2がmutex1を先にロックするように変更されており、ロックの順序が一致しています。これにより、デッドロックが発生する可能性が低くなります。
上級編

以上が、並行処理の問題点とその解決策をコード例を交えて説明したものです。競合状態やデッドロックは並行プログラミングにおける一般的な問題であり、適切な対処が必要です。
上級編

Ruby on Railsは、RubyでのWebアプリケーション開発を支援する人気のあるフレームワークです。Railsを使用することで、MVC(Model-View-Controller)アーキテクチャをベースにした効率的なWebアプリケーションを開発することができます。
上級編

Railsでは、コマンドラインツールを使用してモデルやコントローラを簡単に生成し、ルーティングを設定することができます。これにより、短期間で効率的なWebアプリケーションを構築することができます。
上級編

MVC(Model-View-Controller)アーキテクチャは、アプリケーションの設計を3つの主要なコンポーネントに分割するアーキテクチャパターンです。
上級編

このように、MVCアーキテクチャは各コンポーネントが疎結合であり、変更が発生した際に一部のコンポーネントを変更しても他のコンポーネントに影響を与えにくい特徴があります。これにより、柔軟性が向上し、保守性が高まります。
上級編

RoR(Ruby on Rails)は、MVC(Model-View-Controller)アーキテクチャの理念に基づいて設計されたWebアプリケーションフレームワークです。RoRにおけるMVCの役割と機能を説明します。
上級編

Ruby on RailsはMVCアーキテクチャにより、アプリケーションの各コンポーネントが明確に分離され、保守性が向上し、柔軟性が高まります。
上級編

Railsでは、アクティブレコードと呼ばれるオブジェクト関係マッピング(ORM)ツールを使用して、データベースとのやり取りを簡単に行うことができます。アクティブレコードを使用することで、SQLクエリを直接記述せずに、Rubyオブジェクトとしてデータベースのテーブルを操作することができます。
上級編

Railsでは、データベースへの接続設定を行うことで、アプリケーション内でアクティブレコードを使用してデータベースとやり取りすることができます。
上級編

ORMは、オブジェクトとリレーショナルデータベースとの間のマッピングを行うためのツールです。ORMを使用することで、データベースのテーブルをオブジェクトとして操作することができ、SQLクエリの記述を最小限に抑えることができます。これにより、コードの可読性や保守性が向上します。
上級編

メモリ管理とコードの最適化は、Rubyプログラミングにおいて重要な要素です。効率的なメモリ管理を行うことで、アプリケーションのメモリ使用量を最小限に抑え、パフォーマンスを向上させることができます。また、コードの最適化により、処理速度を高速化し、リソースの効率的な利用を実現することができます。
上級編

プロファイリングツールは、アプリケーションのパフォーマンスを詳細に分析し、ボトルネックを特定するための有用なツールです。プロファイリングツールを使用することで、どの部分が最もリソースを消費しているかや、どの部分が最も遅いかなどを把握することができます。
上級編

これらのプロファイリングツールを使用して、アプリケーションのパフォーマンスを詳細に分析し、効率的な最適化を行いましょう。
上級編

上級レベルでは、オブジェクト指向デザインパターンの理解と実装に焦点を当てましたが、実際のアプリケーション開発では、これらのパターンを活用して柔軟で効率的なコードを書くことが重要です。より実践的な例や、実際の問題に対する解決策を学ぶことで、より高度な開発スキルを身につけることができます。
上級編

プロの開発者になるためには、セキュリティとエラーハンドリングの重要性を理解し、適切な対策を講じることが不可欠です。セキュリティホールや悪意のある攻撃からアプリケーションを保護し、エラーが発生した際にユーザーやシステムに影響を与えないようにするための方法を学びましょう。
上級編

テスト駆動開発(Test-Driven Development, TDD)は、コードを書く前にテストを書き、そのテストをパスするようなコードを実装する開発手法です。TDDを実践することで、より品質の高いコードを生産し、バグの早期発見やリファクタリングの容易化が可能となります。
上級編

コード品質は、プロの開発者にとって非常に重要な要素です。コードを読みやすく、保守しやすく、拡張しやすくするためのリファクタリングのテクニックやベストプラクティスを学び、コードベースを常に改善していきましょう。
上級編

これらのトピックを網羅的に学ぶことで、より高度なRubyプログラミングスキルを身につけることができます。プロの開発者としてのキャリアを築くために、着実にスキルを向上させていきましょう。
リファレンス編

Rubyの変数は、オブジェクトに名前をつけるために使われます。
リファレンス編

Rubyでは、変数は宣言する必要はありません。
リファレンス編

オブジェクトを変数に代入するには
リファレンス編

の様に代入演算子 = を使います。
リファレンス編

Rubyにおける定数は、変更できない値のことです。定数は大文字で始まり、一度値を代入するとその後変更することができません。定数を宣言するには、変数名の先頭に大文字のアルファベットを付けます。
リファレンス編

定数は、クラスやモジュールの定義内で宣言される場合、そのクラスやモジュールのスコープにのみ存在します。クラスやモジュール外で宣言された定数は、グローバルスコープに属します。
リファレンス編

定数にアクセスするには、定数名を参照します。定数が未定義の場合、RubyはNameError例外を発生させます。
リファレンス編

以下は、定数を宣言して参照する例です。
リファレンス編

また、Rubyでは組み込み定数もいくつか存在します。例えば、Math::PIは円周率を表す定数です。
リファレンス編

グローバル変数は、プログラム中のどこからでもアクセス可能な変数です。グローバル変数は、$記号で始まる変数名を持ちます。一般的に、グローバル変数は、複数のメソッドで共有するデータを格納するために使用されます。ただし、グローバル変数は多用すべきではなく、できるだけ避けるべきです。
リファレンス編

このコードでは、$global_variableというグローバル変数が定義されています。そして、print_globalメソッド内でその値が参照されて表示されます。グローバル変数はプログラム中のどこからでも参照可能であるため、異なるメソッド間でデータを共有する場合に使用されます。しかし、グローバル変数の使用は避けるべきであり、できるだけローカル変数やインスタンス変数を使用することが推奨されます。
リファレンス編

特殊変数は、Rubyがあらかじめ定義している変数で、プログラム中で直接代入することができません。これらの変数は、プログラムの実行中に自動的に設定され、Rubyの様々な機能で使用されます。
リファレンス編

Rubyは完全なオブジェクト指向言語であり、すべてがオブジェクトです。オブジェクトは、データとそれに対する操作をカプセル化したものであり、オブジェクトを操作するためにメソッドを使用します。
リファレンス編

以下は、オブジェクトについての基本的な説明です。
リファレンス編

これらのオブジェクトのクラスを知ることは、そのオブジェクトがどのような振る舞いをするかを理解するために非常に重要です。
リファレンス編

Rubyにおけるすべてのオブジェクトは、Objectから継承されています。Objectには、すべてのオブジェクトに共通するメソッドが定義されています。
リファレンス編

以下は、Objectに関する基本的な説明です。
リファレンス編

オブジェクトのクラスを調べるには、Objectクラスのclassメソッドを使います。
リファレンス編

Rubyにおける式と演算子について説明します。
リファレンス編

Rubyにおける式とは、ある値を評価するためのコードのことを指します。例えば、以下のような式があります。
リファレンス編

この式は、1と2を足した結果を評価するための式です。この式を実行すると、3という値が返されます。
リファレンス編

演算子は、式を組み合わせたり、値を変更するために使用されます。Rubyにはさまざまな種類の演算子があります。以下はいくつかの例です。
リファレンス編

数値演算子には、加算、減算、乗算、除算、剰余演算子などがあります。
リファレンス編

以下はいくつかの例です。
リファレンス編

Rubyの四則演算子と剰余演算子は、通常の数値演算に使用されることが一般的ですが、オブジェクト指向プログラミング言語であるRubyでは、これらの演算子がオーバーロードされることがあります。
リファレンス編

数値演算子の使用は、さまざまなデータ型に対して行われます。整数、文字列、配列、有理数、複素数など、Rubyは様々なデータ型をサポートしており、それぞれのデータ型に対して適切な演算が行われます。
リファレンス編

例えば、文字列の場合、加算演算子は文字列の連結を行います。同様に、整数や有理数の場合は数値演算が行われますが、複素数の場合は複素数の演算が行われます。
リファレンス編

また、Rubyでは四則演算子や剰余演算子などの演算子がオーバーロードされることがあります。これにより、ユーザー定義のクラスやオブジェクトに対して独自の演算を定義することができます。オブジェクト指向の特性を活かした柔軟な演算の定義が可能です。
リファレンス編

数値演算子の適切な使用は、プログラムの正確性や効率性に直結します。Rubyの数値演算子を適切に理解し、適切に活用することで、より効率的で読みやすいコードを書くことができます。
リファレンス編

比較演算子とComparableモジュールは、Rubyにおいてオブジェクトの比較を可能にする重要な機能です。
リファレンス編

比較演算子には以下のようなものがあります:
リファレンス編

以下はいくつかの例です。
リファレンス編

これらの演算子を使って、オブジェクト同士を比較することができます。例えば、整数同士や文字列同士の比較などが挙げられます。
リファレンス編

Comparableモジュールは、比較可能なオブジェクトを定義するためのモジュールです。このモジュールをクラスにincludeすることで、そのクラスのインスタンス同士を比較可能にすることができます。
リファレンス編

Comparableモジュールでは、<=>演算子(スペース船演算子)を実装する必要があります。この演算子は、二つのオブジェクトを比較して以下のような値を返します:
リファレンス編

Comparableモジュールを使用することで、クラス内で<=>演算子を定義するだけで、そのクラスのインスタンス同士を比較することができます。これにより、コードの可読性を高め、一貫した比較処理を実現することができます。
リファレンス編

例えば、数値や文字列など、大小関係を持つオブジェクトを扱う場合に便利です。また、minやmaxなどのメソッドを利用して、比較可能なオブジェクトの最小値や最大値を簡単に取得することもできます。
リファレンス編

Personクラスでは、<=>演算子を定義して、ageインスタンス変数を比較しています。そのため、Personクラスのインスタンスは、<, <=, ==, >, >=, between?演算子によって比較可能になります。
リファレンス編

論理演算子には、AND、OR、NOT演算子があります。以下はいくつかの例です。
リファレンス編

以下に、論理積 (AND)、論理和 (OR)、論理否定 (NOT) を表現するための真理値表を示します。
リファレンス編

上記の表で、A と B はそれぞれ真 (1) または偽 (0) の値を表し、AND や OR などの論理演算子によって表された結果は、真 (1) または偽 (0) のいずれかです。 また、論理否定では、NOT A は A の真偽を反転させた値となります。
リファレンス編

Rubyの短絡評価とは、論理式の評価において、最初の式で結果が確定した場合に、その後の式を評価しないことを指します。つまり、式が最初の部分で真偽値が確定した場合、後続の式を評価せずに即座に結果を返します。
リファレンス編

例えば、以下のようなコードがあったとします。
リファレンス編

このコードでは、name が nil でないかつ文字列の長さが0より大きいかを同時にチェックしています。 具体的には、条件式 name && name.length > 0 によってチェックしています。
リファレンス編

この条件式では、短絡評価 (short-circuit evaluation) が利用されています。短絡評価とは、条件式の全ての部分を評価せずに、最初に結果が確定した部分で評価を終了するという評価方法です。 具体的には、この場合はnameがnilである場合、name.length > 0 の評価は行われず、条件式全体がfalseと判定されます。
リファレンス編

このような短絡評価の利用により、コードのパフォーマンスを向上させることができます。また、name が nil の場合に name.length を呼び出すことがなくなるため、エラーを避けることができます。
リファレンス編

しかし、短絡評価を乱用すると、プログラムの可読性が低下したり、バグを引き起こしたりすることがあります。適切な場面でのみ利用するようにしましょう。
リファレンス編

「Rubyでは演算子もメソッド」とは、Rubyにおいて演算子 (たとえば +, -, *, / など) が単なる記号ではなく、それぞれが対応するメソッドとして定義されているということを指します。
リファレンス編

例えば、+ 演算子は、2つの数値を足し合わせるために使われますが、実際には + メソッドとして定義されています。以下のように + メソッドを使って足し算を行うことができます。
リファレンス編

また、* 演算子も同様に * メソッドとして定義されています。以下のように、文字列に対して * メソッドを使って、指定した回数だけ繰り返した新しい文字列を作ることができます。
リファレンス編

このように、Rubyでは演算子も単なる記号ではなく、それぞれが対応するメソッドとして定義されているため、オブジェクト指向の考え方に基づいた柔軟なプログラミングが可能になっています。
リファレンス編

Rubyでは、クラスやモジュールで演算子に対応するメソッドを定義することができます。このようにして定義された演算子メソッドをオーバーロードと呼びます。
リファレンス編

以下は、Vector2 クラスで + 演算子に対応するメソッドを定義する例です。このメソッドでは、Vector2 クラスのインスタンス同士を足し合わせることができます。
リファレンス編

このコードは、2次元ベクトルを表す Vector2 クラスを定義し、2つのベクトルを足し合わせるメソッドを実装しています。
リファレンス編

まず、attr_accessor によって、x と y のインスタンス変数に対する getter/setter メソッドが定義されています。これによって、外部から v1.x のようにしてインスタンス変数にアクセスしたり、v1.x = 10 のようにしてインスタンス変数に値を代入したりできます。
リファレンス編

次に、initialize メソッドが定義されています。これは、new メソッドが呼ばれた時に、引数として渡された x と y をインスタンス変数 @x と @y に代入するためのコンストラクタです。
リファレンス編

+ メソッドは、引数として与えられた other という別の Vector2 オブジェクトを足し合わせ、新しい Vector2 オブジェクトを作成して返します。これによって、v1 + v2 のようにして2つのベクトルを足し合わせることができます。
リファレンス編

最後に、to_s メソッドが定義されています。これは、オブジェクトを文字列に変換するためのメソッドで、ベクトルの座標を [x, y] のような形式の文字列に変換して返します。
リファレンス編

実際に、v1 と v2 を足し合わせた結果を v3 に代入し、puts v3 で v3 を表示しています。v3 の値は [4, 6] となります。
リファレンス編

このように演算子メソッドをオーバーロードすることで、プログラムの読みやすさや柔軟性を高めることができます。ただし、意図しない挙動を招くこともあるため、注意して使いましょう。
リファレンス編

Rubyでは、演算子をオーバーロードすることが出来ます。 オーバーロード可能な演算子には、組み込みクラスの演算子も含まれます。
リファレンス編

このコードは、Rubyの String クラスに、新しいメソッド / を追加しています。
リファレンス編

/ メソッドは、文字列を引数 s で分割するためのメソッドです。 実装は split メソッドを呼び出すだけで、文字列オブジェクト自身を self で表しています。
リファレンス編

まず、/ メソッドによって、文字列 "The quick brown fox jumps over the lazy dog" がスペース " " で分割され、配列 ary に格納されます。 ここで ary は、["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"] という値を持ちます。
リファレンス編

次に、* メソッドによって、配列 ary が感嘆符 "!" で連結され、文字列 str が作成されます。 ここで str は、"The ! quick ! brown ! fox ! jumps ! over ! the ! lazy ! dog" という値を持ちます。
リファレンス編

このように、/ と * メソッドを利用することで、簡単に文字列の分割や連結を行うことができます。 ただし、他の開発者がこのようなメソッドを利用しているコードを読む場合、このような振る舞いを予想できない可能性があるため、注意が必要です。
リファレンス編

/ と * を、それぞれ文字列の分割と結合に割り当てる例は、Pikeに見ることが出来ます。
リファレンス編

演算子には優先順位があります。
リファレンス編

例えば、以下のようなコードがあった場合、演算子の優先順位に従って評価されます。
リファレンス編

ここで、**は先に評価されます。次に、*と/が同じ優先順位なので、左から右に評価されます。最後に+が-よりも優先度が高いので、+が評価されます。
リファレンス編

つまり、aの値は50になります。
リファレンス編

同じ優先順位の演算子が続いた場合、演算子の結合方向により実行順序が決まります。
リファレンス編

例えば、以下のコードがある場合、
リファレンス編

**は右結合なので、3 ** 2が先に評価されます。そして、2 ** 9が評価されて、aは512になります。
リファレンス編

以下は、Rubyの演算子の優先順位と結合方向の表です。
リファレンス編

Rubyには、if-else-elsif-end、unless-else-end、case-when-else-end、case-in-else-end、while文、until文、for文、そしてbegin-rescue-else-ensure-endのような例外処理構文など、様々な制御構造があります。 これらの制御構造を使うことで、プログラムの実行を条件に応じたループや分岐によって制御することができます。 制御構造を正しく理解し、適切に使用することで、効率的で洗練されたプログラムを書くことができます。
リファレンス編

また広義の制御構造にはブロックを伴う each や loop などのメソッドも含まれ、ここではそれらについても解説します。
リファレンス編

Rubyの条件分岐には、if-elsif-else-end、unless-else-end、そしてcase-when-else-endがあります。 また、if, unless には修飾子構文もあります。
リファレンス編

if-elsif-else-endは、条件に応じて処理を分岐するためのもっとも基本的な構文です。
リファレンス編

例えば、ある数値変数numが0未満なら「negative」、0なら「zero」、0より大きいなら「positive」と表示するプログラムは以下のように書けます。
リファレンス編

if修飾子は、条件式が肯定されたとき式を評価する構文です。
リファレンス編

例えば、ある数値変数numが0未満なら「negative」と表示するプログラムは以下のように書けます。
リファレンス編

unless-else-endは、if-elsif-else-endと似たような構文ですが、条件式が否定されたときに処理が実行されます。
リファレンス編

例えば、ある数値変数numが0以上なら「non-negative」、0未満なら「negative」と表示するプログラムは以下のように書けます。
リファレンス編

unless修飾子は、if修飾子に似ていますが、条件式が否定されたときに式を評価する構文です。
リファレンス編

例えば、ある数値変数numが0以上でなければ「negative」と表示するプログラムは以下のように書けます。
リファレンス編

case-when-else-endは、複数の値に応じて処理を分岐するための構文です。if-elsif-else-endと比較して、1つのオブジェクトに対して複数の条件式を一度に評価できるという利点があります。
リファレンス編

例えば、ある文字変数cに対して、それが母音なら「vowel」、子音なら「consonant」、数字なら「number」、それ以外なら「other」と表示するプログラムは以下のように書けます。
リファレンス編

Rubyの case 文では、比較に用いるオブジェクトの型に応じて条件分岐することができます。具体的には、case 文の式の型が以下のいずれかである場合に、対応する条件分岐が行われます。
リファレンス編

以下に、それぞれの場合の例を示します。
リファレンス編

これらの例では、case 文の式の型によって、比較に用いるオブジェクトの型や正規表現パターンが異なることに注意してください。また、どの条件にも一致しない場合に実行される else 節は省略可能です。
リファレンス編

Rubyのパターンマッチングは、バージョン2.7で導入された新機能であり、構造化された値に対してパターンをマッチングすることができます。これにより、より複雑なデータ構造を柔軟に操作できるようになります。
リファレンス編

以下に、Rubyのパターンマッチングの基本的な構文と機能について説明します。
リファレンス編

パターンは以下のようなものがあります:
リファレンス編

パターンマッチングによって、マッチした部分をローカル変数にバインドすることができます。
リファレンス編

ifを使用して、パターンがマッチした場合に追加の条件を指定することができます。
リファレンス編

複数のパターンを組み合わせてマッチングを行うこともできます。
リファレンス編

パターンマッチングが失敗した場合には、例外が発生します。これは、NoMatchingPatternErrorとして知られています。
リファレンス編

カスタムクラスに対してパターンマッチングを行う場合、deconstructやdeconstruct_keysメソッドを実装することでマッチングを行うことができます。
リファレンス編

以上が、Rubyのパターンマッチングについての基本的な説明です。この機能は、プログラミングのパラダイムをより関数型プログラミング寄りのスタイルに変えることができます。
リファレンス編

Rubyの反復構文は、特定の条件が満たされるまでコードのブロックを繰り返すことができる文のセットです。最も一般的な反復文は、while、until、for、loop です。
リファレンス編

また、while, until には修飾子構文もあります。
リファレンス編

これらの基本的な反復処理文に加えて、Ruby には break、next、redo、lazy などの反復処理文があります。これらの文により、コードの実行の流れを制御することができます。
リファレンス編

while文の構文は以下の通り:
リファレンス編

条件とは、ループの実行を継続するためにtrueと評価されなければならないブール値の式です。 処理の部分は、条件が真である限って実行されるコードのブロックです。
リファレンス編

まえの例では、条件は「i <= 10」です。これは、iの値が10以下である限り、ループが実行され続けることを意味します。 処理の部分は、puts i行です。この行はiの値をコンソールに出力します。
リファレンス編

while文は、特定の条件が満たされる限り、コードのブロックを繰り返すことができる強力なツールです。
リファレンス編

while修飾子は、if修飾子に似ていますが、条件式が肯定されている間は式を評価し続ける構文です。
リファレンス編

例えば、ある数値変数numが0未満の間、num に 2 を足し続けるプログラムは以下のように書けます。
リファレンス編

until文の構文は以下の通り:
リファレンス編

条件とは、ループの実行を継続するためにfalseと評価されなければならないブール値の式です。 処理の部分は、条件が偽である限って実行されるコードのブロックです。
リファレンス編

まえの例では、条件はi <= 1である。これは、iの値が1以上である限り、ループが実行され続けることを意味します。 処理の部分は、puts i行です。この行はiの値をコンソールに出力します。
リファレンス編

until文は、特定の条件が満たされない限り、コードのブロックを繰り返すために使用できる強力なツールです。
リファレンス編

until修飾子は、while修飾子に似ていますが、条件式が否定されている間は式を評価し続ける構文です。
リファレンス編

例えば、ある数値変数numが0以上でない間、num に 2 を足し続けるプログラムは以下のように書けます。
リファレンス編

for文の構文は以下の通り:
リファレンス編

ループ変数は、コレクション内の現在の要素のプレースホルダーです。 コレクションは、配列、範囲、その他の反復可能なオブジェクトのいずれでもかまいません。 ループ変数にまつわる処理の部分は、コレクション内の各要素に対して実行されるコードのブロックです。
リファレンス編

この例では、コレクションは配列[2, 3, 5, 7, 11]です。ループ変数はelementです。 ループ変数にまつわる処理の部分は、puts element行です。この行は、elementの値をコンソールに表示します。
リファレンス編

for文は、要素のコレクションを繰り返し処理するために使用できる強力なツールです。
リファレンス編

Rubyには、反復制御を行う文が5つあります。
リファレンス編

反復制御文は、Rubyのコードをより効率的に、より読みやすくするために使用できる強力なツールです。
リファレンス編

break文は、現在のループを終了させます。
リファレンス編

このコードは、1から始まり、12ずつ増加する無限の数列を生成し、その数列の各要素をdo..endブロック内で処理しています。各要素は変数iに割り当てられ、puts文を使って出力されます。
リファレンス編

しかし、break if i >= 50の部分によって、iが50以上になった場合、ループが終了します。つまり、ループは50未満の値のときだけ実行されます。
リファレンス編

このコードは、1, 13, 25, 37, 49といった50未満の数列を出力します。そして、iが50以上の値になった時点でループが終了します。
リファレンス編

next文は、ループの現在の反復をスキップさせます。
リファレンス編

このコードは、1から10までの数列を生成し、その数列の各要素をdo..endブロック内で処理しています。各要素は変数iに割り当てられ、puts文を使って出力されます。
リファレンス編

next if i == 5の部分によって、iが5の場合、それ以降の処理をスキップして次の要素の処理に進みます。つまり、5は出力されません。
リファレンス編

したがって、このコードは1, 2, 3, 4, 6, 7, 8, 9, 10という数列を出力します。5がスキップされ、それ以外の値が出力されます。
リファレンス編

redo文は、現在のループの繰り返しを再度実行します。
リファレンス編

例外が発生した場合に、その処理をやり直します。
リファレンス編

メソッド内でループを含む場合、returnを使ってループからも抜けることができます。以下はその例です。
リファレンス編

この場合、returnが呼び出されると、example_method自体が終了し、その場でループも終了します。
リファレンス編

これらのキーワードやメソッドを使うことで、ループの挙動を制御することができます。
リファレンス編

Rubyでは、反復処理を用いて演算を行うメソッドを反復処理メソッドと呼びます。 反復処理とは、コードのブロックを指定された回数だけ、あるいは特定の条件が満たされるまで繰り返す処理のことです。
リファレンス編

Rubyには、ArrayやHashなどのコレクションオブジェクトを簡単にイテレーションできる多数のメソッドがあります。以下はいくつかの例です:
リファレンス編

上記の例では、以下のように動作しています。
リファレンス編

これらのメソッドを使用することで、コレクションの要素に簡単にアクセスできます。また、each_with_indexを使用することで、要素のインデックスにも簡単にアクセスできます。
リファレンス編

Rubyには、様々なメソッドやイテレータで使用される暗黙のブロック引数があります。これらは _1, _2 などの形式で表され、ブロック内で引数を明示的に書く必要がなくなります。代表的なものを以下に示します。暗黙のブロック引数はRuby 2.7からサポートされました。
リファレンス編

このように、暗黙のブロック引数は通常の引数の代替として使われ、ブロック内でのコードをより簡潔にすることができます。ただし、可読性の観点から、コードが複雑になりすぎないよう注意が必要です。
リファレンス編

Rubyには、数値を連続して扱うための便利なメソッドがあります。その中でもupto、downto、stepはよく使われるものです。これらのメソッドについて解説します。
リファレンス編

上記の例では、以下のように動作しています。
リファレンス編

は、第2引数に指定した数値が増加量として使用されます。この例では、2ずつ増加しているため、1, 3, 5, 7, 9という結果になっています。
リファレンス編

過去の編集で、loopをloop文と紹介されていましたが、loopはKernelオブジェクトのメソッドで構文ではありません。
リファレンス編

loopメソッドの使い方は以下の通り:
リファレンス編

処理の部分は、無限に実行されるコードのブロックです。
リファレンス編

この例では、処理パートは puts "This will print forever!"です。 この行は、"This will print forever!"というメッセージをコンソールに無限に出力します。
リファレンス編

enumは[1, 2, 3].eachから生成されたEnumeratorです。Enumeratorは、eachメソッドをブロックなしで呼び出すことで生成され、配列内の各要素を反復処理することができます。
リファレンス編

その後、loop構文が使われています。loop構文は、無限ループを作成するためのもので、ループ内のコードを繰り返し実行します。
リファレンス編

ループ内では、enum.nextが呼び出されています。これにより、Enumeratorから次の要素が取得され、その要素がputsメソッドを使って出力されます。最初は1が出力され、次に2、そして3が出力されます。
リファレンス編

しかし、3を出力した後、Enumeratorからはもう要素がないため、StopIteration例外が発生します。この例外がloop構文によって自動的に捕捉され、ループが終了します。
リファレンス編

break、next、redo文もこれらのメソッドと一緒に使うことができます。
リファレンス編

たとえば、次のようなものです:
リファレンス編

このコードでは、配列の要素のうち、要素2までを表示します。
リファレンス編

このコードでは、配列の要素を、要素2をスキップして表示します。
リファレンス編

このコードは、配列の要素を表示しますが、要素2を無限に表示します。
リファレンス編

Rubyのイテレーションメソッドは、繰り返し処理を行うためのメソッドで、通常はブロックを引数に取ります。ブロックは、繰り返し処理を行うためのコードブロックで、メソッドに渡されたオブジェクトの要素に対して、一つずつ実行されます。
リファレンス編

イテレーションメソッドに渡されるブロックには、引数を指定することができます。引数は、ブロック内で処理する要素を表します。引数を指定する方法には、以下の2つがあります。
リファレンス編

このように、イテレーションメソッドは、ブロックを引数に取り、ブロック内で要素に対する処理を実行するため、とても柔軟性が高く、コードの再利用性を高めることができます。
リファレンス編

Rubyにおける例外処理は、プログラムが想定外のエラーに遭遇した場合に、プログラムの強制終了を防ぐために使用されます。例外処理を使用すると、プログラムはエラーが発生しても継続して実行されるため、エラーに含まれる情報をログファイルに記録したり、エラーメッセージを表示したりすることができます。
リファレンス編

以下は、Rubyで例外処理を行うための基本的な書式です。
リファレンス編

例外処理の流れは、まずbeginブロック内で例外が発生する可能性のある処理を書きます。そして、rescueブロックで発生しうる例外の種類を指定し、例外が発生した場合に行う処理を書きます。elseブロックは、例外が発生しなかった場合に実行する処理を書く部分です。ensureブロックには、必ず実行される処理を書きます。
リファレンス編

以下は、例外処理を用いたコードの例です。
リファレンス編

この例では、divideメソッド内で引数bが0である場合にZeroDivisionErrorが発生する可能性があるため、beginブロック内で計算を行っています。また、rescueブロックではZeroDivisionErrorを補足して、エラーメッセージを表示しています。elseブロックでは、計算結果を表示しています。ensureブロックでは、処理が必ず実行されるように設定しています。
リファレンス編

このコードを実行すると、以下のような結果が得られます。
リファレンス編

Rubyでは、制御構造の修飾子版も提供されています。これは一行で短く書くことができ、可読性を向上させる場合があります。
リファレンス編

制御構造の修飾子版には、以下のものがあります:
リファレンス編

この場合、"Hello"はflagが真の場合にのみ出力されます。
リファレンス編

この場合、"Hello"はcondが偽の場合にのみ出力されます。
リファレンス編

この場合、ループが続行される条件が満たされている間、xの値がインクリメントされ、その値が出力されます。
リファレンス編

この場合、ループが続行される条件が満たされるまで、xの値がインクリメントされ、その値が出力されます。
リファレンス編

Rubyのrescue修飾子は、単一行の式での例外処理を行うために使用されます。通常のbegin..rescue..endブロックと異なり、修飾子版はコードを短く保ち、よりコンパクトに書くことができます。
リファレンス編

rescue修飾子の構文は以下の通りです:
リファレンス編

式1が例外を発生させた場合、rescue修飾子はその例外をキャッチし、代わりに式2を評価します。
リファレンス編

以下はrescue修飾子を使用した例です:
リファレンス編

この例では、risky_operationというメソッドを呼び出しますが、もし例外が発生した場合には、デフォルト値を代入することでエラーハンドリングを行っています。
リファレンス編

rescue修飾子は、例外が発生する可能性のある単一の式を簡潔に記述する場合に便利ですが、複雑な例外処理を行う場合や、複数の式に対する例外処理を行う場合には、通常のbegin..rescue..endブロックを使用する方が適しています。
リファレンス編

これらの修飾子版は、単純な条件の場合や短いコードブロックの場合に便利です。 ただし、複雑な制御構造や複数の条件がある場合は、通常の制御構造を使用した方が可読性が高くなります。
リファレンス編

Rubyのメソッドとは、ある一定の処理をまとめて名前をつけたもので、複数の場所で同じような処理を書く必要がある場合に便利です。
リファレンス編

以下は、Rubyでメソッドを定義する方法の例です。
リファレンス編

上記のコードでは、defキーワードを使ってメソッドを定義します。メソッド名は自分で決定し、仮引数は必要に応じて任意の数を指定できます。また、endキーワードでメソッドの終わりを示します。
リファレンス編

以下は Ruby における関数定義における引数に関する機能の例です。
リファレンス編

greet 関数は固定順位引数を使用しています。greet_with_default 関数では、name のデフォルト引数が指定されています。greet_with_keyword 関数では、キーワード引数を使用しています。greet_with_keyword_default 関数では、キーワード引数のデフォルト引数が指定されています。greet_with_block 関数では、ブロック引数を使用しています。最後に、greet_with_remainder 関数は残余引数を使用しています。
リファレンス編

これらの機能を駆使することで、より柔軟かつ読みやすいコードを作成することができます。
リファレンス編

例えば、以下のようなメソッドを定義してみましょう。
リファレンス編

このメソッドは、引数に渡した名前に対して「Hello, 〇〇!」というメッセージを出力します。引数の「name」には、任意の名前を指定することができます。
リファレンス編

このメソッドを呼び出すためには、以下のように書きます。
リファレンス編

引数に指定した名前が、「name」の部分に代入され、putsメソッドによってメッセージが出力されます。
リファレンス編

また、Rubyには引数を指定しないデフォルト値を設定する方法もあります。以下は、デフォルト値を設定したメソッドの例です。
リファレンス編

この場合、引数を指定しなかった場合は「World」という名前が、引数を指定した場合は指定した名前が代入されます。例えば、以下のように呼び出します。
リファレンス編

キーワード引数では、引数名を指定することができます。これにより、引数の並び順を気にすることなく、任意の引数を指定することができます。
リファレンス編

キワード引数の実引数でに順序は任意です。
リファレンス編

キーワード引数もディフォルト値を設定することができます。引数を指定しなかった場合は、初期値が使われるようになります。
リファレンス編

ブロック引数とは、メソッドの引数としてブロックを受け取るための仕組みです。 ブロックを受け取るメソッドの引数リストの最後に、"&ブロック名"という形式の引数を指定することで、ブロックをメソッド内で扱うことができます。
リファレンス編

以下に例を示します。
リファレンス編

上記の例では、my_methodメソッドにブロックを渡しています。my_methodメソッド内では、ブロックを扱うための引数として"&block"を指定しており、ブロックを呼び出すために"block.call"を用いています。
リファレンス編

yieldは、メソッドに渡されたブロックを実行するためのキーワードです。yieldを使用することで、メソッド内でブロックを実行することができます。
リファレンス編

以下に例を示します。
リファレンス編

上記の例では、my_methodメソッド内でyieldを用いてブロックを実行しています。my_methodメソッドが呼び出されると、引数として渡されたブロックが実行されます。
リファレンス編

ブロック引数の呼び出しやyieldは引数を渡すこともできます。
リファレンス編

上記の例では、my_methodメソッドにブロックを渡し、ブロック引数に"name"を指定しています。 ブロック内で引数を使用するために、block.callで"name"を渡しています。 ブロック内では、引数として渡された"name"を使用して文字列を出力しています。
リファレンス編

Procクラスは[]をオーバーロードしており。
リファレンス編

と書くことも出来ます。
リファレンス編

上記の例では、my_methodメソッドに引数として"name"を渡し、yieldに"name"を引数として渡しています。 ブロック内では、引数として渡された"name"を使用して文字列を出力しています。
リファレンス編

再帰を行う場合、通常はブロック引数を使用する方が適切です。再帰的な関数では、ブロック引数を使用することで、再帰呼び出しのたびに異なるブロックを渡すことができます。これにより、再帰呼び出しのたびに異なる処理を行うことが可能になります。
リファレンス編

例えば、再帰的なメソッドを定義する際には、ブロック引数を使用して次の再帰呼び出し時に実行される処理を指定します。
リファレンス編

このように、ブロック引数を使うことで、再帰呼び出し時に実行される処理を柔軟に指定することができます。これにより、再帰メソッドがより汎用的で柔軟なものになります。
リファレンス編

Rubyでは、メソッド内でブロックが渡されたかどうかを判定する方法があります。これを行うには、block_given?メソッドを使用します。このメソッドは、メソッド内でブロックが渡された場合にtrueを返し、それ以外の場合にfalseを返します。
リファレンス編

以下は、block_given?メソッドを使用してブロックが渡されたかどうかを判定する例です。
リファレンス編

このように、block_given?メソッドを使うことで、メソッド内でブロックが渡されたかどうかを簡単に判定することができます。
リファレンス編

ブロック引数を受け取るメソッドの呼び出しで、ブロック引数を省略した場合の戻り値は、Enumeratorオブジェクトとする慣習があります。
リファレンス編

例えば、配列をeachメソッドで呼び出した場合、ブロックが省略されるとEnumeratorオブジェクトが返ります。
リファレンス編

このように、eachメソッドがブロック引数を省略された場合、戻り値はイテレータとして機能するEnumeratorオブジェクトとなります。このオブジェクトは、コレクションの各要素を順番に処理するために使用されます。
リファレンス編

Rubyにおける「残余引数(rest argument)」とは、メソッド定義の中で最後の引数として指定され、そのメソッドに渡された全ての追加の引数を1つの配列として受け取る機能です。残余引数は、メソッドが可変長の引数を受け取ることを可能にします。
リファレンス編

残余引数は、メソッド定義の引数の前にアスタリスク * を付けて指定されます。これにより、メソッドが受け取る引数の数を動的に決定することができます。
リファレンス編

以下は、残余引数を使用する例です。
リファレンス編

この例では、greet メソッドは greeting という通常の引数と、*names という残余引数を持っています。greet メソッドは最初の引数を挨拶の文字列として受け取り、残りの引数を配列 names として受け取ります。その後、names 配列内の各要素に対して、挨拶と名前を組み合わせたメッセージを出力します。
リファレンス編

残余引数を使用することで、メソッドが任意の数の引数を受け取る柔軟性が向上し、可読性の高いコードを記述することができます。
リファレンス編

メソッド内で最後に評価される値が、そのメソッドの戻り値になります。例えば、次のようなメソッドを考えてみましょう。
リファレンス編

このメソッドは2つの引数を受け取り、それらの和を返します。return キーワードを使用して、明示的に戻り値を指定しています。このように return を使わずに値を返すと、メソッドの最後に評価された値が自動的に戻り値として返されます。
リファレンス編

このように、明示的に return を書かなくても、メソッド内で最後に評価された値が自動的に戻り値となります。
リファレンス編

さらに、1つの式からなる関数は = を使い end を伴わない構文で定義できます。
リファレンス編

メソッドを呼び出す際には、その戻り値を変数に代入したり、別のメソッドの引数として渡したりすることができます。 戻り値が必要な場合や、逆に必要ではない場合など、メソッドの設計時にはしっかりと考慮して実装する必要があります。
リファレンス編

Rubyには4つのスコープがあります。以下にそれぞれのスコープとコード例を示します。
リファレンス編

以上がRubyの4つのスコープです。
リファレンス編

Rubyでは、メソッド内で再帰を行うことができます。以下は、再帰を行うシンプルな例です。
リファレンス編

このコードでは、countdownメソッドが自分自身を呼び出して、カウントダウンを実行しています。呼び出し結果は以下の通りです。
リファレンス編

このように、再帰を使うと、同じ処理を繰り返し実行することができます。
リファレンス編

Rubyにはクロージャーという概念があります。クロージャーとは、変数とブロックを組み合わせたもので、後からブロック内で変数が参照された場合でも、当時の変数の値を保持している特殊なオブジェクトです。
リファレンス編

以下は、クロージャーを使った例です。
リファレンス編

上記の例では、greeting_procメソッドがブロックを返し、そのブロックがhello変数に代入されます。このブロック内で参照される変数nameの値が保持され、hello.callを複数回実行しても、最初に指定した名前が表示されます。
リファレンス編

また、changing_nameという変数を新しく定義しても、クロージャー内で参照されるnameの値には影響がなく、hello.callを実行すると、"Hello, Alice!"が表示されます。
リファレンス編

Rubyにおけるクラスは、オブジェクト指向プログラミングにおいて重要な役割を持ちます。クラスは、同じ構造や属性を持つオブジェクトの集合を定義するもので、それぞれのオブジェクトはクラスのインスタンスであると考えることができます。
リファレンス編

クラス定義はclassキーワードを使い、インスタンス変数を作成するためにattr_accessorを使っています。コンストラクターはinitializeメソッドを使い、引数を受け取ってインスタンス変数を初期化します。
リファレンス編

クラスメソッド、インスタンスメソッドはそれぞれdef self.method_name、def method_nameの形式で定義されます。また、クラス変数は@@で始められ、インスタンス変数は@で始められます。
リファレンス編

このように、Rubyのクラスを使用することで、簡単にオブジェクト指向プログラミングを実現することができます。
リファレンス編

Rubyには3種類のアクセス修飾子があります。
リファレンス編

以下は、それぞれのアクセス修飾子を使用した例です。
リファレンス編

上記の例では、Animalクラスに swim、run、fly メソッドを定義しています。 swimメソッドは public、run メソッドは protected、fly メソッドは private となっています。
リファレンス編

また、Cat クラスを Animal クラスのサブクラスとして定義し、can_runメソッドで、Animalクラスで protected として定義した run メソッドを呼び出しています。一方で、can_fly メソッドで private として定義した fly メソッドを呼び出しているため、エラーが発生しています。
リファレンス編

この例では、Animal という親クラスを作成し、 Dog と Cat という子クラスを作成しています。 Dog と Cat はそれぞれ speak メソッドを持っており、それぞれ異なる出力をします。
リファレンス編

Dog と Cat は Animal クラスを継承しています。このため、 Dog と Cat も Animal クラスの speak メソッドを呼び出すことができます。
リファレンス編

以下はRubyにおける演算子オーバーロードの例です。
リファレンス編

注目すべきは:
リファレンス編

の2点です。
リファレンス編

Rubyでは、オブジェクトに固有のメソッドを定義することができます。これを特異メソッドと呼びます。通常、メソッドはクラス定義内で定義されますが、特異メソッドは特定のオブジェクトに対して定義されます。
リファレンス編

特異メソッドを定義するには、以下のように書きます。
リファレンス編

例えば、以下のように書くことで、特定のオブジェクトにhelloメソッドを定義することができます。
リファレンス編

これで、strオブジェクトにhelloメソッドが定義されました。呼び出すには以下のようにします。
リファレンス編

Rubyでは、オブジェクトに対して特異クラスというものが存在します。これは、そのオブジェクトだけが持つクラスのことです。この特異クラスに対して特異メソッドを定義することで、そのオブジェクトだけにメソッドを追加できます。
リファレンス編

特異クラスは、以下のように記述します。
リファレンス編

例えば、以下のように記述することで、上記のstrオブジェクトに対してメソッドを定義することができます。
リファレンス編

これで、strオブジェクトにgoodbyeメソッドが定義されました。呼び出すには以下のようにします。
リファレンス編

以上が、Rubyの特異メソッドについてのチュートリアルです。オブジェクトに対して固有のメソッドを定義することで、便利なプログラミングをすることができます。
リファレンス編

Go/メソッドとインターフェースの都市間の大圏距離を求めるメソッドを追加した例を、Rubyに移植しました。
リファレンス編

このコードは、GeoCoordというクラスを定義し、そこに緯度と経度を持つ「地球上の位置」を表現しています。それを利用して、Sitesというディクショナリに都市名と位置を紐付けています。
リファレンス編

このコードのメインの処理は、各都市に対して、その距離を計算して出力しています。すなわち、都市の位置情報から、地球上での距離を求めることができます。
リファレンス編

この「地球上の距離を求める」処理は、distanceメソッドで定義されており、球面三角法を使って計算されています。具体的には、2点の緯度経度から、その2点間の地表面上の距離を求める数式を用いています。
リファレンス編

また、都市名と位置情報を紐付けたSitesに対しては、各都市の位置を出力しています。それぞれの都市の位置は、東経か西経か、北緯か南緯かで表され、丸括弧でくくられ、「東京駅」の場合は (東経: 139.7673068, 北緯: 35.6809591)という文字列が出力されます。
リファレンス編

JavaScript/クラス#包含と継承を、Rubyに移植しました。
リファレンス編

このコードは、Rubyでオブジェクト指向プログラミングを用いた簡単な図形クラスの例です。
リファレンス編

Pointクラスは、座標を表現するためのクラスであり、xとyの2つのインスタンス変数を持っています。 コンストラクタで、xとyの初期値が設定できます。inspectメソッドは、オブジェクトを文字列に変換するために使用されます。moveメソッドにより、(dx, dy)だけ点を移動することができます。
リファレンス編

Shapeクラスは、点の座標を持つ図形を表すためのクラスであり、initializeメソッド内で、Pointクラスのオブジェクトを作成して、点の座標を設定します。inspectメソッドは、点の座標を返します。 moveメソッドによって、図形を(dx, dy)だけ移動することができます。
リファレンス編

Rectangleクラスは、Shapeクラスを継承しています。コンストラクタで、左上の点の座標と幅と高さを設定できます。inspectメソッドは、左上の点の座標と、幅と高さを表現する文字列を返します。
リファレンス編

最後の行では、Rectangleクラスのインスタンスrctを作成し、その後、rctがRectangleクラス、Shapeクラス、Pointクラスのどれに対してインスタンスかを調べるようにしています。また、rctの位置を(11, 21)だけ移動させます。
リファレンス編

Rubyの高階関数とは、関数を引数や戻り値として扱うことができる関数のことを指します。これにより、コードの再利用性が向上し、より柔軟なプログラミングが可能になります。
リファレンス編

例えば、以下のような高階関数があります。
リファレンス編

この関数は、配列と関数を受け取り、配列の各要素に対してその関数を適用した新しい配列を返します。このように、関数自体を引数として渡せることで、どのような処理でも適用することができます。
リファレンス編

また、RubyのProcオブジェクトを使うことで、無名関数を定義して高階関数に渡すこともできます。例えば、以下のようなコードです。
リファレンス編

このように、Procオブジェクトを定義して関数に渡すことで、より柔軟なプログラミングが可能になります。
リファレンス編

Rubyのlambdaとは、無名関数(関数を名前を付けずに定義すること)の一種であり、関数をオブジェクトとして扱うことができます。
リファレンス編

以下は、lambda式の基本構文です。
リファレンス編

lambdaには引数を渡すことができ、渡された引数を処理に渡すことができます。また、処理の中で return を使うことができ、lambdaの戻り値として処理結果を返すことができます。以下が、lambdaを利用した簡単な例です。
リファレンス編

Ruby 1.9 からは
リファレンス編

のような構文が追加され
リファレンス編

とも書けるようになりました。
リファレンス編

以上が、Rubyのlambdaの基本的な使い方です。
リファレンス編

RubyのProcとlambdaは、両方とも無名関数を定義するための方法ですが、いくつかの違いがあります。
リファレンス編

引数の扱い方 Procの場合、渡された引数の数が関係なく、無視されます。一方、lambdaの場合は、正確な数の引数が期待されます。引数が足りない場合はエラーが発生します。
リファレンス編

return文の扱い方 Procの場合、return文は元の呼び出し元に戻りますが、そのブロック内の後続のコードも実行されます。lambdaの場合、return文はただちにブロックから返され、コードの後続部分は実行されません。
リファレンス編

以下は、Procとlambdaの振る舞いの違いを示す例です。
リファレンス編

この例では、Procはブロック内でreturn文を呼び出していますが、lambdaは呼び出していません。そのため、Procはreturn文で元の呼び出し元に戻って、その後のコードも実行されなくなっています。一方、lambdaはreturn文を呼び出すことがないので、lambda_testメソッドが正常に終了します。
リファレンス編

Rubyには以下のような並行処理の仕組みが提供されています。
リファレンス編

なお、Rubyには以上の他にも、ThreadクラスやFiberクラスと同様に、GVL(Global VM Lock)によってスレッドセーフに実行されるイベントマシンであるEventMachineや、並行処理のためのツールキットであるCelluloidなどが存在します。
リファレンス編

Rubyにおけるスレッドは、軽量な並列処理を実現するための機能であり、プログラム内で独立して動作する変数やメソッドの集合を表します。スレッドは、複数のタスクを同時に処理することで、CPUを最大限活用することができます。
リファレンス編

スレッドは、Threadクラスを使用して作成することができます。Thread.newメソッドを使用して、新しいスレッドを作成した後、startメソッドを呼び出すことでスレッドを開始します。また、Thread.currentメソッドを使用することで、現在のスレッドを取得することができます。
リファレンス編

以下は、スレッドを使用した簡単な例です。
リファレンス編

この例では、スレッド1とスレッド2が開始されます。それぞれのスレッドは、sleepメソッドを使用して一定時間待機した後、メッセージを出力します。joinメソッドを呼び出すことで、スレッドが完了するまでプログラムの実行をブロックします。
リファレンス編

Rubyにおけるスレッドには、マルチスレッドに関する問題がいくつか存在します。例えば、同一のリソースにアクセスする複数のスレッドによる競合状態や、デッドロックに陥ってしまう可能性があります。これらの問題を回避するため、適切なロック処理や排他制御が必要な場合があります。
リファレンス編

Rubyのファイバー(Fiber)は、擬似並行処理を実現するための仕組みです。標準的なスレッドと異なり、Rubyのファイバーはコルーチン的な動作をし、明示的に制御を渡す必要があります。
リファレンス編

ファイバーは、Ruby 1.9以降から標準機能として組み込まれています。ファイバーを利用することで、特定の処理を中断したあと再開したり、独自のスケジューリングに基づいた処理を実現したりすることができます。
リファレンス編

ファイバーは以下のように作成できます。
リファレンス編

このコードでは、Fiber.newメソッドにブロックを渡してファイバーを作成します。puts "start"を実行した後、Fiber.yieldで処理を中断しています。この時点でプログラムは停止しており、puts "end"はまだ実行されていません。
リファレンス編

ファイバーを再開するには、Fiber#resumeメソッドを呼び出します。
リファレンス編

このコードを実行すると、puts "start"が表示された後にプログラムが停止します。その後、再びfiber.resumeを実行すると、puts "end"が表示されます。
リファレンス編

このように、ファイバーを利用することで、特定の処理を中断してから再開することができます。また、ファイバーを複数作成し、独自のスケジューリングに基づいた処理を行うことができます。
リファレンス編

以下は、複数のファイバーを作成し、それぞれの処理を交互に実行する例です。
リファレンス編

このように、ファイバーを利用することで、擬似的な並行処理を実現することができます。しかし、ファイバーはスレッドと異なり、OSレベルでのスケジューリングを行わないため、適切な制御を行わないとデッドロックや競合状態などの問題が生じることがあります。注意して使用する必要があります。
リファレンス編

Rubyには、プロセスを管理するための Process モジュールが用意されています。このモジュールを使用することで、現在のプロセスや子プロセスを管理することができます。以下に、Processモジュールの主な機能をコードを交えて解説します。
リファレンス編

Process モジュールに用意されている、 Process.pid メソッドを使用することで、現在のプロセスのIDを取得することができます。以下は、 Process.pid を使用して現在のプロセスIDを取得し、表示する例です。
リファレンス編

Process モジュールには、新しいプロセスを生成するためのメソッドが複数用意されています。ここでは、代表的な2つのメソッドを紹介します。
リファレンス編

Process.spawn メソッドを使用することで、外部プログラムを実行する新しいプロセスを生成することができます。以下は、 ls コマンドを実行する新しいプロセスを生成する例です。
リファレンス編

fork メソッドを使用することで、現在のプロセスの子プロセスを生成することができます。 fork メソッドは、呼び出し元のプロセスからコピーされた新しいプロセスを生成します。以下は、 fork メソッドを使用して子プロセスを生成し、子プロセス内で puts メソッドを呼び出す例です。
リファレンス編

生成したプロセスを適切に終了することも重要です。以下は、プロセスを終了するためのメソッドを紹介します。
リファレンス編

Process.kill メソッドを使用することで、指定したシグナルを送信してプロセスを終了することができます。以下は、 kill メソッドを使用して、先程生成した ls コマンドを実行しているプロセスを終了する例です。
リファレンス編

このように、Rubyの Process モジュールを使用することで、プロセスの生成や管理を容易に行うことができます。プロセスを扱う場合は、適切な終了処理も行うようにしましょう。
ライブラリ編

プログラミング言語Rubyの大きな魅力の1つは、豊富なライブラリが用意されていることです。Rubyには標準添付ライブラリとgemと呼ばれるパッケージ管理システムを通じて配布されるライブラリがあり、開発者はこれらのライブラリを活用することで、効率的で堅牢なプログラミングが可能になります。
ライブラリ編

ライブラリ編では、Rubyにおけるライブラリの概念と、主要なライブラリの機能およびユースケースを解説します。ライブラリのインストール方法から、具体的なコード例に至るまでカバーし、Rubyでのライブラリ活用の第一歩を支援します。
ライブラリ編

Rubyでは、数値、文字列、正規表現、シンボル、配列、ハッシュ、範囲などのオブジェクトを直接記述する方法としてリテラル表記が用意されています。
ライブラリ編

これらのリテラル表記は、対応するクラスのオブジェクトを直接生成するための簡潔な記法となっています。また、配列やハッシュの中でもリテラルを入れ子にすることができます。オブジェクトの初期化を手軽に記述できるため、Rubyのコードの可読性が高まります。
ライブラリ編

RubyのNumericは、数値を表す抽象クラスです。具体的な数値の型、例えば整数(Integer)や浮動小数点数(Float)などは、このNumericクラスのサブクラスとして実装されています。
ライブラリ編

Numericクラスは、数値演算や比較などの基本的な操作を提供します。例えば、加算、減算、乗算、除算、比較演算子(<、<=、==、>、>=)などがこのクラスで定義されています(ただし複素数に大小関係は定義できないので大小比較演算子も定義されません)。 また、単項の加算と減算を表す+@や-@といったメソッドも定義されています。
ライブラリ編

このクラスは、Rubyの数値型の共通の振る舞いを定義するための基盤となっています。そのため、IntegerやFloatなどの具体的な数値型が共通のメソッドや振る舞いを持てるように、Numericクラスでこれらのメソッドが定義されています。 数値演算や比較などの一般的な操作に加えて、Numericクラスは他の数値型間での演算を可能にするためのメソッドも提供しています。例えば、coerceメソッドを使うことで、異なる数値型同士での演算が可能になります。
ライブラリ編

Rubyには整数を扱うためのIntegerクラスがあります。
ライブラリ編

Integerクラスは、以下のような数値リテラルで整数値を表現することができます。
ライブラリ編

また、整数の四則演算や比較演算子なども、Integerクラスで定義されています。
ライブラリ編

Rubyには浮動小数点数を扱うためのFloatクラスがあります。 Floatクラスは、IEEE 754のbinary64をRubyのクラス化したものです。
ライブラリ編

以下のような数値リテラルで浮動小数点数を表現することができます。
ライブラリ編

また、浮動小数点数の四則演算や比較演算子なども、Floatクラスで定義されています。
ライブラリ編

Rubyのcoerceメソッドは、数値演算の際に異なる型のオブジェクトを同じ型に変換するために使用されます。一般的には、coerceメソッドは二項演算子(たとえば+、-、*、/など)が呼び出されたときに使用されます。
ライブラリ編

例えば、1 + 2.0の場合、整数型の1と浮動小数点数型の2.0が加算されます。このとき、Rubyは1をFloat型に変換してから加算を行います。この変換はcoerceメソッドによって行われます。
ライブラリ編

具体的には、1 + 2.0の場合、Rubyは以下のように処理を行います:
ライブラリ編

このように、coerceメソッドは異なる型のオブジェクトを同じ型に変換して演算を行う際に使用されます。
ライブラリ編

RubyのRationalクラスは、有理数を表現するためのクラスです。 有理数は、整数のペアとして表現されます:a/b(b>0)、ここでaは分子であり、bは分母です。 数学的には、整数aは有理数a/1と等価です。
ライブラリ編

以下は、Rationalクラスのインスタンスを作成する方法の例です。
ライブラリ編

Rationalクラスのインスタンスは、有理数の四則演算や比較演算を行うことができます。
ライブラリ編

RubyのComplexクラスは、複素数を表現するためのクラスです。 このクラスを使用すると、複素数を直交座標形式または極座標形式で作成し、演算を行うことができます。
ライブラリ編

直交座標形式の複素数は、実数部と虚数部のペアで表されます。以下は、複素数を直交座標形式で作成する方法の例です。
ライブラリ編

極座標形式の複素数は、絶対値(大きさ)と偏角で表されます。以下は、複素数を極座標形式で作成する方法の例です。
ライブラリ編

これらの方法を使って、異なる形式の入力を扱い、複素数を生成することができます。
ライブラリ編

直交座標形式と極座標形式の相互変換
ライブラリ編

Complex クラスでは、複素数の演算もサポートされています。例えば、加算や乗算、除算などが可能です。
ライブラリ編

また、複素数同士の比較も可能です。 == 演算子を用いることで、2つの複素数が等しいかを比較することができ、 != 演算子を用いることで、2つの複素数が等しくないを比較することができます。
ライブラリ編

複素数の一致・不一致は定義されますが、大小関係はないので <, >, <=, >= や <=> は定義されていません
ライブラリ編

複素数の演算や比較において、実数と複素数の演算や比較も可能です。 この場合、実数は複素数の虚数部が0のものとして扱われます。例えば、以下のような計算が可能です。
ライブラリ編

Numericと、そのサブクラスのメソッドはの実装は均質ではなく、整数だけがビット演算が可能であったり、複素数だけが大小の比較が出来なかったりします。
ライブラリ編

このため実装状況を調べたいのですが、手でテストケースを書くのも手数がかかるので、自動的に表にまとめるプログラムを書いてみました。
ライブラリ編

Rubyでは、文字列(String)はダブルクォート(")で囲まれた文字列リテラルで表します。シングルクォート(')で囲まれた文字列リテラルは、単なる文字列であり、式の展開やエスケープシーケンスの展開が行われません。
ライブラリ編

Rubyでは、ダブルクォートで囲まれた文字列リテラルの中で式を展開することができます。式を展開する場合は、#{}を使います。式を#{}で囲んで文字列中に埋め込むことができます。
ライブラリ編

また、式を展開する場合は、式が評価されてから文字列中に埋め込まれます。そのため、式の中で定義された変数などの値も展開されます。
ライブラリ編

なお、シングルクォートで囲まれた文字列リテラルでは、式の展開は行われず、文字列中にそのまま#{...}が表示されます。
ライブラリ編

以下がRubyで使用できる主なエスケープシーケンスです。
ライブラリ編

なお、Rubyではダブルクォートで囲まれた文字列リテラル内でエスケープシーケンスが展開されますが、シングルクォートで囲まれた文字列リテラル内では展開されません。
ライブラリ編

Rubyにおける「文字リテラル」は、?を前置した1文字で表します。
ライブラリ編

Rubyに文字型はなく、文字リテラルは長さ1文字の文字列です。
ライブラリ編

Ruby では、文字列のエンコーディングを指定することができます。通常、UTF-8 エンコーディングが使われますが、別のエンコーディングを指定することもできます。
ライブラリ編

文字列のエンコーディングを指定するには、文字列の前に encoding: を付けて指定します。例えば、UTF-8 エンコーディングの文字列を扱う場合は以下のように書きます。
ライブラリ編

別のエンコーディングを指定する場合は、指定したいエンコーディング名を文字列で渡します。
ライブラリ編

上記のコードでは、文字列 "こんにちは" が Shift_JIS エンコーディングの文字列として扱われます。
ライブラリ編

文字列のエンコーディングを指定することで、文字列の変換時にエラーが発生することを防ぐことができます。
ライブラリ編

Rubyにおける「正規表現クラス」と「正規表現リテラル」は、文字列をパターンとして表現するための機能です。
ライブラリ編

まず、「正規表現クラス」は Regexp クラスを使用して表現されます。以下のように、Regexp.new メソッドを使用して正規表現を作成することができます。
ライブラリ編

また、正規表現オプションを指定する場合は、第2引数にオプションを渡すことができます。
ライブラリ編

次に、「正規表現リテラル」はスラッシュ / で囲まれた文字列で表現されます。以下のように、スラッシュで正規表現を作成することができます。
ライブラリ編

また、正規表現オプションを指定する場合は、スラッシュの後ろにオプションを付けることができます。
ライブラリ編

正規表現クラスと正規表現リテラルはどちらも同じ機能を持っており、どちらを使用しても正規表現を表現することができます。 ただし、リテラル表現の方が簡潔に表現することができ、可読性が高くなります。
ライブラリ編

Rubyの「シンボル(Symbol)」は、一度定義されたら変更できないイミュータブルなオブジェクトで、文字列に似たデータ型です。シンボルは、コロン(:)の後ろに名前を付けて表します。例えば、:appleや:bananaなどがシンボルの例です。
ライブラリ編

シンボルは、主にキーとして使われることが多く、文字列と比較して以下のようなメリットがあります。
ライブラリ編

シンボルを使う場合、通常はコロン(:)をつけて定義しますが、:"apple"のようにダブルクォーテーション(")で囲って文字列から生成することもできます。また、文字列からシンボルを生成するには、to_symメソッドまたはinternメソッドを使います。
ライブラリ編

例えば、以下のようにハッシュのキーとしてシンボルを使うことができます。
ライブラリ編

Rubyの配列(Array)は、複数の要素を順序付けて格納するためのデータ構造です。配列は、異なるデータ型の要素を混在させることができます。例えば、整数、文字列、オブジェクトなどを含めることができます。
ライブラリ編

Rubyの配列は、角かっこ [ ] で囲まれた要素のコンマ区切りのリストで表されます。以下は、Rubyの配列の例です。
ライブラリ編

配列内の要素は、0から始まるインデックスを使用してアクセスできます。例えば、numbers配列の最初の要素にアクセスするには、numbers[0]とします。
ライブラリ編

Rubyの配列は動的で、サイズを事前に宣言する必要はありません。要素を追加、削除、置換することができます。また、Rubyには多くの配列関連のメソッドが組み込まれており、配列を操作するための便利な機能が提供されています。
ライブラリ編

Rubyの配列には、さまざまな操作が可能です。以下にいくつかの一般的な操作を示します。
ライブラリ編

これらはRubyの配列を操作するための基本的な操作の一部です。Rubyの配列にはさらに多くの機能がありますが、これらの基本操作から始めることができます。
ライブラリ編

Rubyには、複数のメソッドを連鎖して呼び出す「メソッドチェイン」という機能があります。メソッドチェインを使うことで、1つのオブジェクトに対して複数のメソッドを簡潔につなげて処理することができます。
ライブラリ編

例えば、以下のような配列があるとします。
ライブラリ編

この配列に対して、mapメソッドで各要素を大文字にし、さらにjoinメソッドでカンマ区切りの文字列に変換する場合、通常の記法では以下のように書くことができます。
ライブラリ編

しかし、メソッドチェインを使うと以下のように簡潔に書くことができます。
ライブラリ編

さらにブロックにシンボルを使うと以下のように簡潔に書くことができます。
ライブラリ編

このように、複数のメソッドを簡潔につなげて処理することができます。ただし、メソッドチェインは読みやすさを損なうことがあるため、適切に使うようにしましょう。
ライブラリ編

tapメソッドは、オブジェクト自体を受け取り、ブロックをそのオブジェクトのコンテキストで実行し、最終的にそのオブジェクトを返すメソッドです。主な目的は、オブジェクトの特定の状態をデバッグやログ出力などで調査することです。例えば、以下のように使用できます。
ライブラリ編

このコードでは、some_object に対して method1 から method3 までのメソッドを呼び出す前に、tapブロック内でその状態を出力しています。tapメソッドは常にそのオブジェクトを返すため、メソッドチェインを中断することなく、そのまま次のメソッド呼び出しを行うことができます。
ライブラリ編

これらの機能を組み合わせることで、効果的にコードを記述し、デバッグやログ出力などの目的に役立てることができます。
ライブラリ編

Rubyの「ハッシュ(Hash)」は、キー(key)と値(value)のペアを保持するデータ構造であり、連想配列やマップとも呼ばれます。
ライブラリ編

ハッシュは波括弧({})で囲まれたキーと値のペアのリストで表され、キーと値の間には=>を使って対応付けます。例えば、以下のように定義することができます。
ライブラリ編

この場合、my_hashは、"key1"というキーに対応する"value1"、"key2"というキーに対応する"value2"という値を持ちます。
ライブラリ編

ハッシュは、キーを使って値を取得することができます。例えば、上記のmy_hashから値を取得するには、以下のように書きます。
ライブラリ編

また、Hashクラスのeachメソッドを使うことで、ハッシュ内の全てのキーと値に対して繰り返し処理を行うことができます。以下は、my_hashの全てのキーと値を出力する例です。
ライブラリ編

出力結果は以下のようになります。
ライブラリ編

このように、ハッシュはRubyで非常に重要なデータ構造の一つであり、プログラムで様々な用途に利用されます。
ライブラリ編

例えば、以下のようなハッシュを考えます。
ライブラリ編

このハッシュでは、キーとしてシンボルを使っています。ただし、この記法は少し冗長であり、Rubyでは以下のように短縮して書くことができます。
ライブラリ編

このように、キーをシンボルで表す場合は、コロン(:)をキー名の前に付けることで簡潔に表現できます。これにより、より見やすく、読みやすいコードを書くことができます。
ライブラリ編

また、シンボルを使うことで、文字列を使う場合に比べて、ハッシュの検索速度が速くなることがあります。これは、シンボルはRuby内部で一度だけ生成され、それ以降は同じオブジェクトを使い回すため、検索時にオブジェクトの比較を高速に行えるためです。
ライブラリ編

なお、シンボルは、文字列と異なりイミュータブルなオブジェクトであり、文字列と同様に、to_symメソッドを使って文字列からシンボルを生成することもできます。
ライブラリ編

Rubyの「範囲(Range)」は、ある値から別の値までの連続する要素を表すオブジェクトです。Rubyでは、範囲は..または...の範囲演算子を使って作成することができます。以下に例を示します。
ライブラリ編

..を使うと、範囲に終端の値が含まれますが、...を使うと、範囲に終端の値は含まれません。
ライブラリ編

範囲は主に繰り返し処理に使われ、以下のように使うことができます。
ライブラリ編

このコードでは、eachメソッドを使って、範囲内の値を1つずつ取り出し、ブロック内で処理しています。
ライブラリ編

また、範囲を使うことで、配列の一部を切り出すこともできます。例えば、以下のように範囲を使って、配列から一部の要素を取り出すことができます。
ライブラリ編

このように、範囲はRubyで様々な場面で使われ、プログラミングをより効率的に行うための重要な要素の1つです。
ライブラリ編

Rubyにはファイル操作を行う標準ライブラリ File があります。これを使用することで、ファイルの読み込み・書き込み、存在確認・削除、ディレクトリの作成・削除などが簡単に行えます。
ライブラリ編

以下は、ファイル操作の基本的な使い方の例です。
ライブラリ編

RubyのMathモジュールは、数学関数を提供するライブラリです。このモジュールに含まれる関数を使用することで、三角関数、指数関数、対数関数などの計算を簡単に行うことができます。
ライブラリ編

例えば、sin関数を使用する場合は、以下のように記述します。
ライブラリ編

この例では、30度の正弦(sin)を計算しています。Math::PIは円周率を表しており、角度をラジアンに変換しています。
ライブラリ編

他にも、cos関数、tan関数、exp関数、log関数などがあります。詳細は公式ドキュメントを参照してください。
ライブラリ編

Rubyの標準ライブラリには、多数のクラスやモジュールが含まれています。これらのクラスやモジュールは、Rubyプログラムで頻繁に使用される共通機能を提供しています。例えば、文字列(String)クラス、配列(Array)クラス、ファイル操作(File)クラスなどがあります。
ライブラリ編

また、RubyではMix-inという概念もあります。Mix-inとは、あるクラスに他のモジュールを取り込んで機能を追加することです。これにより、クラスを継承することなく、複数のモジュールから機能を組み合わせて利用することができます。
ライブラリ編

例えば、Enumerableモジュールは、Rubyの多くのクラスにEnumerableという機能を提供するためのモジュールです。Enumerableモジュールには、eachメソッドやmapメソッド、selectメソッドなどが含まれており、これらのメソッドを利用することで、配列やハッシュなどのオブジェクトに対して繰り返し処理を簡単に行うことができます。
ライブラリ編

以下に、標準ライブラリからいくつかの代表的なクラスやMix-inを挙げます。
ライブラリ編

これらのクラスやMix-inは、Rubyプログラムの中で頻繁に使用されるため、覚えておくと便利です。詳細は公式ドキュメントを参照してください。
ライブラリ編

RubyのEnumeratorクラスは、反復処理を行うためのクラスです。配列やハッシュなどのオブジェクトに対して繰り返し処理を行うことができます。
ライブラリ編

例えば、以下のようなコードを考えてみましょう。
ライブラリ編

この場合、eachメソッドを使用して、配列の要素を順番に取り出していることがわかります。しかし、この方法では要素の途中で処理を中断したり、要素を複数回利用することができません。
ライブラリ編

ここでEnumeratorクラスを使用すると、以下のように書くことができます。
ライブラリ編

この場合、to_enumメソッドを使用して、Enumeratorオブジェクトを生成しています。そして、nextメソッドを使用して、順番に要素を取り出しています。この方法を使用することで、要素の途中で処理を中断することができますし、要素を複数回利用することもできます。
ライブラリ編

Rubyの%記法は、文字列や正規表現、配列、シンボルなどを作成するための簡潔な書き方のことを指します。%記法を使うことで、コードの可読性を高めることができます。
ライブラリ編

以下に、Rubyの%記法の使い方を表にまとめました。
ライブラリ編

上の例ではパッターンを丸括弧()で囲みましたが、波括弧{}・角括弧[]で囲むことも出来、括弧でない文字(例えば!)で始めたら、同じ文字(この場合は!)で閉じることが出来ます。
ライブラリ編

これらの例では、%記法の丸括弧 ()の部分を、波括弧 {}、角括弧 []、感嘆符 !、縦棒 | に置き換えています。%記法では、括弧以外にも様々な文字を使うことができますが、適切な文字を選んで使用することが重要です。
ライブラリ編

次は、Rubyの標準クラス階層を再帰的に表示するものです。各クラスはその直接のサブクラスとしてインデントされて表示されます。以下に各部分の解説を示します:
ライブラリ編

これはRubyの標準ライブラリで定義されたクラス階層を表しており、各クラスがどのような階層構造にあるかを示しています。
RDoc

RDocとは、Rubyドキュメンテーションの生成ツールであり、Rubyのプログラムに対する文書化を支援するためのツールです。RDocを使用すると、Rubyのプログラムに関する情報をドキュメントとして出力することができます。これにより、ユーザーは作成されたコードを理解するための情報が提供され、開発者は自分たちのコードを文書化することができます。RDocは、Rubyの標準ライブラリに含まれています。
RDoc

RDocは、Rubyのための文書作成システムで、コード内で注釈コメントを書くことで、自動的にドキュメントを生成します。以下はRDocの構文についての解説です。
RDoc

RDocの注釈コメントは、通常のRubyコメントとして記述されますが、一つ上に「#」の代わりに「=begin」と「=end」を使ってマークアップを開始し、終了します。
RDoc

以下は、RDocのマークアップの例です。
RDoc

RDocは、以下の形式のマークアップタグをサポートしています。
RDoc

RDocの実行には、次のコマンドを使用します。
RDoc

オプションには、ドキュメンテーションを生成するFormattersや、ドキュメント化するファイルの指定などが含まれます。namesには、ドキュメンテーションを生成するファイルまたはディレクトリを指定します。
RDoc

以上が、RDocの構文解説です。
附録

Ruby 3.3.0では、多くの重要な変更が導入されました。その中には、言語機能の改善、コアクラスの更新、標準ライブラリの更新、C APIの更新、実装の改善などが含まれます。
附録

これらの変更により、Ruby 3.3.0はより高速で効率的なバージョンになりました。
附録

Ruby 3.2.0では、いくつかの重要な変更と新機能が導入されています。以下に概要を示します:
附録

これらの変更と改善により、Rubyプログラミングのさまざまな側面でパフォーマンス、安定性、機能性が向上しました。ユーザーは、より良いエクスペリエンスと改善されたパフォーマンスのために、Ruby 3.2.0へのアップグレードを検討することが推奨されます。
附録

Ruby 3.1.0の変更点は以下の通りです:
附録

言語の変更点:
附録

C APIの更新、実装の改善、JIT(MJIT、YJIT)、静的解析、デバッガ、エラーハイライト、IRBの自動補完、その他の変更が含まれます。
附録

Ruby 3.0.0には、多くの言語の変更点が含まれています。主な変更点を以下に示します:
附録

これらの変更点は、Ruby 3.0.0で導入された主な機能です。これにより、より安全で効率的なコーディングが可能になり、言語の進化が促進されました。
附録

エラトステネスの篩を、若干 Ruby らしく書いてみました。
附録

最大公約数と最小公倍数を、若干 Ruby らしく書いてみました。
附録

二分法を、若干 Ruby らしく書いてみました。