読者です 読者をやめる 読者になる 読者になる

Ruby を始めて2日目の僕が驚いたこと

Ruby Rails Railsチュートリアル

驚いた

photo credit: Kmark via photopin cc


Ruby を初めて 2日目。
Railsチュートリアル第4章Ruby の基本的な使い方を学んだ。


Ruby を使って驚いたことがいくつかあったのでまとめておく。
(プログラミング経験はそれなりにある。C#JavaScript, PHP など)


Rubyist の方は、初めて Ruby に触れたときのことを思い出すきっかけに。
Rubyist の方は、Ruby に興味を持ってもらえるきっかけになれば。


なお、いくつかのコードは Railsチュートリアルから抜粋している。


end はあるけど begin しない

多くの言語では関数やブロックを中括弧で括る。
Pascal 系言語では begin 〜 end で括る。

Ruby では begin なしで急に end が出てくる。

if string.empty?
  "string is empty!"
else
  "string is not empty!"
end


考えてみれば begin のきっかけになる if 文や for 文(Ruby では each)が目印になる。
だから begin がなくても成り立つのか、と納得させられた。


配列のインデックスにマイナスが入る

配列にマイナスのインデックスでアクセスすると、今までの言語ではエラーとなったり、メモリの怪しいところにアクセスする。


これが Ruby では -1 は配列の最後、-2 ならその手前、-3なら・・・となる。

>> a = [1..5]
=> [1, 2, 3, 4, 5]
>> a[2..(a.length-1)]
=> [3, 4, 5]
>> a[2..-1]
=> [3, 4, 5]


インデックスで落ちないための設計というわけではなく、array[array.length] にアクセスすると nil が返る。(デフォルトの場合)


array[0..-1] とすればすべての値を取得できる。
length を取る手間が省けて嬉しい。


関数に丸かっこがいらない

今までの言語では、メソッドには丸かっこがつきもの。
丸かっこがなければプロパティという切り分けだった。


これが Ruby では丸かっこを省略できる。

def string_message(string)
  if string.empty?
    "string is empty!"
  else
    "string is not empty!"
  end
end

>> string_message("test")
=> "string is empty!"
>> string_message "test"
=> "string is empty!"


これは・・・微妙な気がする。
前向きに捉えれば丸かっこはキーの位置からすると打ちづらいし、なければ早く書けるのかも。


まだ Ruby 界隈がよく分かってないけど、省略は基本的に使うべきではないのかも。
Rubyコーディング規約


既存のクラスに関数を追加できる

JavaScript では prototype の拡張がこれに当たる。
C# で言えば拡張メソッド。


class String
  # 文字列が回文であればtrueを返す
  def palindrome?
    self == self.reverse
  end
end


僕のようなアプリケーションエンジニアは使うべきではないと思う。
使うとすれば「 JavaScript でよくあるブラウザバージョンの挙動の違いを吸収したい」みたいなケース。


Railsチュートリアルでもこれを注意喚起した文章が書いてあった。

組み込みクラスの変更はきわめて強力なテクニックですが、大いなる力には大いなる責任が伴います (訳注: 「スパイダーマン」の名台詞)。従って、真に正当な理由がない限り、組み込みクラスにメソッドを追加することは無作法であると考えられています。
Railsチュートリアル - 4.4.3組込みクラスの変更


インスタンス変数にアットマークがついてる

インスタンス変数=メンバ変数。
Rubyインスタンス変数を扱うときはアットマークが先頭につくことになる。


class User
  attr_accessor :name, :email

  def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end

  def formatted_email
    "#{@name} <#{@email}>"
  end
end


これは嬉しい。
変数名で見分けが付くようにしようなどと考える手間が省ける。


最後に

新しい言語を学ぶってやっぱりワクワクする。
多くの OSS 界隈のプログラマを虜にする Ruby & Rails のことだから、まだまだ驚かされることになるんだろう。
期待しよう。


Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング