Ruby自分用メモ

編集中

# **メモ**

- Rubyではfalseとnilが「偽」、それ以外が「真」として扱われます。
- [1,2,3] << 4 →　配列の追加（結果は[1,2,3,4]）
- source_location() → メソッドの定義場所を調べられる
- nextは繰り返しの中で処理をスキップし、繰り返し処理を続行する　block内で使うとblockをスキップする
- Rubyではcallerメソッドで呼び出し元がわかる
- メソッド全体の例外を拾う場合はbeginを書かない
- [||=の使い方](https://www.xmisao.com/2014/02/10/ruby-idiom-or-equal-operator.html)
- [||演算子のいろんな使い方](https://qiita.com/ngron/items/4d3ca9827d1969fccd60)
- [!!の意味](https://techracho.bpsinc.jp/hachi8833/2016_11_15/28993)


# **用語**

|名称|説明|備考|
|:-----------------|:---------------------|:------------------|
|rbenv|複数のRubyのバージョンを管理するもの||
|bundler|Gemを扱うパッケージの個別の依存関係を解決してくれて、インストールしてくるもの||
|Gem|Rubyのパッケージ管理ツールの事。また各ライブラリのことも指す||
||||
|ブロック|do~end（もしくは{~}）で囲われた、引数となるためのカタマリ。<br>引数として渡されたブロックは、yieldによって実行される||
|RubyForge|Ruby版のSourceForgeのようなモノ 現在はgithubに移行||
|破壊的メソッド|レシーバにあたるオブジェクトの値そのものを変更してしまうメソッド||
|def initialize<br>end|コンストラクタ||
|require|ファイル読み込み|標準ライブラリは require 'libcdb'　ライブラリ名<br>外部自作ファイルはrequire_relative 'hoge'<br>                  require './hoge'|
|var = object &#124;&#124; obeject|左のobjectが真なら左を返す||
|self.class.hoge|クラスメソッドをインスタンスメソッドから呼び出す際に使用する||
|#{...}|式展開||
|オブジェクト.class.name|オブジェクトの型を調べる||
| self | カレントオブジェクト（インスタンス）を指す、特殊な変数 |  self と付けないとローカル変数への代入となってしまうので、<br/>self を明示的に付ける。 |
| カレントオブジェクト | メソッドなどを実行しているオブジェクトのこと |   student2 = Student.new<br/>student2.func　（student2.funcのこと） |
| << | <<演算子（メソッド）は、左辺の配列（レシーバ）の末尾に右辺のオブジェクトを要素として加えます。<br/>レシーバ自身を変更するメソッドです。戻り値はレシーバ自身です。 |   |
| :シンボル | 基本シンボルは前置 |   ハッシュのキーとしてシンボルを使う際や、<br/>キーワード引数を使う際に、コロン記号「:」を後置<br/>シンボルは「-」が使えない |
| ハッシュ | ハッシュの入れ方 hash = {ruby:"rails",python:"Django",php:"cakePHP"}<br/>ハッシュの中身 {:ruby=>"rails", :python=>"Django", :php=>"cakePHP"} |   多次元配列<br/>{"DM"=>{1=>["0001"]}} |
| 真偽値 | Rubyでは、falseとnilを除くすべての値が真です<br/>つまり、0は、真です |   |
||||
||||
||||
||||
||||


# **変数**

- Ruby では、以下は単なる慣習ではなく、名前によりスコープが決定
    - ローカル変数 : 先頭が小文字 or _
    - グローバル変数 : 先頭が $
    - インスタンス変数: 先頭が @
    - クラス変数 : 先頭が @@
    - 定数 : 先頭が大文字

- 以下は慣習
    - 変数名は、xxx_xxx_xxx のような、小文字を _ でつなぐ形

- 擬似変数
    - selfやtrueなど詳細は下記リンク
    - [変数と定数](https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html)

# **メソッド（関数）**

- クラスメソッド

```ruby
#定義
class クラス名
  def クラス名.メソッド名(引数)
  end
　　　　#以下のようにも定義できる
  def self.メソッド名(引数)
  end
end

#呼び出し
クラス名.メソッド名

#::を使ってもOK
クラス名::メソッド名

```

- インスタンスメソッド

```ruby
#定義
class クラス名
  def メソッド名(引数)
  end
end

#呼び出し
変数名 = クラス名.new
変数名.メソッド名（引数）
```
- ブロック付きメソッド呼び出し
    - Ruby ではブロック付きメソッド呼び出しを用いるコードが好まれることが多い
    - ブロック付きメソッドとyieldは、コールバック関数を簡単に書けるようにしたもの
    - yieldがブロックを処理
    - [【初心者向け】ブロック付きメソッドとは](https://qiita.com/shuhei_sfc/items/5c582f89d5d8d7ab956c)


```ruby
#定義
def block_method
  yield "a"
  yield "b"
  yield "c"
end

#呼び出し
block_method do |x|
  puts x
end

#定義
def plus(x, y)
  yield x, y
end

#呼び出し
plus(1, 1) do |a, b|
  puts a+b
end
```

- 以下は慣習
    - メソッド名は、xxx_xxx_xxx のような、小文字を _ でつなぐ形
    - ?で終わるメソッドは、真偽値を返す
    - !で終わるメソッドは、破壊的メソッド

- その他
    - 関数は引数がない場合（）を省略できる
    - 引数の最後がハッシュの場合、{}を省略できる
    - メソッドの上位置にpublicもしくはprivateと記載すると、下側はそれに反映される
    - 　returnがない場合、メソッドの中の一番最後の式がメソッドの戻り値となる



|クラス名|メソッド名|機能説明|
|:-----------------|:---------------------|:------------------|
|String|gsub|正規表現にマッチした部分をすべて変換するメソッド|
|String|chomp|文字列の末尾の改行文字を取り除いた新しい文字列を返します|
|Dir|grob|任意の文字列を含むファイルを取得|
||||
||||
||||


# **Module**

機能
メソッド
定数

使い方
名前空間
多重継承実現

include
モジュールに定義されたメソッドをクラスにインスタンスメソッドとして取り込む

モジュール内で宣言されたクラスメソッドは
クラスと同様にモジュールから直接呼び出すことができます。

```ruby
module Mod
  def self.hello
    puts 'Hello'
  end
end

Mod.hello #=> "Hello"
```

- 以下は慣習
    - モジュール名は、キャメルケース

# **例外**

```ruby
begin
  # 例外を投げるのは、raise メッセージ(or クラス)
rescue => 変数
  # 例外時の処理
ensure
  # 必ず実行される
end
```

# **ライブラリ**

[ライブラリ一覧](https://docs.ruby-lang.org/ja/latest/library/index.html)

1. **Rack**
    - RubyでWebサーバーを立ち上げるためのインターフェース
    - [Rackとは何か](https://qiita.com/k0kubun/items/248395f68164b52aec4a)
2. **WEBrick**
    - 単純なHTTP Webサーバの機能を提供する

3. **rake**
    - Rake というコマンドラインツールを扱うライブラリ
    - [別途詳細](#rake)


# **Rake**

- Rakeとは
    - Rubyで記述されたbuildツールでMakeやAnt,Mavenと同種のツール
    - ファイル名は拡張子無しの「Rakefile」が多い<br>拡張子ありのsample.rakeやsample.rbの場合もある
    - ファイルタスクには、対応するファイルが作られていないときか、依存してるファイルが更新されたときの
どちらかのときにしか実行されないっていう特徴がある。

```ruby
#定義
task タスク名 , [パラメータ名, パラメータ名 ... ] => [事前タスク名,事前タスク名 ... ] do
  # アクション
  puts 'hello'
end

#呼び出し
rake タスク名[パラメーター名]

ファイルタスク
#定義
rake タスク名 => "index.html"

file "index.html" do
end

#呼び出し
rake タスク名
```


- 参照リンク
    - [Rake](http://railsdoc.com/rake)
    - [Rakeの基本的な使い方まとめ](http://unageanu.hatenablog.com/entry/20100829/1283069269)
    - [ファイルを扱う作業をRakeで便利にしよう！](http://rubicle.net/ruby_talk.html)
    - [rakeタスクを定義するときのおまじない :environment がやっていること](https://qiita.com/vivid_muimui/items/5ef9dfa31f5168190278)

# **RubyMine**

- ~~.rbのタブを右クリック → git → ヒストリーの表示で過去の変更履歴が見れる
- [メモリ割り当て](https://blog.kyanny.me/entry/2016/11/22/035944)
- [矩形選択](https://qiita.com/withelmo/items/8ab36ffa7e14a41604d6)

[RubyMine 公式ショートカット一覧 (日本語版) Mac](https://pleiades.io/sites/willbrains.jp/keymap/pdf/shortcut_rubymine_mac.pdf)

|コマンド|説明|
|:-----------------|:---------------------|
|⌘ + B | コードジャンプ |
|⌘ + [ | 戻る |
|shift ２回 | どこでも検索 |
|コード補完 | 明示的に示していなければコード補完はしてくれない |
|⌘ + Shift + F | テキスト検索 |
|⌘ + Shift + o | ファイル検索 |
|Shift + # | 式展開 |
|option + F7 | ソース内で他に使ってるところを検索してくれる |
|⌘ + /|コメントアウト|

# **デバック**

[【Ruby入門】loggerの使い方まとめ](https://www.sejuku.net/blog/19387)

# **参照リンク**

- 入門
    - [Ruby入門](http://www.tohoho-web.com/ruby/)
    - [Ruby入門 ～Rubyの開発環境を用意する手順やRubyを使ったプログラミングの方法について解説します～ | RubyLife](https://www.rubylife.jp/ini/)
    - [君の瞳はまるでルビー - Ruby 関連まとめサイト](http://www.ownway.info/Ruby/)
    - []()



[Rubyメモ](https://qiita.com/mochizukid@github/items/c82d044576c612d4b66d)
[RubyのModuleの使い方とはいった](https://qiita.com/shiopon01/items/fd6803f792398c5219cd)
[Ruby block/proc/lambdaの使いどころ](https://qiita.com/kidach1/items/15cfee9ec66804c3afd2)
[Rubyで使われる記号の意味（正規表現の複雑な記号は除く）](https://docs.ruby-lang.org/ja/latest/doc/symref.html)
[[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか](https://qiita.com/jnchito/items/dedb3b889ab226933ccf)