0. 概要
Progateを使ってRubyを学んでみての感想をまとめてみた。
他言語と比較しての感想とかも混ざってる。
今後Rubyを書いてみて、あれ?これどうするんだっけ?といったときに見返す用。
1. 感想
- 演算子
- インクリメント演算子++が使えない
- 条件式
- elseifじゃなくてelsifなのにびっくり
- 括弧
- くくらない言語なのでちょっと違和感(VBAとかもだけど)
- 加えて、多言語での中括弧終わりに相当するのが
end
- 文字列内""くくりでの変数展開が#{}なのが他でみたことない感じ
- 文字列と数値の+での結合ができない言語なので上をつかわないとダメ
- each doに違和感
- 慣習(と思われるもの「)
- 変数名はスネークケース
- 配列は複数形、each doでのループ回す時のループ変数は単数形
- タブ(インデント)は半角スペース2つ
- bool値を返すメソッド名の末尾は?をつける
- クラス名は大文字開始(というか言語仕様的に大文字以外できない)
- メソッドはキーワード引数で定義して、呼び出し側の可読性を向上させるっぽい
- ハッシュ(連想配列)
- 文字列と同じような(とはいえ異なる)シンボル(:<任意の文字列>)というものをキーにすることもできるがよくわからん・・・
- シンボルはハッシュのキーとしてよく使い、通常は{"key1" => value1, "key2" => value2}と書かないといけないのを、省略して{key1: value1, key2: value2}と書くことができて楽。これは便利!
- nil
- オブジェクトが存在しない、はRubyではnullではなくnil
- 条件式でnilはfalseと扱われ、それ以外の値はtrueと扱われる仕様。へぇー
- メソッド
- 定義するときには、
def
を頭につける。なんかCのマクロと混同しちゃう。 - 定義時に引数の名前を
ref:
のように:
で終わらせると、呼び出し側でその引数をつけて呼び出させることができる。キーワード引数と呼ぶ。呼び出し側のコードの可読性があがりそう! - ちなみにメソッド内でのキーワード引数へのアクセスは:が取れてるバージョン。へぇ・・・
- 引数なしの場合は呼び出し時に()は不要。つけてもうごくけど
- 定義するときには、
- クラス
- クラス名
- 大文字縛り。コーディング規約的に一般的なのでいいね。
- メンバ
- インスタンス変数と呼ぶ.変な感じ
-
attr_accessor :member1
のようにシンボル的な書き方をする.変な感じ。attr_accessorもなんか長ったらしー - インスタンス変数へのアクセスは
.member1
のようにする。えぇ・・・:member1
じゃないんかーい - ※attr_accessor :member1はメンバ変数の宣言ではないらしい。こう書くと、
@member1
というインスタンス変数への以下のpublicなgetter, setterが定義される特殊な書き方らしい。だから、インスタンス化した後に.member1
で外部からアクセスすると、C#やJavaのような言語でpublicなmember1というインスタンス変数へ直接アクセスするかのような使い方ができる、というものらしい。def member1
def member1=(引数)
- メソッド
- メンバで
attr_accessor
だったからattr_method
とか必要なのかと思いきや、ふつーにdef <メソッド名>
ええ・・一貫性がなーい - クラスに定義したメソッドはインスタンスメソッドという。なんでなんや・・・クラスメソッドでいいじゃん。メンバの方もインスタンス変数だったけどクラス変数でいいじゃん・・・
- と思いきや!クラスにはインスタンス化した後に呼び出せるメソッドとインスタンス化前に呼び出せるメソッドがあり、まだインスタンス化していないときに使えるメソッドのことをクラスメソッドと呼ぶ!なるほど!
- なお、インスタンスメソッドの主な使いみちはインスタンス化する時に特別な処理をさせたいとき、みたい。
- と思いきや!クラスにはインスタンス化した後に呼び出せるメソッドとインスタンス化前に呼び出せるメソッドがあり、まだインスタンス化していないときに使えるメソッドのことをクラスメソッドと呼ぶ!なるほど!
- 自身のインスタンス変数を使うときには
self.<インスタンス変数名>
。なんでthis.<インスタンス変数名>
じゃないんや・・・- 厳密
- コンストラクタはinitialize()。クラス自身の名前じゃないんですねぇ・・・・
- メンバで
- 継承
-
子クラス < 親クラス
で定義する.:
じゃなくて<
なんですね。へぇー - 子クラスのメソッドの中で
super()
とすると親クラスの同名のメソッドを呼び出すことができる。子クラス側で親クラスと同じ処理になる場合は、こうしておくと処理の修正をしなければならないときに親クラス側を修正するだけで済みそう
-
- クラス名
- コンソールからの入力
- gets.chompでやる。へぇー
- gets.chompでうけとった値は絶対に文字列。なので、文字列以外の値として扱いたい場合は、メソッドを実行する。たとえば
get.chomp.to_i
みたいな。なるほどねー
- 日付を使いたい
- Rutyで用意されているDateクラスを使う
-
require "date"
が必要。require "./date"
ではダメ。へぇー - コンストラクタは(年, 月, 日)になっている。
- Date.new()でなく、Date.todayとすると今日の日付でインスタンス化される。へぇー