Rubyの概要

翻訳者: Kengo Nishimura, @sontixyou

Rails Girlsワークショップでは、特にプログラミング言語Rubyを扱います。アプリを実行するRailsフレームワークは、Rubyで記述されています。これを変更するには Rubyコードを書く必要があります。

Ruby は開発者の利便性を考慮して最適化された言語です。しかし、他の言語と同様に慣れるまでに時間がかかります。

プログラミングでは、アプリを構築する方法には様々なものがあります。このガイドでは、アプリを作成するために必要なRubyの概念の一部に焦点を当てます。これまでにRubyのコードを書いたことがない方を前提としています。このワークショップの後でさらに詳しく知りたい場合は、ほかにたくさんの教材があります。コーチかオーガナイザーに聞いてください。

Hello world

優れたアプリはすべて「Hello world!」という起点で始まります。最初のコードを書くと、コードが挨拶をしてくれます。

PC上に新しいファイルを作成します。ファイル名はapp.rbと名前をつけます。作成するディレクトリはどこでも大丈夫ですが、作成した場所を覚えておいてください。拡張子の.rbは、あなた、あなたの(将来の)チーム、およびコンピューターに、それがどのような種類のファイルであるかを伝えます。つまり、app.rbはRubyプログラムです。

app.rbファイルには Rubyコードを記述できます。テキストエディタでファイルを開きます。まず、以下の小さな例を新しいファイルにコピーし、ファイルを保存します。

puts "Hello world!"

このアプリでは、なにかをputsします。つまり、ターミナルに何かしらのデータを出力します。この場合、文字列「Hello world!」です。文字列は二重引用符 (") または一重引用符 (') で囲みます。

ターミナルでは、次のコマンドを使用してこのアプリを実行できます。

ruby app.rb

先程のapp.rbファイルを作成した時と同じディレクトリにいることをターミナルで確認してください。(rubyとターミナルで打ってから、app.rbファイルをターミナルへドラッグしてください。これにより、ファイルパスがターミナルのコマンドに追加されます。)

正常に実行された場合は、ターミナルに次の出力が表示されるはずです。

Hello world!

あなたのアプリが挨拶してくれています!

計算してみよう

アプリをより動的にするために、数値の計算を実行できます。

puts 100 + 23
# 123

Rubyアプリの実行方法についての簡単な説明: 上記のような例が表示されるたびに、コードをローカルファイルapp.rbまたは新しいファイルにコピーして実行できます。次に、rubyコマンドとファイル名を指定して実行して、出力を確認します。例えば:ruby app.rb

コメントに関する簡単な説明: コード例にハッシュタグ記号 (#) (数字またはポンド記号とも知られている) が表示されている場合、それ以降はすべてコメントとみなされます。コメントはプログラム内でRubyのコードとして実行されません。# some textというテキスト行が表示されている場合、これは何が起こっているかを説明するためのものであり、アプリのコードから除外できます。出力結果やコード行の結果を示します。また、コード例自体で特定のコードが何を行っているかを説明するためにも使用されます。コードの動作を妨げることもありません。

計算を実行する他のいくつかの方法を以下に示します。

puts 100 - 30
# 70

puts 5 * 10
# 50

puts 10 / 5
# 2

ターミナルで、次のコマンドを使用してアプリを実行します。さまざまな計算結果が、複数行に分かれて表示されるはずです。

ruby app.rb

変数

アプリは、データを処理または変更するときにデータを移動します。データは「変数」に代入できます。変数はデータを保持し、コンピューターのメモリ内の場所を指します。アプリで変数を参照する時に、コンピューターのメモリ内のデータにアクセスします。

以下の例では、 greetingという名前の変数を定義するようにコードが変更されています。greeting =という文法が等号の記号で終わっています。このことから、greetings変数に「Hello your name here」を代入していることがわかります。変数はなんらかのデータを保持するものです。この場合は文字列の「Hello your name here」です。この変更したアプリを実行すると「Hello your name here」と出力されます。

greeting = "Hello your name here"
puts greeting

自分で考えた文字列を出力するためには、引用符 (") の間の文字列を変更します。

if文

アプリケーションの処理の流れを制御する方法は、if文を使用することです。これらは、1つまたは複数の条件に基づいて何らかの処理を実行するコード内の条件分岐です。

ifキーワードを使用すると、条件がtrueかどうかを確認できます。以下の例では、大なり記号 (>) を使用して、一方の値が他方の値より大きいかどうかを確認します。

if 20 > 10 # もし、20が10より大きい場合
  puts "20 is larger than 10"
end

if文はifendキーワードで構成されます。ifキーワードはif文を開始し、endキーワードはif文を閉じます。ifendキーワードの間にあるコードの各行は、ifキーワードの後に書かれている条件がtrueの場合に、Rubyが実行するものです。

値を確認するにはいくつかの方法があり、その例をいくつか示します。

# 2つの文字列を比較します
if "Matz" == "Matz"
  # 文字列が一致する場合、ここに書かれているコードを実行します
  # == は2つの文字列が合致しているかを確認する記号です
end

if "Jim" != "Jane"
  # 文字列が一致しない時に、ここに書かれているコードを実行します
  # != は2つの文字列が合致しないかを確認する記号です
end

上記の例では文字列を直接使用しており、文字列は変更されないため、if文は実際には必要ありません。現実の世界では、if文で変数を使うことがほとんどでしょう。これらの変数の値は、ユーザー入力に基づいています。

value1 = 20
value2 = 10
if value1 > value2
  puts "value1 is larger than value2"
end

if文の条件が一致しない場合は、他の動作を実行することもできます。

if value1 > value2
  puts "Yes"
else
  # このコードはif文の条件がtrueでない時に、実行されます
  puts "No"
end

同じif文内で、さらに多くの条件分岐を作成することもできます。

if value1 == value2
  puts "The values match exactly"
elsif value1 > value2
  puts "value1 is bigger than value2"
else
  puts "value1 is smaller than value2"
end

メソッド

アプリのコードを整理する方法のひとつとして、メソッドを使用する方法があります。メソッドは、再利用可能なコードのブロックです。指定した名前で呼び出すことができます。

以下の例では、say_helloと呼ばれるメソッドがdefキーワード(”define”という意味)と共に、定義されています。メソッドの終了はendキーワードで示されます。このメソッドが呼び出されると、defキーワードで始まる行とendキーワードを含む行の間のすべてが実行されます。

def say_hello
  puts "Hello world!"
end

メソッド定義自体は何も行いません。このメソッドはまだ呼び出されておらず、挨拶は出力されません。

次のように、その名前を使用してメソッドを呼び出すことができます。

say_hello
# Hello world

一度定義したメソッドは何度でも呼び出すことができます。これにより、アプリ内で手軽に同じことを何度も実行できるようになります。

say_hello
# Hello world
say_hello
# Hello world
say_hello
# Hello world

メソッドの戻り値

メソッドは、メソッドの最後の行にあるコードの値を返します。メソッドが常にターミナルへ結果を出力させたくない場合は、代わりに結果を返すことができます。

def say_hello
  "Hello world!"
end

戻り値を出力するには、次のようにsay_helloメソッドの戻り値をputsメソッドに渡す必要があります。

puts say_hello

Rubyコードの書き方として、最も一般的なのものは、戻り値に対して他の処理を実行することです。戻り値を出力するだけではありません。ほとんどのアプリでは、値をputsメソッドで常に表示したりする必要はありません。このガイドでは、あくまでも説明のために、このような使い方をしています。

メソッド引数

メソッドをより動的にするためには、引数を使用してメソッドを定義します。次に、それを呼び出すときに、表示させたい文字列を引数として渡します。

def say_hello(your_name)
  "Hello #{your_name}!"
end

puts say_hello("Your name")
# "Hello Your name"

say_helloメソッドが呼び出される時に、「Your name」の文字列はsay_helloメソッド内の変数your_nameになります。これはdef say_hello(your_name)メソッドを定義している行で確認できます。括弧内のyour_nameは変数名です。次にputsの行ではsay_helloメソッドを組み合わせています。

#シンボルの使用法に関する簡単な説明: 以前、このガイドでは、ハッシュタグのシンボルはコメントを示すために使用されると説明しました。これには、いくつかの例外がありますが、最も一般的な例外は2つの文字列を結合することです。二重引用符(")で囲まれた文字列と中括弧({})と組み合わせて、変数を別の文字列に挿入できます。"Text #{variable}"

メソッドの呼び出し方法が変更され、メソッドの引数を括弧で囲むようになったことがわかります。引数を指定しない場合は、括弧を省略できます。

def say_hello_without_parameter
  "Hello world!"
end

# どちらの方法でもメソッドを呼び出すことができます
puts say_hello_without_parameter
puts say_hello_without_parameter()

メソッドには複数の引数を定義できます。すべての引数名の間にカンマを使用します。引数は順番に追加され、そのまま参照できます。最初に指定した値がメソッドの最初の引数になります。

def say_hello_and_hobby(your_name, your_hobby)
  "Hello #{your_name}! Your hobby is: #{your_hobby}"
end

puts say_hello_and_hobby("Your name", "tennis")
# "Hello Your name! Your hobby is: tennis"

puts say_hello_and_hobby("Yukihiro Matsumoto", "writing Ruby code")
# "Hello Yukihiro Matsumoto! Your hobby is: writing Ruby code"

異なる引数を指定してメソッドを呼び出すと、出力される文字列が変更されます。

クラス

Rubyコードを整理する次のステップは、クラスを使用することです。クラスを定義すると、同じトピックに関連する複数のメソッドをグループ化できます。クラスがどのように機能するかを説明するために、メソッドのないクラスから始めます。

以下の例には、 Greeterというクラスがあります。このクラスを使用するには、クラスのnewメソッドを使用して初期化します。Object.methodというドット表記を使用して、クラスのメソッドを呼び出したいことをRubyに伝えます。以下の例では、newというメソッドを呼び出しています。

class Greeter
end

Greeter.new

このクラスはまだ何も実行していないので、メソッドを追加しましょう。以下の例では、say_helloメソッドがクラスに追加されています。class Greeterと最後のendの間に、メソッドを追加します。次に、Greeterクラスのインスタンスをgreeter =で変数に代入します。次の行では、クラスインスタンスを指す変数greeterが、say_helloメソッドを呼び出していることがわかります。

class Greeter
  def say_hello
    "Hello world"
  end
end

greeter = Greeter.new
puts greeter.say_hello
# "Hello world"

値と変数に対するメソッドの呼び出し

Rubyのいかなるものはオブジェクト、クラス、またはクラスのインスタンスです。つまり、それらのオブジェクトはメソッドを呼び出すことができます。「Hello world」という文字列はオブジェクトであり、数値10trueもオブジェクトです。

Rubyには、すでにメソッドが定義されているさまざまなタイプのオブジェクトがあります。以下の例では、Rubyに「Hello world」という文字列の文字数を計算させます。結果は11です。

puts "Hello world".length
# 11

ドット表記を使用して、Rubyに値に対してメソッドを呼び出すことを伝えます この場合はlengthです。

最初に文字列を変数に代入してから、その変数からメソッドを呼び出すこともできます。この場合、変数textに対してlengthメソッドを呼び出します。

text = "Hello world"
puts text.length
# 11

これらのメソッドの中には引数を受け付けるものもあります。以下の例では、変数textに代入されている値を変更して、異なるものを出力します。例えば、以下のコードを実行すると、変数greeting内の「Hello」が「Hi there」に置き換えられます。

text = "Hello your name here"
puts text.sub("Hello", "Hi there")
# "Hi there your name here"

Rubyには多くの組み込みメソッドがあり、あらゆる種類の操作を行うことができます。いくつかの例を以下に示します。

puts "Hello world".upcase # 全ての文字を大文字にします
# HELLO WORLD

puts "Hello world".reverse # 文字を逆順に並び替えます
# dlrow olleH

puts "Hello world".count("l") # lが何個文字列に含まれているかをカウントします。
# 3

クラスインスタンス変数

前に作成した独自のGreeterクラスに戻りましょう。前にメソッドに引数を追加しました。今度はクラスに引数を追加しましょう。

greeter = Greeter.new("students")
puts greeter.say_hello
# Hello students!

say_helloメソッドと同様に、このnewもメソッドです。オブジェクトである文字列"students"が与えられます。このnewメソッドは少し異なり、最終的にGreeterクラスのinitializeメソッドを呼び出します。

class Greeter
  def initialize(name)
    @name = name
  end

  def say_hello
    puts "Hello #{@name}!"
  end
end

上の例では、何か新しいことに気づくでしょう。変数は2種類あります。メソッドの引数nameと変数@nameに分けることができます。後者の変数はインスタンス変数と呼ばれます。@記号で、インスタンス変数であることを認識できます。インスタンス変数は、通常の変数では不可能なクラス全体を通して参照することができます。通常の変数は、宣言したメソッドのコンテキスト内でのみ参照できます。Greeter クラスのinitializeメソッドで宣言すると、後のsay_helloメソッド内で参照することできます。

ループ

最後のトピックでは、ループについて簡単に説明します。ループは、異なる値に対して同じコードを実行する方法です。以下の例に示すように、複数の人に挨拶することができます。

names = ["students", "Rails Girls", "coaches"]
names.each do |name|
  greeter = Greeter.new(name)
  puts greeter.say_hello
end

このnamesリストは配列と呼ばれます。いくつかの文字列を囲む角括弧によって、配列であると認識できます。配列内の要素はカンマで区切られます。配列namesに対してeachメソッドを呼び出すことにより、配列内の各要素に対してコードのブロックを実行できます。

Rubyではブロックがよく出てきます。これらは、name.each doの中のdoキーワードによって認識できます。ブロック引数の見た目は少し異なり、かっこの代わりに、 |のようなパイプシンボルと呼ばれるものが使用されます。今回は|name|。ブロックが複数回呼び出されると、ループが呼び出されるたびに変数nameの値が変化します。最初は「students」、次に「Rails Girls」、最後に「coaches」になります。

このアプリの出力は、次のようになります:

Hello students!
Hello Rails Girls!
Hello coaches!

組み込みルビー(ERB)

Railsアプリを作成するときは、ERB (Embedded Ruby) に遭遇するでしょう。これはRubyの少し異なる書き方です。この書き方のRubyはHTMLファイルに埋め込まれています。これは、Rails プリが Web ページ上のコンテンツを動的に表示するのに役立ちます。

.erbで終わるファイル拡張子でERBであることがわかります。ちゃんとファイル名を書くと、ファイル名は、index.html.erbのようになります。

ERB ファイルには HTML タグがあります。これらは、小なり記号(<)で始まり、大なり記号(>)で終わる行によって識別できます。これらの記号の間の文字は、ページがレンダリングする要素のタイプを示します。段落の場合は「p」、リンクの場合は「a」、画像の場合は「img」、画像の場合は「ul」または「ol」です。他に多くの種類の要素があります。各要素には、次のような開始タグ<p>と、スラッシュ記号を含む終了タグ</p>があります。これらの要素を別の要素にネストして、このような Web ページを作成できます。

<p>I am a paragraph</p>

<p>
  <a href="https://guides.railsgirls.com/">I am a link!</a>
</p>

<div>
  <h1>I am a heading</h1>
  <p>
    I am a piece of text with
    <a href="https://guides.railsgirls.com/">a link</a>.
  </p>
</div>

ERB 登場するのは、ページ内容を動的に表示させることです。たとえば、Google.comで検索フレーズを入力すると、フレーズごとに異なる結果が表示されます。これはERBなどの言語で行われます。ERBは Rubyアプリで使用される方法の1つです。

以下のコード例では、ループを使用してアイデアのリストを表示します。ERB要素は同じ HTML記号で認識できますが、パーセント記号 (<%および%>)も含まれています。ページ上に何かを表示したい場合は、パーセント記号と等号を備えた開始タグ<%=を使用します。

<% @ideas.each do |ideas| %>
  <p><%= item.title %></p>
<% end %>

出力は次のようになります。

<p>Flying car</p>
<p>Hoverboard</p>
<p>Time travel</p>

ERB の仕組みに関する簡単なリファレンス:

# Rubyのコードで処理させたいときは、<%  %>を使います
<% Ruby code here %>

# if文の例
<% if a > b %>
  Show something if a is larger than b
<% end %>

# ループの例
<% @ideas.each do |ideas| %>
  <p><%= item.title %></p>
<% end %>

# Webページに文字列を出力する場合、<%=  %> を使用します
<%= variable_name %>
<%= object.method_name %>
<%= item.title %>

次のステップ

これで、Rubyの概要を読み終わりました。このガイドではすべてを説明できているわけではありませんが、Ruby言語の構文については理解しておく必要があります。

RubyとRubyがサポートするさまざまな種類のデータについて詳しく知りたいですか? TryRubyでRubyを試してください。

代わりにアプリの作業を続行したい場合は、メインガイドに従ってください。


もっと学びたいですか? 他のガイドも見てみましょう!