はじめに
Qiita記事シリーズ「5つの記事でバックエンドがわかる!?」の第2回へようこそ!
前回は、バックエンドの基本的な役割やフロントエンドとの連携、そしてフロントエンドエンジニアがバックエンドを学ぶメリットについて解説しました。Webアプリケーションの「裏側」がどのように動いているのか、少しイメージが湧いてきたのではないでしょうか。
今回は、いよいよ具体的なバックエンド技術に触れていきます。バックエンド開発で非常に人気のあるプログラミング言語の一つである「Ruby」に焦点を当てます。Rubyは、そのシンプルで直感的な文法と、強力なWebフレームワークであるRuby on Railsの存在により、多くの開発者に愛されています。特に、フロントエンドエンジニアの皆さんにとっては、JavaScriptとは異なるパラダイムを学ぶ良い機会となるでしょう。
この回では、Rubyの基本的な文法から開発環境の準備、簡単なスクリプトの作成までを学び、バックエンド開発の第一歩を踏み出しましょう。JavaScriptの知識がある方には、RubyのコードがどのようにJavaScriptと異なるのか、あるいは共通点があるのかを意識しながら読み進めていただくと、より理解が深まるはずです。
1. Rubyの基本的な文法と特徴:JavaScriptとの比較も交えて
Rubyは「開発者の生産性を高めること」を重視して設計されたオブジェクト指向スクリプト言語です。シンプルで読みやすい文法が特徴で、初心者にも学習しやすい言語として知られています。JavaScriptも柔軟な言語ですが、Rubyはより「オブジェクト指向」が徹底されている点が特徴です。
Rubyの主な特徴
-
純粋なオブジェクト指向: Rubyでは、数値や文字列、真偽値など、すべてのものがオブジェクトです。JavaScriptではプリミティブ型とオブジェクト型がありますが、Rubyでは一貫してオブジェクトとして扱われます。これにより、コードの再利用性や保守性が高まります。
-
シンプルで読みやすい文法: 自然言語に近い記述が可能で、直感的にコードを理解しやすいです。セミコロン(
;)や括弧(())の省略が可能な場合が多く、JavaScriptよりも簡潔に書けることがあります。 -
高い生産性: 少ないコード量で多くの処理を記述でき、開発効率が良いです。これは、後述するRuby on Railsの「設定より規約(Convention over Configuration)」の思想にも繋がります。
-
強力なコミュニティと豊富なライブラリ(Gem): 活発なコミュニティがあり、様々な用途に対応する豊富なライブラリ(Gem)が提供されています。これはJavaScriptにおけるnpmパッケージのようなものです。
基本的な文法:JavaScriptとの比較
変数とデータ型
Rubyでは、変数に値を代入する際に型宣言は不要です。代入された値によって自動的に型が決定されます。JavaScriptのletやconstのようなキーワードは不要です。
# Ruby
number = 100
message = "Hello, Ruby!"
fruits = ["apple", "banana", "orange"]
person = { name: "Alice", age: 30 }
puts number # => 100
puts message # => Hello, Ruby!
puts fruits # => ["apple", "banana", "orange"]
puts person # => {:name=>"Alice", :age=>30}
// JavaScript
let number = 100;
let message = "Hello, JavaScript!";
let fruits = ["apple", "banana", "orange"];
let person = { name: "Alice", age: 30 };
console.log(number); // => 100
console.log(message); // => Hello, JavaScript!
console.log(fruits); // => ["apple", "banana", "orange"]
console.log(person); // => { name: 'Alice', age: 30 }
条件分岐 (if/else)
Rubyのif文は、JavaScriptのそれと似ていますが、括弧が不要でendでブロックを閉じます。
# Ruby
age = 20
if age >= 20
puts "成人です"
else
puts "未成年です"
end
# => 成人です
// JavaScript
let age = 20;
if (age >= 20) {
console.log("成人です");
} else {
console.log("未成年です");
}
// => 成人です
繰り返し (each/for)
Rubyではeachメソッドがよく使われます。JavaScriptのforEachやfor...ofループに似ています。
# Ruby (each)
fruits = ["apple", "banana", "orange"]
fruits.each do |fruit|
puts fruit
end
# => apple
# => banana
# => orange
// JavaScript (forEach)
let fruits = ["apple", "banana", "orange"];
fruits.forEach(fruit => {
console.log(fruit);
});
// => apple
// => banana
// => orange
メソッド(関数)の定義
Rubyではdefキーワードを使ってメソッドを定義します。JavaScriptの関数定義と似ていますが、returnを明示的に書かない場合、最後に評価された値が返されます。
# Ruby
def greet(name)
"Hello, #{name}!"
end
puts greet("Bob") # => Hello, Bob!
// JavaScript
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet("Bob")); // => Hello, Bob!
2. 開発環境の準備:バックエンド開発のスタートライン
Rubyでの開発を始めるには、まずRubyの実行環境をセットアップする必要があります。フロントエンド開発でNode.jsのバージョン管理にnvmを使うように、RubyにはrbenvやRVMといったバージョン管理ツールがあります。これにより、プロジェクトごとに異なるRubyバージョンを簡単に切り替えることができます。
rbenvのインストール
rbenvは、複数のRubyバージョンを切り替えて利用するためのツールです。フロントエンド開発でnvmを使っている方には、同様の感覚で使えるでしょう。
macOS/Linuxの場合
# rbenvとruby-build (rbenvのプラグイン) をインストール
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
# シェルにrbenvを読み込む設定を追加 (例: ~/.bash_profile, ~/.zshrc)
# ~/.zshrc を使っている場合は以下を実行
echo 'eval "$(~/.rbenv/bin/rbenv init - bash)"' >> ~/.bashrc
source ~/.zshrc
Rubyのインストール
rbenvを使って、任意のRubyバージョンをインストールします。最新の安定版をインストールするのが良いでしょう。
# 利用可能なRubyバージョンを確認
rbenv install -l
# 最新の安定版Rubyをインストール (例: 3.2.2)
rbenv install 3.2.2
# インストールしたRubyをグローバルに設定
rbenv global 3.2.2
# 現在のRubyバージョンを確認
ruby -v
Bundlerのインストール:npmやYarnのようなもの
Bundlerは、Rubyプロジェクトの依存関係(Gem)を管理するためのツールです。これはJavaScriptプロジェクトにおけるpackage.jsonとnpmやYarnのような役割を果たします。プロジェクトに必要なGemとそのバージョンをGemfileに記述し、bundle installコマンドで一括インストールできます。
# Bundlerをインストール
gem install bundler
# Bundlerのバージョンを確認
bundler -v
3. 簡単なRubyスクリプトの作成と実行:Hello Worldから
環境が整ったところで、実際にRubyスクリプトを作成して実行してみましょう。フロントエンドでconsole.log()を使うように、Rubyではputsを使ってコンソールに出力します。
-
ファイルを作成:
hello.rbという名前のファイルを作成し、以下のコードを記述します。# hello.rb puts "Hello from Ruby!" -
スクリプトを実行: ターミナルでファイルがあるディレクトリに移動し、以下のコマンドを実行します。
ruby hello.rb実行結果:
Hello from Ruby!
これで、Rubyスクリプトの作成と実行ができました。非常にシンプルですね!
4. オブジェクト指向プログラミングの基礎:JavaScriptとの違いを意識する
Rubyは純粋なオブジェクト指向言語であり、その理解はRubyを深く学ぶ上で不可欠です。JavaScriptもオブジェクト指向の概念を持ちますが、Rubyはよりクラスベースのオブジェクト指向が明確です。ここでは、オブジェクト指向の基本的な概念である「クラス」と「インスタンス」について簡単に触れておきます。
-
クラス: オブジェクトの設計図やひな形です。「どんなデータ(属性)を持ち、どんな振る舞い(メソッド)をするのか」を定義します。JavaScriptのクラス構文と似ています。
-
インスタンス: クラスという設計図から実際に作られた「実体」です。それぞれのインスタンスは、独自のデータを持つことができます。
# Ruby: Personクラスの定義
class Person
# コンストラクタ(初期化メソッド)
def initialize(name, age)
@name = name # @nameはインスタンス変数
@age = age
end
# メソッド
def introduce
puts "私の名前は#{@name}です。#{@age}歳です。"
end
end
# Personクラスからインスタンスを作成
alice = Person.new("Alice", 30)
bob = Person.new("Bob", 25)
# インスタンスのメソッドを呼び出す
alice.introduce # => 私の名前はAliceです。30歳です。
bob.introduce # => 私の名前はBobです。25歳です。
// JavaScript: Personクラスの定義
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
introduce() {
console.log(`私の名前は${this.name}です。${this.age}歳です。`);
}
}
// Personクラスからインスタンスを作成
const alice = new Person("Alice", 30);
const bob = new Person("Bob", 25);
// インスタンスのメソッドを呼び出す
alice.introduce(); // => 私の名前はAliceです。30歳です。
bob.introduce(); // => 私の名前はBobです。25歳です。
Rubyのインスタンス変数は@で始まるなど、JavaScriptとは異なる記法がありますが、概念としては非常に似ていることがわかるでしょう。このように、クラスを定義することで、共通の性質を持つオブジェクトを効率的に作成・管理できます。これは、大規模なアプリケーション開発において非常に重要な概念となります。
まとめ
今回は、Qiita記事シリーズ「5つの記事でバックエンドがわかる!?」の第2回として、Rubyの基本的な文法、開発環境の準備、簡単なスクリプトの作成、そしてオブジェクト指向プログラミングの基礎について、JavaScriptとの比較も交えながら学びました。
Rubyは、その高い生産性と読みやすい文法から、バックエンド開発の入門言語として非常に優れています。今回学んだ内容を基に、ぜひ実際に手を動かしてRubyに慣れ親しんでみてください。JavaScriptの知識がある皆さんなら、Rubyの学習もスムーズに進められるはずです。
次回は、いよいよRubyの強力なWebフレームワークである「Ruby on Rails」に焦点を当て、Webアプリケーションの骨格となるMVCモデルや基本的な構造について詳しく解説していきます。フロントエンドの皆さんが普段触れているWebサイトが、バックエンドでどのように構成されているのか、その全体像が見えてくるはずです。お楽しみに!
※第3回はこちら