my.code();

my.code();

  • Python
    • 1.環境構築と基本思想
    • 2.基本構文とデータ型
    • 3.リスト、タプル、辞書、セット
    • 4.制御構文と関数
    • 5.モジュールとパッケージ
    • 6.オブジェクト指向プログラミング
    • 7.ファイルの入出力とコンテキストマネージャ
    • 8.例外処理
    • 9.ジェネレータとデコレータ
  • Ruby
    • 1.rubyの世界へようこそ
    • 2.基本構文とデータ型
    • 3.制御構造とメソッド定義
    • 4.すべてがオブジェクト
    • 5.コレクション (Array, Hash, Range)
    • 6.ブロックとイテレータ
    • 7.クラスとオブジェクト
    • 8.モジュールとMix-in
    • 9.Proc, Lambda, クロージャ
    • 10.標準ライブラリの活用
    • 11.テスト文化入門
    • 12.メタプログラミング入門
  • C++
    • 1.C++の世界へようこそ
    • 2.型システムとメモリ
    • 3.関数と参照
    • 4.ポインタと動的メモリ
    • 5.クラスの基礎
    • 6.クラスを使いこなす
    • 7.継承とポリモーフィズム
    • 8.テンプレート
    • 9.STL ①:コンテナ
    • 10.STL ②:アルゴリズムとラムダ式
    • 11.RAIIとスマートポインタ
    • 12.プロジェクトの分割とビルド

第2章: 基本構文とデータ型 - Rubyの「書き方」

Rubyへようこそ!他の言語の経験がある皆さんなら、Rubyの柔軟で読みやすい構文にすぐに慣れるでしょう。この章では、Rubyの基本的な構成要素を見ていきます。

💎 変数、定数、スコープ

Rubyの変数は型宣言を必要としませんが、変数の「スコープ(可視範囲)」は名前の付け方によって決まります。これは他の言語と大きく異なる点です。

  • ローカル変数: my_var
    • 小文字または _ で始まります。定義されたスコープ(メソッド定義、ブロック、ファイルのトップレベルなど)でのみ有効です。
  • インスタンス変数: @my_var
    • @ で始まります。特定のオブジェクトのインスタンスに属し、そのオブジェクトのメソッド内からアクセスできます。(クラスの章で詳述します)
  • クラス変数: @@my_var
    • @@ で始まります。クラス全体とそのサブクラスで共有されます。(クラスの章で詳述します)
  • グローバル変数: $my_var
    • $ で始まります。プログラムのどこからでもアクセス可能ですが、グローバルな状態を持つため、使用は最小限に抑えるべきです。
  • 定数: MY_CONSTANT
    • 大文字で始まります。一度定義すると変更すべきではない値を示します(技術的には変更可能ですが、Rubyが警告を出します)。

🔢 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では、これらすべてが「オブジェクト」であり、メソッドを持っています。

🚫 重要: nil と false の扱い

Rubyの条件分岐(if文など)において、偽 (falsey) として扱われるのは nil と false の2つだけです。

これは非常に重要です。C言語やJavaScriptなどの 0、空文字列 ""、空配列 [] が偽として扱われる言語とは異なります。Rubyでは、これらはすべて真 (truthy) として扱われます。

truthy_check.rb
ruby truthy_check.rb

💬 重要: シンボル (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では、メソッドを呼び出す際の括弧 () を省略できます(ただし、曖昧さが生じない場合に限ります)。

括弧を省略するとコードが読みやすくなる場合がありますが、メソッドチェーンが続く場合や、引数が複雑な場合は括弧を付けた方が明確です。

📜 文字列操作と式展開

Rubyの文字列は強力で、特に「式展開」は頻繁に使われます。

  • シングルクォート ('...'): ほぼそのまま文字列として扱います。\n(改行)などのエスケープシーケンスや式展開は解釈されません(\' と \\ を除く)。
  • ダブルクォート ("..."): エスケープシーケンス(\n, \t など)を解釈し、式展開 (Interpolation) を行います。

式展開は #{...} という構文を使い、... の部分でRubyのコードを実行し、その結果を文字列に埋め込みます。

📝 この章のまとめ

  • Rubyの変数は、先頭の記号 (@, @@, $) によってスコープが決まる。
    • false と nil のみが偽 (falsey) であり、0 や "" も真 (truthy) として扱われる。
    • シンボル (:name) はイミュータブルで一意な「名前」を表し、主にハッシュのキーや識別子として使われる。
    • メソッド呼び出しの括弧は、曖昧さがない限り省略できる。
    • ダブルクォート文字列 ("...") は式展開 #{...} をサポートする。

練習問題1: 式展開とデータ型

ユーザーの名前(name)と年齢(age)を変数に代入してください。 次に、"#{...}"(式展開)を使い、「(名前)さんの年齢は(年齢)歳です。5年後は(5年後の年齢)歳になります。」という文字列を出力するスクリプトを作成してください。

practice2_1.rb
ruby practice2_1.rb