tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【ruby】プログラミング経験者のためのRUBY最速入門 を読んだメモ

はじめに

rubyはこれまで必要な時に見よう見まねでなんとなくちょい修正、程度に触ってました。

まともに勉強したことはなかったので
プログラミング経験者のためのRUBY最速入門という本を読んでみたのでそのまとめです。

プログラミング経験者のためのRuby最速入門
(2017-08-27)
売り上げランキング: 3,272

所感

タイトル通り、
他の言語を触ってる人ならかなり早く読めます。
1,2時間程度でも読めると思います。

基本中の基本文法がコンパクトにまとまっていてとても良かったです。

まとめ

もともとコンパクトにまとめてくれてる本なので、
それをさらにまとめたというよりは自分用メモです。

  1. 導入
  2. 文法
  3. 演算子とデータ型
  4. 制御分
  5. 組み込みオブジェクト

1. 導入

rubyを入れて使ってみれるようにするまでです。
フレームワークなどを入れる/触るわけではないのでさらっと終わります。

homebrew

自分はすでに入ってたので飛ばしましたが一応...

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

参考: http://tweeeety.hateblo.jp/entry/2014/10/03/195429

rbenv

rbenv経由でrubyを入れます。
自分はhomebrewで直接rubyを入れてたのでrbenvで入れ直しました

# rubyのバージョンを確認
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin13]

# rbenv install
# upgradeは10分弱かかったのでコーヒーでも飲みながら...
$ brew install rvenv

$ rbenv -v
rbenv 1.0.0

$ brew upgrade rbenv

# rbenv経由でのrubyのinstall
# これは3分くらいだったかな
$ rbenv install 2.4.1

# rubyのversionを2.4.1に切り替え
$ rbenv versions
  system
  2.1.2
* 2.2.0 (set by /Users/tweeeety/.rbenv/version)
  2.4.1

$ rbenv global 2.4.1

$ rbenv versions
  system
  2.1.2
  2.2.0
* 2.4.1 (set by /Users/tweeeety/.rbenv/version)

補足

rbenvをinstall後に、~/.bash_profileなどに以下を追加する必要があります
追加後にsource ~/.bash_profileするのをお忘れなく

export PATH="$HOME/.rbenv/shims:$PATH"
eval "$(rbenv init -)"

2. 文法

変数と定数

ローカル変数
hoge = "hoge"
インスタンス変数
@hoge = "hoge"
クラス変数
class Foo
  @@hoge = 1
end
グローバル変数
$hoge = 100
定数
HOGE = "hoge"
  • ちょいメモ
    • 先頭が大文字
    • 再代入可能

コメント

単行コメント
# コメント
複数業コメント
=begin
ここから
コメントや
\(^o^)/
=end
記述以降を全てコメント
hoge = "hoge"
fuga = "fuga"

__END__ 
これ以降は
コメントや
\(^o^)/

関数

def メソッド名(arg1, arg2, ...)
  # 処理
end
  • ちょいメモ
    • 引数は「参照渡し」
    • 到底の意味をもつ関数名の末尾に感嘆符(!と?)を付与する慣例がある

標準出力

puts
puts "hogehoge"
  • nilを返す
  • 最後改行される
print
puts "hogehoge"
  • nilを返す
  • 最後改行されない
p
p "hogehoge"
  • 引数の値を返す
  • 最後改行さる

3. 演算子とデータ型

演算子

他の言語とほぼ同じです。
あげてくれているサイトがあるので参照だけしておきます。
Ruby 2.5.0 リファレンスマニュアル > 演算子式

三項演算
条件 ? 式1 : 式2
文字列演算

文字列は + で連結します。
また、*で繰り返しができます。

連結と代入 というのがあり、これは知らなかったです。

a = "aiu"
b = "eo"

puts a << b # aiueo
puts a # aiueo

データ型

数値

全ての数値オブジェクトはNumericのインスタンス

Numeric       数値の親クラス
  ├ Integer   整数の親クラス
  │  ├ Bignum 大きな整数
  │  └ Fixnum 整数
  └ Float     浮動小数点
文字列

"(ダブルクオート)'(シングルクオート)で囲む。
ダブルクオートで囲った文字列は式(#[式])を埋め込める

# 式埋め込み例
hoge = "#[1 + 1]だよ" # print => 2だよ
配列
arr = ["hoge", "fuga", 1, true]

p arr
puts arr[0]
ハッシュ
member = {"hoge" => 20, "fuga" => 20}
puts member["hoge"]
型キャスト
# 文字 -> 数値
num = "1".to_i

# 数値 -> 文字
str = 1.to_s

クラス

# class定義
class Hoge
  def initialize(name, age)
    @name = name
    @age = age
  end

  def say
    puts @name + " is " + @age.to_s
  end

  # クラスメソッド
  def self.fuga
    puts "fuga!!!!"
  end
end

# インスタンス化
piyo = Hoge.new("piyo", 20)
piyo.say

# クラスメソッドの呼び出し
Hoge.fuga

モジュール

# module定義
module Mod
  Version = "1.0.0"
  
  def v
    Version
  end

  def say
    puts "this version is " + Version
  end

  def self.fuga
    puts "fuga!!!!"
  end

  # モジュールメソッドとして定義
  module_function :v
end

puts Mod.v
puts Mod::fuga

# (※1)これは怒られる
# puts Mod.say

# クラスにインクルード
class Cls
  include Mod
end

cls = Cls.new
puts cls.say
# (※2)これは怒られる
# puts cls.v
  • ちょいメモ
    • モジュールメソッドはmodule_functionを使う
    • モジュール名.メソッドで呼び出せる
    • プライベートメソッドになりインクルードしても呼べない
補足

(※1)これは怒られる の実行結果

module_sample.rb:25:in <main>': undefined methodsay' for Mod:Module (NoMethodError)

(※2)これは怒られる の実行結果

module_sample.rb:34:in <main>': private methodv' called for #<Cls:0x007fa9238f8c38> (NoMethodError)

オブジェクト

Objectクラスは全てのスーパークラス

nil

他の言語のnullと違い、nilはオブジェクト

4. 制御分

条件分岐

if文
if 条件式1 then
  # 処理1
elsif 条件式2 then
  # 処理2
else
  # 処理3
end
case文
case オブジェクト
when1 then
  # 処理1
when2 then
  # 処理2
when3, 値4, 値5 then
  # 処理3
else
  # 処理4
end

繰り返し

for
# よくある形
for 変数 in オブジェクト do
  # 処理  
end

# 範囲オブジェクト
for num in 1..3 do
  # 処理  
end
  • ちょいメモ
    • ..は「範囲オブジェクト」
while
while 条件式 do
  # 処理

end
each

オブジェクトに対して何らかの処理を繰り返す場合使う

# 
オブジェクト.each{|変数|
  # 処理
}

#
オブジェクト.each do |変数|
  # 処理
end
loop
loop {
  # 処理
}
  • ちょいメモ
    • 抜けるときはbreak
timesメソッド

一定の回数処理を繰り返す場合に使う

#
オブジェクト.times {|変数|
  # 処理
}

#
オブジェクト.times do |変数|
  # 処理
end

# 例
3.times do |i|
  putsh i # 1,2,3と出力
end
setpメソッド/uptoメソッド/donwtoメソッド
# stepメソッド
オブジェクト.step(limit, stepno) {|変数|
  # 処理
}

# 例
1.step(5, 2) {|i|
  puths i # 1,3,5と出力 
}


# uptoメソッド
オブジェクト.upto(max) {|変数|
  # 処理
}

# 例
2.upto(4) { |i|
  puth i # 2,3,4 と出力
}

# donwtoメソッド
オブジェクト.downto(min) {|変数|
  # 処理
}

# それぞれ`do |変数| 〜 end`の記述も可能

例外

# エラーの捕捉
begin
  # エラーが発生する可能性のある処理
rescue
  # エラーが発生した場合の処理
else
  # エラーが発生しない場合
ensure
  # 必ず行う処理
end

# エラーの発生
raise "error" # RuntimeError

ブロック

ブロックとは

関数やメソッドの呼び出しの際に引数と一緒に渡す処理のかたまり

以下の"do"から"end"までがブロック

[0,1,2].each do |i|
  puts i + 1
end
blockとyield
# 
def block_func(v)
  puts v

  # yieldを使うと関数内でブロックを実行可能
  # ブロックを受け取っていないと例外のため
  # block_given?とセットで使う
  yield if block_given?
end

# 呼び出し時二ブロックを渡す
block_func("hoge") do
  puts "fuga"
end

5. 組み込みオブジェクト

組み込みオブジェクトには以下のようなものがある

  • Numeric
    • 数値を扱う基本クラス
    • 数値処理のメソッドや演算子が実装されている
  • String
    • 文字列を扱うクラス
    • 文字列操作のメソッドや演算子が実装されている
  • Comparable
    • 比較演算を許可するMix-in
    • NumericやStringも比較演算のためにインクルードしている
  • Regexp
    • 正規表現を扱うクラス
    • リテラルは/(スラッシュ)
    • ====~でパターンマッチ
  • Time
    • OS管理の時刻情報を扱うクラス
  • File
    • システム上のファイルを扱うクラス
    • IOクラスを継承している
  • Dir
    • ディレクトリ操作のためのクラス
  • Enumerable
    • オブジェクトの集まりを表現するMix-in
  • Struct
    • 構造体を扱うためのクラス

その他

気になったコードだけ書いておいた、という自分用メモ https://github.com/tweeeety/book-ruby-sample

おわり

プログラミング経験者のためのRuby最速入門
(2017-08-27)
売り上げランキング: 3,272

自分のように、基本は他の言語だけどたまーに読み書きする程度で
ちゃんと勉強までしたことなかった、という人には
かなりすっきりさっくり読めてコンパクトなのでオススメです!\(^o^)/