Make the Most of IT.

お酒と映画が好きなJava屋さんがRubyとか学んだこと感じたことをつらつらと

Ruby勉強します #Ruby基本・データ型編

はじめに

業務ではもっぱらJavaを使っていますが、他の言語も学んでみたいなってことでRubyを学んでみようと思います。

Rubyを勉強するために色々な参考書があったのですが、各所で絶賛されていた伊藤淳一さん(@jnchito)の「プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発デバッグ技法まで 」をもとに勉強してみます。

今日はまず第2章で取り上げられていたデータ型についてまとめてみたいと思います。普段はJava屋さんなのでJavaとの違いを織り交ぜながらまとめていければ。。。

Rubyの基本

すべてがメソッド

Rubyは数値から文字列、真偽値やnil (Javaで言うところのnull) まで全てがオブジェクト、つまりメソッドを呼び出すことができます。

つまりこう言うことができます。

#数値を文字列へ
1.to_s     # => "1"

#trueを文字列へ
true.to_s  # => "true"

#nilを文字列へ
nil.to_s   # => "nil" 

メソッドの呼び出し方

Javaでは考えられないメソッドの呼び方です! これだけでRubyって面白い!ってなってしまいました。

また、メソッドの呼び出し方も比較的自由担っています。 引数の括弧を外すことができるだけでなく、引数がなければメソッド名だけでメソッドを呼び出すことができるのです。 一般的にはどの呼び出し方が浸透しているんでしょうか。 Java屋さんからすると括弧があった方がしっくりきますが括弧は無い方が見やすかったりするんでしょうか。

文の区切り

Javaでは文末にセミコロンがないと文が終わってないとみなされ、コンパイルエラーが出ていました。Java習いたての頃は結構セミコロンがなくてコンパイル通らないってことがありましたよね。

でもRubyではセミコロンなしで改行するだけで文の区切りと見なされます。 一応セミコロンも使用する事ができ、1文に複数の文を入れたい場合に、文ごとの区切りとして使用されます。

#セミコロンで1文に複数文を入れる
1.to_s; 10.to_s(16)

変数宣言

RubyJavaと異なり、動的型付けで変数名の前に型を書くことはありません。 静的型付けで慣れてる僕からしてみると、この変数にどんな型のデータが入ってくるか宣言箇所を見るだけではわからないんじゃないの?と思ってしまいました。

また、Rubyはスネークケースで書きます。これもキャメルケースで書くJavaとの違いですね。 キャメルケースで書いてもエラーとなることはないようですが、一般的ではないようです。 少しずつ慣れていかなければ。。。

文字列

文字列はシングルクォート (') およびダブルクォート (") で囲みます。ダブルクォートで囲むことで式展開を行うことができます。 JavaではString.format()を使用することで式展開を行なっていましたが、Rubyでは特にメソッドを使用することなく式展開を行うことができるんですね。 普段は文字列の中に変数を埋め込む時は+を使って結合していたんですが、どうやら可読性が良くないみたいですね。。。 式展開に徐々に慣れていこうと思います。

name = 'Alice'
puts "Hello,#{name}!"  # => Hello,Alice!

数値

RubyにはJavaでの++のようなインクリメント演算子はありません。その代わり+=や-=を使用します。 この記法はJavaでもあったので馴染みがありますね。

真偽値

Rubyの真偽値はfalseまたはnil以外はすべて真となります。 if文の条件判断にtrueはもちろんのこと、数値や文字列が渡されても真となると言うことです。

Javaではtrueとfalseでの条件分岐しか行なって来なかったのでこれはかなりのカルチャーショックです。慣れるまでif文の解読に苦労しそう。。。

if文

条件分岐の記法がJavaと少しだけ違います。 それは「else if」を「elsif」と記述すること。 「else」の末尾「e」がなくなっています。 いつもの癖でついeを書いてエラーになる未来が今から見えます。

メソッド定義

メソッドを定義する時は頭にdefをつけて、終わりにはendをつけて宣言します。また、メソッドも変数宣言と同じくスネークケースで記述します。

def add(a, b)
  a + b
end

変数宣言時でもそうでしたが、ここでも動的型付けとなっています。 上記メソッド宣言を見てもわかりますが、引数にも戻り値にも型が書いていません。静的で慣れてる僕としてはここでも苦戦しそうです。

また、戻り値にreturnも不要です。 戻り値となるのは最後に評価された式です。 上記ではa + bですね。

returnもないわけではなく、式の途中で脱出する場合に使われます。

def add(a, b)
  return '引数を指定してください' if a.nil? || b.nil?

  a + b
end

終わりに

と言うことで、「プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発デバッグ技法まで 」をもとに勉強した内容をRubyの基本とデータ型についてまとめてみました。

Javaと比較しながら見ていくと、巷でよく言われている通り、Rubyはかなり自由度が高い言語のようです。入門しやすいといいますか。

今後もどんどん勉強を進めていきたいと思います!