Ruby 入門

Rubyについて

Rubyはまつもとゆきひろが開発したオブジェクトスクリプト言語。
Rubyの処理系は複数ある。大体のRubyはC言語で実装されたMRI(基本OSで動作)

Rubyの基礎知識

Rubyはすべてオブジェクト
Rubyのメソッドは種類がある
・オブジェクト.メソッド(引数)
・オブジェクト.メソッド引数
・オブジェクト.メソッド
文の区切りは改行
コメント方法
#をつかう
リテアルはソースコードに埋め込める値
変数は宣言と値を入れる

文字式

シングルクォート
・バックスラッシュが使えない
・式展開が使えない
ダブルクォート
・なんでもできる
文字式の比較
・==か!=をつかう
ヒアドキュメント

a= <<TEXT
これはヒアドキュメントです。
TEXT

条件分岐
Rubyの真偽値
True falseをかえす

Ruby  テスト

プログラミングの不具合や修正を自動化すること。
テストフレームワークをつかって自動化する。

MInitest

Rubyインストールと一緒にインストールされる
学習コストが低い
Railsのデフォルトのテスティングフレームワークでかいはつのちしきもつく

require 'minitest/autorun'
class SampleTest < Minitest::Test
  def test_sample
    assert_equal 'RUBY', 'ruby'.upcase
  end
 end 

 minitestの書き方
一行目 ライブラリーを読み込んでminitestを使える用にする
二行目 テストコードの本体
三行目、四行目  実行対象のテストメソッド

1 runs,0 assertions, 0 failures, 1 errors 0 skips

1 runs :実行したテストの件数
0assertions : 実行した検証メソッドの件数
0 failures: 検証に失敗したテストの件数
1 errors :検証中にエラーが発生したテストの件数
0 skips : skipsメソッドによりスキップされたテストの件数

配列

配列は複数のデーターを格納するオブジェクト
Arrayクラスのオブジェクト

 #空の配列 
a=[] #3つのデーターが格納された配列 
a=[1,2,3] #配列の中に配列 
a=[[1][2][3]]
#<<をつかって最後にいれる
a =[]
a>> 2 
 #配列を使った多重代入 
a, b = [1,2]


4.3ブロック

ブロックはメソッドの引数として渡してくれる処理のかたまり

 #eachメソッド 
numbers = [1,3]
  sum += n
end
sum #ブロックの範囲 
numbers.each |n| #ブロック引数 
 sum += n
end

配列の要素を削除

 #deleteメソッド 
a = [1,2,3,4]
a.delete(2) #delete_ifメソッド 
a = [1,2,3,4]
a.delete_if |n|
 n.odd?
 end

ブロック引数とブロック内の変数

numbers = [1,2,3,4]
sum = 0
numbers.each do |n|
  sum_value = n.even? ? n * 10 :n
  sum += 1
end

ブロック引数名は何でもいい
sum_valueはブロック変数
ブロック外部で決められた変数はどこでも使える
ブロック引数とブロック外の変数は同じ名前にするとブロック内ではブロック引数を優先する

{}を使うブロック記法

numbers = [1,2,3,4]
sum = 0
numbers.each do {|n|
  sum += n
}
sum

ブロックを使う配列メソッド

map/collet

ブロックの戻り値が新しい配列の要素になる

numbers = [1,2,3,4]
new.numbers = 
numbers.map do |n| n * 10 
end

select/find_all/reject

ブロックに集めた要素を戻り値が真だけの配列を作る
ブロックに集めた要素を戻り値が偽だけの配列を作る

numbers = [1,2,3,4,5]
even_numbers =numbers.select{|n| n.even?}
 

find/detect

戻り値が真になった最初の要素を返す

numbers = [1,3,4]
even_numbers = numbers.find{|n| n.even?}

inject/reduce

ブロックに集めた要素を演算する

numbers = [1,3,4,5]
numbers.inject(0){|result,n| result+n}

4.4.5 &とシンボルを使って簡潔に書く

['ruby','java','php'].map{|s| s.upcase}

4.5範囲

・範囲オブジェクト
1..5->最後値含む
1...5->最後値含まない
範囲オブジェクトはRangeクラス

・配列や一部を抜き出す

a = [1,2,3,4]
a[1..3] #=>{2,3,4}

・n以上n以下 n以上n未満

def liquid?(temperature)
  (0...100).include?(temoerature)
  end

ハッシュ

ハッシュはキーと値の組み合わせでデーターを管理するオブジェクト
ハッシュリテアルを利用してハッシュを作成
ハッシュはHashクラスのオブジェクト

{}
{キー1 => 値 キー2 => 値2}

要素の追加、変更、取得

aioeo = {a=>"a",i=>"i"}
aioeo["o"] = "o" 
aioeo["o"] = "u"
aioeo["u"]

ハッシュを使った繰り返し
eachメソッドはキーと値の組み合わせを順に取り出すことが出来る。

cuurencies = {"japan" => "yen", "us" => "dollar", "india" => "rupee"}
cuurencies.each do |key,value|
puts "#{key}" :"#{value}"
end

ハッシュのキーにシンボルを使う

currencies = {:japan => "yen"}
currencies = {japan: "yen"}
currencies = {japan: :yen}


シンボル

シンボルは任意の文字列と一対一に対応するオブジェクト。
シンボル =:

シンボルと文字列の違い
シンボルはSymbolクラス、文字列はStringクラス

シンボルの特徴
・表面上は文字列ににててプログラマにとって理解しやすい
・内面的は整数ですので処理が比較的に早い

正規表現

正規表現はパターンを指定して文字列検索や置換を行う一種のミニ言語
正規表現はRegexpクラス

正規表現の便利さを知る

正規表現の文字はメタ文字
正規表現を使うときは、最初に検索対象文字列の 「法則(パターン)」 をうまく見つけだすのが大切です

Rubyにおける正規表現オブジェクト

スラッシュでパターンを囲んで作成します(正規表現リテラル)

メタ文字

[] :いずれか一文字を表す文字クラスを作る
[^]: 〜以外の任意の一文字を表す文字クラスを作る
-: []内で使われると文字の範囲を表す
.: 任意の一文字を表す
():内部でマッチした文字列をキャプチャもしくはグループ化する
?:直前の文字やパターンが一回現れる
*:直前の文字やパターンが0回以上連続する
+:直前の文字やパターンが一回以上連続する
{n,m}:  直前の文字やパターンがn回以上
|:OR条件をつくル
^ : 行頭を表す
$:行末を表す
\:メタ文字をエスケープしたり

クラスの作成を理解する

オブジェクト指向プログラミングの基礎知識

クラスのメリット

クラスがないともろくて壊れやすいプログラミングになる

クラスの定義

class User
attr_reader :first_name, :last_name, :age
def initialize(first_name, last_name, age)
@first_name = first_name
@last_name  = last_name
@age = age
end
end
user = []
users << User.new('Alice', 'Ruby', 20)
users << User.new('Bob', 'Python', 30)
def full_name(user)
"#{user.first_name} #{user.last_name}"
users.each do |user|
puts "指名: #{full_name(user)}, 年齢:#{user.age}"
end 

クラスは内部にデータをほじするから、更に自分が保持しているデーターを利用する独自メソッドを持つことが出来るプログラムが大きくなるほどデータとメソッドを持ち運べるクラスのメリットが大きくなる。

オブジェクト型指向型プログラミング関連の用語

クラス
クラスは一種のデータ型。設計図

オブジェクト、インスタンス、レシーバー
クラスから生成するオブジェクト
データの塊。
メソッドの関係を説明するときレシーバーとも言われる

メソッド
オブジェクトが持つ動作をメソッドと呼ぶ。関数

状態(ステート)
オブジェクトごとに保持されるデータをオブジェクトのステートと呼ぶ。

属性(アトリビュート、プロパティ)
オブジェクトから取得することを属性と呼ぶ。

クラスの定義

class クラス名
end

オブジェクトの作成

User.new

このときに必要なinitializeメソッド。インスタンスを初期化するために実行
したい処理があればinitializeメソッドで処理する。

インスタンスメソッドの定義

クラス構文の内部でメソッドを定義するとメソッドはインスタンスメソッドになる。

 class User 
  def hello
    "Hello"
   end
end

インスタンス変数とアクセサメソッド

クラスの内部ではインスタンス変数を使う。インスタンス変数と同じインスタンスの内部で共有変数。インスタンス変数の変数名は必ず@で始める。
メソッドやブロックの内部で作成する変数ローカル変数と呼ぶ。

クラスメソッドの定義

クラス構文の内部で普通にメソッドを定義するとメソッドはインスタンスメソッド

class クラス名
def self.クラスメソッド
end
end

定数

class Product
  DEAULT_PRICE = 0
  attr_reader : name, :price
  def initlalize
   @name = name
   @price = price
   
  end
end


モジュールの概要

モジュールを使う用途

・継承を使わずクラスにインスタンスメソッドを追加する(ミックスイン)
・複数のクラスにたいして共通の特異メソッドを追加する
・クラス名やメソッド名の衝突を防ぐために名前空間を決める
・関数的メソッドを決める
・シングルトンオブジェクトのように扱って設定値などほじする


モジュール定義

module モジュール名
end

モジュールとクラスの違い
・モジュールからインスタンスを作成することができない。
・継承ができない。

モジュールのミックスイン(includeとextend)

モジュールをクラスにincludeする

module Loggable
def log(text)
puts "[LOG]#{text}"
  end
end
class Product
include Loggable
def title
log 'gigle is called'
end
end

includeとして機能を追加出来る(ミックスイン)

モジュールをextendする

モジュール内のメソッドをそのクラスの特異メソッドにすることが出来る

module Loggable
    def log(text)
        puts "[Log]#{text}"
    end
end
class Product
    extend Loggable
    def self.create_products(names)
        log 'create_products(names)'
        log 'create_roduct'
    end
end

例外処理を理解

例外の捕捉

発生した例外を捕捉しない場合

module Greeter
    def hello
        puts 'hello'
    end
end
greeter = Greeter.new

NoMehodErrorが発生

NoMehod = 呼びだそうとしたメソッドがない

例外を捕捉して処理を続行する場合

例外処理の構文

begin

rescue
end

例外処理の流れ
例外が発生した箇所がbegin~rescueでかこまれてない場合処理を中断してメソッドをよびだしをもどる途中にその例外を捕捉するコードがあればそこから処理を続行

例外オブジェクトから情報を取得する
Rubyでは発生した例外自身もオブジェクトになっている
オブジェクトを呼び出すことで発生した例外にかんする情報を取得する

begin
1/0
rescue => e
    puts "エラークラス : #{e.class]"
    puts  "エラーメッセージ : #{e.class}"
    puts "バックトレース -----"
    puts "-----"
end

クラスを指定して捕捉する例外を限定

begin
rescue => ZeroDivisionError
    puts "0で除算しました"
end

例外クラスの継承関係

すべての例外クラスはExceptionクラスを継承しています。
多くの例外クラスがサブクラスとしてぶら下がっているのですが
StandardErrorのサブクラスとそれを以外の例外クラスの違いを理解する

意図的に例外を発生させる

例外を発生させるばあいはraiseメソッドを使います。

def currency_of(country)
    case country
    when :japan
         'yen'
    when :us
        'doller'
    when :india
        'rupee'
    else
        raise "無効な国名です。"
    end
end


文字列がエラーメッセージになります。文字列は省略可能ですが例外発生時に原因がわかりづらくなるために通常は原因をとくていしやすくする。

例外処理のベストプラクティス

安易にrescueを使わない
処理中のデータ構造が崩れたりして、余計にややこしい別の間題
を引きおこすだけです。初心者はフレームワークの共通処理に全部丸投げ

rescueしたら情報を残す

例外時の状況を確実に記録する。
発生した例外クラス名、エラーメッセージ、バックトレースの3つはログやターミナルに出力する。

yieldとProcを理解する

ブロックを利用するメソッドの定義とyield

yieldを使ってブロックを呼びたす。

def greeting
    puts 'おはよう'
    yield
    puts 'こんばんは'
end

ブロックの確認

block_given?

def greeting
    puts 'おはよう'
    if block_given?
        yield
    end
    puts 'こんばんは'
end
greeting do
puts 'こんにちは'
end

ブロックを引数として明示的に受け取る

ブロックを引数として受け取る場合引数名に&をつける
ブロックを実行する場合はcallメソッドを使う

def メソッド(&引数)
    引数.call
end

Procオブジェクト

Procオブジェクト基礎

Procクラスはブロックをオブジェクト化するためのクラス。
Procはブロックを表す。

hello_proc = Proc.new do
'Hello'
end
hello_proc = Proc.new('Hello!')

Procオブジェクトをブロックの代わりにわたす

 Procオブジェクトを普通の引数として渡す



この記事が気に入ったらサポートをしてみませんか?