Rubyへようこそ!他の言語の経験がある皆さんなら、Rubyの柔軟で読みやすい構文にすぐに慣れるでしょう。この章では、Rubyの基本的な構成要素を見ていきます。
Rubyの変数は型宣言を必要としませんが、変数の「スコープ(可視範囲)」は名前の付け方によって決まります。これは他の言語と大きく異なる点です。
my_var
_ で始まります。定義されたスコープ(メソッド定義、ブロック、ファイルのトップレベルなど)でのみ有効です。@my_var
@ で始まります。特定のオブジェクトのインスタンスに属し、そのオブジェクトのメソッド内からアクセスできます。(クラスの章で詳述します)@@my_var
@@ で始まります。クラス全体とそのサブクラスで共有されます。(クラスの章で詳述します)$my_var
$ で始まります。プログラムのどこからでもアクセス可能ですが、グローバルな状態を持つため、使用は最小限に抑えるべきです。MY_CONSTANT
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には多くの組み込みデータ型がありますが、まずは基本的なものを押さえましょう。
1, 100, -5, 1_000_000 ( _ は読みやすさのためのもので、無視されます)1.5, 3.14, -0.001"Hello", 'World'true, falsenil (何も存在しないことを示す唯一の値)[1, "apple", true]{"key1" => "value1", :key2 => "value2"}:my_symbol (後述します)Rubyでは、これらすべてが「オブジェクト」であり、メソッドを持っています。
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
Rubyの条件分岐(if文など)において、偽 (falsey) として扱われるのは nil と false の2つだけです。
これは非常に重要です。C言語やJavaScriptなどの 0、空文字列 ""、空配列 [] が偽として扱われる言語とは異なります。Rubyでは、これらはすべて真 (truthy) として扱われます。
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 truthy_check.rb[false] は偽 (falsey) です。
[nil] は偽 (falsey) です。
---
[true] は真 (truthy) です。
[0 (Integer)] は真 (truthy) です。
[1 (Integer)] は真 (truthy) です。
[空文字列 ""] は真 (truthy) です。
[文字列 "abc"] は真 (truthy) です。
[空配列 []] は真 (truthy) です。
[空ハッシュ {}] は真 (truthy) です。シンボルは、他の言語の経験者にとってRubyの最初の「つまずきポイント」かもしれません。
シンボルはコロン ( : ) で始まります(例: :name, :status)。
文字列 (String) とシンボル (Symbol) の違い:
"hello"[0] = "H" は可能ですが、 :hello に対してこのような操作はできません。主な用途:
user = { name: "Alice", age: 30 } (これは { :name => "Alice", :age => 30 } のシンタックスシュガーです)status = :pending, status = :completed のように、固定された「名前」や「状態」を表すのに使われます。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では、メソッドを呼び出す際の括弧 () を省略できます(ただし、曖昧さが生じない場合に限ります)。
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のコードを実行し、その結果を文字列に埋め込みます。
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! "
@, @@, $) によってスコープが決まる。
false と nil のみが偽 (falsey) であり、0 や "" も真 (truthy) として扱われる。:name) はイミュータブルで一意な「名前」を表し、主にハッシュのキーや識別子として使われる。"...") は式展開 #{...} をサポートする。ユーザーの名前(name)と年齢(age)を変数に代入してください。
次に、"#{...}"(式展開)を使い、「(名前)さんの年齢は(年齢)歳です。5年後は(5年後の年齢)歳になります。」という文字列を出力するスクリプトを作成してください。
ruby practice2_1.rb