LoginSignup
11
14

More than 5 years have passed since last update.

【初心者】Rubyをはじめて学んでつまづいたポイントまとめ

Last updated at Posted at 2017-02-25

1. はじめに

 これまでWebのフロントエンドしか触ったことのなかった文系大学生が、「サーバーサイドに挑戦してみよう!」と思い立ち、Ruby(ver. 2.3.1)を学習していった際に個人的に引っかかったポイントを中心にまとめてみました。結果的に網羅する形になりつつあるのは秘密です。(随時更新予定)
 ところどころに私のプチコラムが挟まっていくスタイルです。

1.1. 学習環境

 基本的には以下のものをベースに概ね自分で、分からないことはGoogleの集合知やメンターさんや周囲を頼りつつ勉強してます。

 この中でちょっと特殊なのはLiT!のメンター(要するにインストラクター)向けプログラム、LfSの研修を受けつつ学習を進めていることで、講師メンターさんや周囲のWebサービス開発コース担当のメンターにいつでも質問できる環境が整っているのは比較的恵まれてる方じゃないかなと思います。

目次

  1. はじめに
    1. 学習環境
  2. Rubyにおけるオブジェクト指向について考える
    1. ノリで書けないプログラミング言語
    2. 文系らしく構文分析で理解する
    3. フロントエンド言語との比較
    4. なんだかんだ箱の比喩最強説
  3. 基本用語の整理
    1. 定数 NAME
    2. 変数
      1. ローカル変数 name
      2. グローバル変数 $name
        1. 組み込み変数
      3. 擬似変数
    3. シンボル :name
    4. クラス @name
      1. インスタンス
      2. インスタンス変数 @name
      3. クラス変数 @@name
    5. メソッド .method
    6. モジュール Module
      1. ミックスイン
    7. 名前っぽいものまとめ
    8. 配列 [value1,value2]
    9. ハッシュ(連想配列) { :key => ”value” }
    10. キーワード引数
    11. ブロック
      1. スコープ
  4. 構文について
    1. 基礎的な文法
      1. " "' 'の使い分け
        1. 特殊記法
    2. 繰り返し処理
      1. 概要
      2. for.eachの書き換え
      3. 繰り返し処理でよく見かける|i|とは
        1. パラメータと引数
  5. おわりに
    1. 参考文献
    2. 脚注

2. Rubyにおけるオブジェクト指向について考える

2.1 ノリで書けないプログラミング言語

 突然ですが、私が10年以上座右の銘にしている言葉は「ノリと勢い」です。フロントエンドに関しても最初はわりとノリでやってました。HTMLやCSS、jQueryならそんなに複雑なものでなければノリと雰囲気でなんとかコードが書けちゃうし、流用しやすいサンプルコードも豊富なのでちょっと複雑なものでも雰囲気で利用したい形にできちゃう…。(最近はちゃんと勉強しようとしてますよ!!)
 ただ、エラーが出ないHTMLやCSSと違って、サーバーサイドはきちんと書かないと動いてくれないので雰囲気で書くのはさすがに厳しいし、ある程度ざっくりとでもRubyの思想を理解できてないと書けない。。。
 座右の銘とは対照的に、妙に理屈っぽいところがあるのでオブジェクト指向とはなんぞやというところからきちんとわかっていないと自分でコードを書いていてしんどそうなので、まずはよくある箱のたとえ以外のところからオブジェクト指向を理解していこうと思います。箱のたとえはホントわかりにくいと思う…。

2.2 文系らしく構文分析で理解する

 箱よりも英語のSVOCをイメージするとわかりやすい。気がする。実際に使ってる単語が英語なのもあるだろうけど、集中してRuby触ってるときは思考が英語モードに近くなってるような!
 私はプログラミング言語をちゃんと学習するのは今回が初めてなので、これはRubyに限定される話なのかはちゃんと分かりませんが、Rubyの考え方を理解するのに役立ちそうな、私が感じた英語との共通点を思いつくままに挙げていきます。

【ノンプログラマーがRubyの考え方を理解しやすくなる英語の構文との共通点】

  • 英語はそれぞれ独立した単語が文法に従って並んでいくことで意味を持つ文になり、複数の文がまとまって段落になり、いくつかの段落がまとまることで意味段落に、そして意味段落が順序正しく並ぶことで意味の通る文章ができる
  • 各段落内の文章の並びがある程度決まっている
  • 主語が必須なものの、代名詞があれば同じ主語を繰り返さなくてもよい
  • 目的語が必須の動詞と、なくてもよい動詞がある
  • 5W1Hを明確にする必要がある
  • 後ろの記号で内容を判断できるようになっている
  • 係り受けの関係を明確にすると意味が理解しやすくなる

2.3. フロントエンド言語との比較

 一応、他のものとも比べてみたほうがいい気がするので、LiT!のWebデザインコースで扱っているHTML/CSSとも比べてみました。

【HTMLとの比較】

  • HTML同様、一つのコードが要素としてそこで一旦完結する(他のファイルでも利用したいときは目印が必要)
  • どちらも入れ子にするときはコードの箱が綺麗に収まるようにする

【CSSとの比較】

  • それぞれが一つのものとして完結していて後述するクラスの多重継承ができない(子クラス孫クラスは作れるものの、CSSのクラスと違って使い回しができない)
  • 上からどんどん書いたコードが継承されていくCSSと違って、指定したもの同士でしか継承関係にない

2.4. なんだかんだ箱の比喩最強説

 たぶんこのオブジェクト指向の考え方が頭の中で綺麗にイメージできてないせいで各種混乱が起きてた気がする。。これが整理できてないと各要素の働き方をイメージしにくいというか。。
 さて、ここまで書いてきたところでそろそろまとめたいのですが、ここに来て最初に疑問を呈していた箱のたとえってよく使われてるだけあってそんなに悪くないんじゃないかと思い直しています…。いきなり箱って言われると「ハァ?」ってなるんですが、大前提としてそれぞれの要素は箱のようなものという認識は結構わかりやすいし、やっぱいいたとえのかもしれない……。

 オブジェクト指向については習うより慣れろ方式でとりあえず手を動かせ!っていうのか、文字の圧がすごい解説のどっちかに二分されてるように感じるので(結果的にこれも後者になってしまった……)、初心者でもわかりやすく、かつ体系的に解説されてるものがあったら教えてください!
 これは自分なりの理解をザクッとまとめたものなので、不適切だったらどんどん指摘してください><

3. 基本用語の整理

 プログラミングに限らず言えることですが、「その範囲がよく分からないから解説を読んでるのに、その分野の用語とか大体分かってる前提で話を進めないでよ!」って思うことってありませんか?
 解説する側からしたら自明なのかもしれないけど、学習者側からしたらそれは自明じゃないという認識の違いのせいで学ぶことのハードルが高くなるのってどうなんでしょう。
 世間一般的に理系分野に苦手意識を持つ人が多いのは、文系の用語は名前を聞いただけでなんとなく中身が想像できるのに対して、理系の用語はわりとそうでもない(ように感じられる)のにも一因があると思うのです。というか、私はそう!
 と、いう訳で一旦ざっと学習を進めていくうちに混乱が深まっていってしまった用語の意味とその使い方をまとめていきます。

3.1. 定数 NAME

 英語の大文字で始めるのがルール。わかりやすいように全部大文字で書くのが通例。

3.2. 変数

 英語の小文字 or _で始めるのがルール。大きく分けてローカル変数とグローバル変数、擬似変数のざっくり3種類がある。

3.2.1. ローカル変数name

 同一ブロックの間でのみ作用する変数。

3.2.2. グローバル変数 $name

 プログラムのどこからでも参照できる変数。取扱注意。

3.2.2.1. 組み込み変数

 Ruby 処理系によって特殊な意味を与えられている変数。グローバル変数として分類されていて、組み込み変数に使われているものは通常の変数として使用不可。

3.2.3. 擬似変数

 デフォルトで決まっている変数。selfniltrue/falseなど。

3.3. シンボル :name

 CSSのクラスのようにクラスをまたいで使い回しが可能。一度付けた名前は変更できない。
 内部で数値として扱われている関係で処理が早く、データを扱うときに使いがち(ex.ハッシュのキーや検索など)。ファイルサイズ的にも文字列よりこっちを多用した方がいい。
 クラス名/メソッド名/変数名/定数名を定義すると、自動的にシンボルも生成されている。

 ハッシュとセットで初登場することが多い(私調べ)シンボルですが、初登場時にハッシュとセットで扱われていたせいで個人的にすごくもにょ(※1)ってました。で、さっきこの記事の最後のまとめを読んでスッキリしたので紹介したいと思います。
 c.f.【Qiita】Rubyの文字列とシンボルの違いをキッチリ説明できる人になりたい

p.s. ハッシュ(後述)でキーとして利用する際には、以下のように表記することも可能。
hash = { :key => :value }
hash = { key: "value" }
これは省略記法として使えるだけで、シンボルとして使う際にはコロンは前にしか付かないので気を付ける!

3.4. クラス

3.4.1. インスタンス

3.4.2. インスタンス変数 @name

3.4.3. クラス変数 @@name

 クラス変数は、そのクラスやサブクラスとそれらのインスタンスで共有されるグローバル変数的なもの。クラス定義の中で定義されて、クラスの特異メソッドやインスタンスメソッドなどから参照・代入ができる。
 再代入可能で、クラスの外から直接参照できない(継承されたクラスからは参照・代入が可能)。

3.5. メソッド .method

 英語で言うところの動詞。したいことをちゃんと表現できるよう、自由に使えるようになるにはボキャブラリーが必要。

3.6 モジュール Module

メソッドを格納or名前空間として使う。インスタンス化できない。

3.6.1. ミックスイン

3.7. 名前っぽいものまとめ

 Rubyのコードをぱっと見たときに名前っぽく見える要素を再度整理してみます。

一般的な表記 要素名 説明
NAME 定数 定義するタイプの識別子
name 変数 中身が変わるタイプの識別子
name ローカル変数 ブロック内で使える変数
@name インスタンス変数 特定のオブジェクトに紐づく変数
@@name クラス変数 クラス内で共有される変数
$name グローバル変数 プログラム全体で使える変数
:name シンボル 一対一で対応する文字列っぽい数値
変数名やハッシュのキーによく使われる
class クラス名 クラスの名前
Module モジュール名 モジュールの名前

3.8. 配列 [ value1,value2 ]

3.9. ハッシュ(連想配列) { :key => ”value” }

3.10. ブロック

3.10.1. スコープ

4. 構文について

4.1. 基礎的な文法

4.1.1. ' '” ”の使い分け

 ' 'もしくは%()はHTMLのように静的で' '内の文字列がそのまま表示されるのに対して、
" "または%q()は、" "内で#{}を使ってRubyの式を展開できたり、\n(改行を表す)などの特殊記法が使える。
 %()%q()は文字列内においてクオーテーションマークを使いたいときに、その直前に文字列であることを表す\を使わずに済むのでコードが見やすくなるので覚えておくとGood!

4.1.1.1. 特殊記法

4.2. 繰り返し処理

4.2.1. 概要

forは区間、whileは範囲、timesは回数を表す。loopはループする(breakで抜ける)。
飛ばしたい要素があるときはnext、それぞれに何かをするときは.eachを使う。

ここでは、それぞれの書き方でn回目(nは整数)と10回表示させつつポイントをまとめます。

4.2.2. for文と.eachの書き換え

for i in 1..10 do
 puts "#{i}回目"
end
(1..10).each do |i|
 puts "#{i}回目"
end

上記2つのコードは意味的にも同じ処理が実行されます。

4.2.3. 繰り返し処理でよく見かける|i|とは

10.times do |i|
 puts "#{i}回目"
end

 さっきの.eachでも登場した|i|。このtimesの例の場合では、iは繰り返し回数を代入する変数として作用している。これはブロックパラメータというもので、|i|が無くても繰り返しの処理自体はできる。for文のように別個に変数を指定する必要があるとき以外において、必要に応じて付けたり付けなかったりする省略可能な要素。
 ブロックパラメータは定義されたブロック内でメソッドでの処理するものを与える引数のようなもの。||内に書いて表現する。まだちょっとよく分かってない部分があるので余裕ができたらちゃんと理解できるようにしたい。

 ちなみに、パラメータには名前があるが、引数には名前がない。

 (|i|が一体何者なのか謎すぎて、寝ぼけながらdotinstallの同じ動画3回見た)

4.2.3.1. パラメータと引数

 厳密にはパラメータに渡された値(式)のことを引数というっぽい。近いうちにちゃんと調べてまとめたい。ベン図で考えるのがよさそう。

5. おわりに

 Webの知識はインターネット上にあまた転がっているとはいえ、フロントエンドと比べてサーバーサイドの各種解説って基本的に分かりにくくないですか?
 やってることそのものの複雑さと学習者の層の違いがあるんだろうけど、それでも初心者にもっと優しくしてほしいし、図をもっと活用してほしい!図解!!

p.s. 皆さんにご指摘いただいた内容については逐次修正を加えています。本当にありがとうございます!ブロックパラメータなど、名前が分からないため調べようが無く悶々としていたものもコメントにてご教授いただけたおかげできちんと知るきっかけができました。些細なことや感想など何でも書いていただけると幸いです。

5.1. 参考文献

5.2. 脚注

※1 もにょる: もやもやするの類義語。頭では要件を理解しているはずなのに、イマイチ腑に落ちない現象を指す。
 
 
予告
- ActiveRecordを使ったデータベース作成編 coming soon...!
- Nokogiriを使ったスクレイピング編 coming soon...!
- Wabアプリケーション制作初心者が知ってると便利なUNIXコマンドまとめ coming soon...!
- わたしがよくやる打ち間違い -サーバーサイド編- coming soon...!

11
14
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
14