Help us understand the problem. What is going on with this article?

SchooのRuby入門のまとめ

SchooのRuby入門の内容をまとめました
動画を見た人の備忘録に使えます!

どうも、ITのんびりです
Railsの自社開発企業に入社してもうすぐ2ヶ月です
未経験で入社した同僚の中でぼくだけスクールでRubyやRailsの勉強していませんでした。
だから、仕事中にSchooという動画学習サービスで勉強しました。

Ruby入門は全部終わったので、その内容をまとめました
Schooからダウンロードしてくるファイルにあるべきファイルがなかったので、そのファイルも書いてあります

記事を読んで興味が出たら、Schooで動画を見てみてください
初心者には動画の方が挫折せずに続きやすいと思います!

2. 第2回 irbと基本操作

2.1 埋め込みドキュメント

=begin

=end

でコードを囲むと全てコメントアウトされる

2.2 putsとprintとpの違い

irb(main):001:0> puts "Hello World"
Hello World
=> nil
# 引数と改行を出力、戻り値はnil

irb(main):002:0> print "Hello World"
Hello World=> nil
# 引数を出力、戻り値はnil

irb(main):003:0> p "Hello World"
"Hello World"
=> "Hello World"
# 引数を出力、戻り値は引数

3. 第3回 リテラルと演算子

3.1 リテラル

irb(main):022:0> 1_000_000
=> 1000000

大きな数字の時はで桁を区切れば見やすい。実行したらはなくなる。ファイルに書くときも同じ。

irb(main):019:0> code = "Ruby"
=> "Ruby"
irb(main):020:0> "hoge #{code}"
=> "hoge Ruby"
irb(main):021:0> 'hoge #{code}'
=> "hoge \#{code}"

ダブルクォートで囲むと#{変数}で埋め込むことができる

シングルクォートだとそのまま文字列として表示されてしまう

"hoge \n hoge"

と書くとブラウザでは改行される。ターミナルではそのまま表示される。

%w(a b c)

配列の中身が文字列の時は%w( )で囲む。カンマではなくスペースで区切る

irb(main):022:0> [1,2,3]
=> [1, 2, 3]

irb(main):023:0> [a,b,c]
Traceback (most recent call last):
        4: from /Users/1111730/.rbenv/versions/2.6.1/bin/irb:23:in `<main>'
        3: from /Users/1111730/.rbenv/versions/2.6.1/bin/irb:23:in `load'
        2: from /Users/1111730/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        1: from (irb):23
NameError (undefined local variable or method `a` for main:Object)

irb(main):024:0> ["a", "b", "c"]
=> ["a", "b", "c"]

irb(main):025:0> %w(a,b,c)
=> ["a,b,c"]

irb(main):026:0> %w(a, b, c)
=> ["a,", "b,", "c"]

irb(main):027:0> %w(a b c)
=> ["a", "b", "c"]

参考
Rubyで%記法(パーセント記法)を使う

3.2 論理演算子

&&はAND、||はOR、!は否定

左辺 && 右辺
左辺 || 右辺
!

irb(main):032:0> a = 1
=> 1
irb(main):033:0> a == 1 && a == 2
=> false
irb(main):034:0> a == 1 && a == 1
=> true

irb(main):035:0> a == 1 || a == 2
=> true
irb(main):041:0> a == 2 || a == 3
=> false

irb(main):047:0> !(a == 1)
=> false
irb(main):046:0> !(a == 2)
=> true

4. 第4回 制御構造とコレクション

4.1 if文

異なる要素に対する条件分岐

dive = 3
into = 5

if dive == 1 then
  p "DIVE INTO One"

elsif into == 5 then
  p "DIVE INTO GO !!"

else
 p "ハズレ"

end
#=>"DIVE INTO GO !!"

4.2 case文

1つの要素に対する条件分岐

dive = 3

case dive
  when 1 then
    p "1だよ"

  when 2 then
    p "2だよ"

  else
    p "1でも2でもないよ"

end
#=>"1でも2でもないよ"

4.3 times文

指定した回数だけ繰り返す

3.times do
  p "DIVE INTO CODE"
end

#=>
"DIVE INTO CODE"
"DIVE INTO CODE"
"DIVE INTO CODE"

4.4 while文

条件が成り立つ限り繰り返す

dive = 0

while dive < 100 do


  p "DIVE INTO #{dive}"

  dive = dive + 1


end

4.5 each文

コレクションの中身を1つずつ取り出して処理する

コレクションとは一連のまとまったデータのこと。ハッシュとか。

Rubyの繰り返しはeach文を使う方がいいらしい。

ppap_hash = { pen: "筆", pineapple: "パイナップル", apple: "りんご" }

ppap_hash.each do |ppap|

  puts ppap

end

#結果
pen

pineapple
パイナップル
apple
りんご
=> {:pen=>"筆", :pineapple=>"パイナップル", :apple=>"りんご"}

5. 第5回 オブジェクトとクラス

5.1 while true do

無限ループする

while 条件文 do

は条件文がTrueの間は繰り返すということなので、条件文をTrueにするとずっと繰り返す
breakをつければ止まる

5.2 sampleメソッド

配列の要素をランダムに返してくれる

word = ["pen", "pineapple", "apple"]
word.sample
#=>"pen" ランダムに配列の中身を返す

5.3 lengthメソッド
配列の要素数を返してくれる

word = ["pen", "pineapple", "apple"]
word.length
#=>3

5.4 lastメソッド

配列の最後の要素を返す

word = ["pen", "pineapple", "apple"]
word.last
#=> "apple"

word.last(2)
#=> ["pineapple", "apple"]

引数で返してくれる数を指定できる。複数返してくれるときは配列に入れてくれる。

5.5 to_sメソッド

数値を文字に変えてくれる

number = 10
puts number + "個のりんご"      #エラーになる
puts number.to_s + "個のりんご" #OK
#=> "10個のりんご"

5.6 ppap.rb

ダウンロードできるファイルにppap.rbが見つからなかったので、書いた

ppap.rb
def ppap(word_ary, correct_ary, success_str)
  lists = []
  count = 0
  while true do
    word = word_ary.sample
    print word
    print ' '
    lists << word
    # 正解の配列より短い場合は評価しない
    if lists.length > correct_ary.length then
      count = count + 1
      # 配列から最後の4つを取り出す
      candidate = lists.last(correct_ary.length)
      # 最後の4つがppap配列と一致する場合はsuccessと返す
      if candidate == correct_ary then
        puts success_str
        puts '(' + count.to_s + '試行目)'
        break
      end
    end
  end
end

# 構成配列
word_ary = ['pen', 'apple', 'pineapple']

# 正解配列
correct_ary = ['pen', 'pineapple', 'apple', 'pen']

# 成功時に表示する文字列
success_str = 'ペンパイナッポーアッポーペン'

# 実行
ppap(word_ary, correct_ary, success_str)   

急にコードが長くなったので人によっては難しいかも

5.7 オブジェクト指向

インスタンスを作ってからメソッドを使ったり、継承はオブジェクト指向を勉強してないと難しいかも

第6回で詳しく勉強するらしい

6. 第6回 変数

6.1 インスタンスメソッド

インスタンスを生成してから、メソッドを使う

@home = Home.new
@home.door1
またはHome.new.door1 メソッドチェーン

        

6.2 クラスメソッド

Home.new

インスタンスを生成しなくてもクラスに対して直接呼び出すことができる
    
他にも

class School

  def self.room
  end

  def School.room
  end

end

selfをつけたり、class名をつけるとインスタンスを生成しなくても使える
こう書くとSchool.roomで使える
roomがクラスメソッド

6.3 アクセススコープ

 メソッドはその呼び出しを制限することができる。3種類の制限レベルがある。普通は、publicレベル

アクセススコープ名 内容
public どのオブジェクトからも呼び出し可能(公開)
protected 同一クラスとそのサブクラスからのみ呼び出し可能
private 同一クラスとそのサブクラスからのみ呼び出し可能。レシーバを指定して呼び出すことができない。
class Shop
  public
  def uriba
    p “売り場”
  end

  protected
  def vip_floor
    p “売り場”
  end

  private
  def staff_room
    p "事務所"
  end
end

public~protectedまでがpublic

protected~privateまでがprotected

privateから下がprivate

public

private

public

みたいにはしない。権限のゆるい順から上に書く。

アクセススコープも継承される。

何でもかんでも使えるようにするのではなくて、必要なところだけを使えるように最低限決めておく。

権限が必要ないものにまで権限を与えるとおかしくなる。

6.4 変数

種類 書き方 スコープ(守備範囲) 使用頻度
ローカル変数 hoge 定義した場所からメソッド定義(他にもある)が終わるまで
インスタンス変数 @hoge クラス内に定義されているインスタンスメソッドからならOK
クラス変数 @@hoge クラス内のどこでもOK
グローバル変数 $hoge クラスの外でもOK 激低
def addition
  a = 4
  b = 3

# sumのスコープの始まり
  sum = 0

  sum = a + b
  sum = sum + b
end

# sumのスコープの終わり

puts sum

NameError (undefined local variable or method `sum' for main:Object)

スコープの外でローカル変数を使おうとするとエラーになる

class Blog
  def initialize(title)
    title = title
  end

  def title
    title
  end
end

Blog.new("hogehoge").title

これもエラーになる

class Blog
  def initialize(title)
    @title = title
  end

  def title
    @title
  end
end

Blog.new("hogehoge").title

インスタンス変数はクラス内で定義されているインスタンスメソッドからは使える

スコープの違いによるメリットは、プログラムの設計の効率性と無用に参照されないようにできること

インスタンスに初期値が必要な理由はインスタンスを区別するため

class Child
  def initialize(name)
    @name = name
  end
end

Child.new("聖也")
=> #<Child:0x00007ff1a60cc908 @name="聖也">

Child.new("真司")
=> #<Child:0x00007ff1a5980c80 @name="真司">

Child.new("亮洋")
=> #<Child:0x00007ff1a5985ed8 @name="亮洋">

変数のスコープの理由でインスタンスに初期値を持たせられるのはインスタンス変数だけである

class Child
  def initialize(name)
    name = name #「@」をつけずに実行
  end
end

=> #<Child:0x00007ff1a60d4dd8>

7. 第7回 配列とハッシュ

7.1 配列

配列の要素は何を入れてもいい

要素のデータ型はバラバラでもいい。例えば、文字列と配列と数値を入れてもいい。

オブジェクト.methodsでそのオブジェクトに使えるメソッド一覧が配列で返される

オブジェクト.methods.countで使えるメソッドの数が表示される

teacher = ["noro", "miyashita"]

teacher.methods
=> [:to_h, :include?, :at, :fetch, :last, :union, :difference, :push, :append, :pop, :shift, :unshift, :each_index, :join, :rotate, :rotate!, :sort!, :sort_by!, :collect!, :map!, :select!, :filter!, :keep_if, :values_at, :delete_at, :delete_if, :reject!, :transpose, :fill, :assoc, :rassoc, :uniq!, :compact, :compact!, :*, :flatten, :flatten!, :&, :shuffle, :shuffle!, :permutation, :sample, :+, :combination, :-, :repeated_combination, :sort, :repeated_permutation, :bsearch_index, :product, :count, :find_index, :select, :filter, :reject, :collect, :map, :bsearch, :first, :all?, :any?, :one?, :none?, :reverse_each, :zip, :take, :take_while, :drop, :drop_while, :cycle, :sum, :uniq, :|, :insert, :<=>, :<<, :index, :rindex, :replace, :==, :clear, :pack, :[], :[]=, :empty?, :eql?, :max, :min, :reverse, :inspect, :concat, :prepend, :reverse!, :length, :size, :each, :to_ary, :delete, :to_a, :to_s, :slice, :slice!, :dig, :hash, :lazy, :to_set, :find, :entries, :sort_by, :grep, :grep_v, :detect, :find_all, :flat_map, :collect_concat, :inject, :reduce, :partition, :group_by, :minmax, :min_by, :max_by, :minmax_by, :member?, :each_with_index, :each_entry, :each_slice, :each_cons, :each_with_object, :chunk, :slice_before, :slice_after, :slice_when, :chunk_while, :chain, :addition, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :instance_variable_set, :protected_methods, :instance_variables, :private_methods, :method, :public_method, :public_send, :singleton_method, :define_singleton_method, :extend, :to_enum, :enum_for, :===, :=~, :!~, :respond_to?, :freeze, :object_id, :send, :display, :class, :nil?, :dup, :singleton_class, :clone, :then, :itself, :yield_self, :untaint, :taint, :tainted?, :trust, :untrust, :untrusted?, :singleton_methods, :frozen?, :methods, :public_methods, :equal?, :!, :instance_exec, :!=, :instance_eval, :__id__, :__send__]

teacher.methods.count
=> 188

配列にインスタンスを入れることもできる

class Blog
  def initialize(title)
    @title = title #初期値をセット
  end

  def title
    @title
  end
end

array = []

3.times do |n|
  blog = Blog.new("title#{n}") #インスタンス生成
  array << blog #作ったインスタンスを配列に追加
end

p array

#=> [#<Blog:0x00007ff1a68589d8 @title="title0">, #<Blog:0x00007ff1a6858960 @title="title1">, #<Blog:0x00007ff1a68585f0 @title="title2">]

array[0]
#=> #<Blog:0x00007ff1a68589d8 @title="title0">

array[0].title
#=> "title0"

7.2 ハッシュ

ハッシュのキーの頭文字はアルファベットの小文字・大文字か_

数値が先頭はダメ

ハッシュのバリューを取り出すには

ハッシュ[:キー]
とすると、キーに対応するバリューが返される

ハッシュの最後に追加するには

ハッシュ.store(:キー, バリュー)
member = {ceo: "noro", rails_teacher: "miyashita", ai_teacher: "nakao"}
member.store(:rails_mentor, "aoki")
member

#=>       => {:ceo=>"noro", :rails_teacher=>"miyashita", :ai_teacher=>"nakao", :rails_mentor=>"aoki"}

has_key?メソッドは、ハッシュのキーの中に引数で指定したキーがあればtrueを返すメソッド

member = {ceo: "noro", rails_teacher: "miyashita", ai_teacher: "nakao"}
member.has_key?(:ceo)

#=> true    

なかったらfalseを返す

ハッシュのネストを取り出すには

params = {
"blog"=>{"title"=>"aaa", "content"=>"bbb"}
}

params[:blog][:content]
#=> "bbb"

:オブジェクト名はシンボルリテラルで、クラス名やメソッド名に使う

変数と分けるために書き分ける

変数をたくさん使うとメモリをたくさん使ってしまうので、あまり使わず配列とかハッシュとかを使う

8. 第8回 APIドキュメント

RubyのAPIとは最初から用意されているライブラリ、オブジェクトクラスやデータ構造、メソッドなど

参考
オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル

8.1 組み込みライブラリ

Ruby本体に組み込まれているため何もしなくても使える

組み込みではないものはrequireを書かないと使えない

その中から一部を紹介する

8.1.1 Objectクラス

全てのクラスのスーパークラス。オブジェクトの一般的な振る舞いを定義する

このクラスのメソッドは上書きしたり、未定義にしたりしない限り全てのオブジェクトで使える

https://docs.ruby-lang.org/ja/latest/class/Object.html

8.1.2 Arrayクラス

配列

[1, 2, 3]
でもいいし
Array[1, 2, 3]
と書いても同じ

https://docs.ruby-lang.org/ja/latest/class/Array.html

8.1.3 Hashクラス

hash

https://docs.ruby-lang.org/ja/latest/class/Hash.html

8.1.4 ENVオブジェクト

環境変数を表すオブジェクト

https://docs.ruby-lang.org/ja/latest/class/ENV.html

8.1.5 SyntaxErrorクラス

ソースコードに文法エラーがあったときに発生する

https://docs.ruby-lang.org/ja/latest/class/SyntaxError.html

8.2 標準添付ライブラリ

Rubyと一緒にOSにインストールされているため、requireで参照することで呼び出せる

その中から一部を紹介する

8.2.1 erbライブラリ

eRuby スクリプトを扱うためのライブラリ

ERBクラスはeRuby スクリプトを処理するクラス

ERB クラスを使うためには require 'erb' する必要がある

 <% %>が使えるのはERBクラスを使っているから

https://docs.ruby-lang.org/ja/latest/library/erb.html

8.2.2 dateライブラリ 

日付をあつかうためのライブラリ

DateTimeクラスは日付だけでなく時刻も扱えるDateのサブクラス

https://docs.ruby-lang.org/ja/latest/library/date.html

8.2.3 開発

irbライブラリを使うと、Ruby の式を標準入力から簡単に入力・実行することができる

https://docs.ruby-lang.org/ja/latest/library/irb.html

8.2.4 ネットワーク

webrickライブラリは汎用HTTPサーバーフレームワーク。HTTPサーバが簡単に作れる。

require 'webrick'
srv = WEBrick::HTTPServer.new({ :DocumentRoot => './',
                                :BindAddress => '127.0.0.1',
                                :Port => 20080})
srv.mount('/view.cgi', WEBrick::HTTPServlet::CGIHandler, 'view.rb')
srv.mount('/foo.html', WEBrick::HTTPServlet::FileHandler, 'hoge.html')
trap("INT"){ srv.shutdown }
srv.start

これを叩くと、ブラウザで http://127.0.0.1:20080/ にアクセスできるようになる

このコマンドを叩いたディレクトリのファイル一覧が見られるっぽい

https://docs.ruby-lang.org/ja/latest/library/webrick.html

9.  第9回 JSONデータを生成する

9.1 インターネット上からの情報の取得方法

open-uriライブラリは標準添付ライブラリの一つ。http/ftp に簡単にアクセスするためのクラス。

https://docs.ruby-lang.org/ja/latest/library/open=2duri.html

require 'open-uri'
open("http://www.ruby-lang.org/") {|f|
  f.each_line {|line| p line}
}

これで指定したURLのHTMLとオブジェクトが返ってくる

"<!DOCTYPE html>\n"
"<html>\n"
"  <head>\n"
"    <meta charset=\"utf-8\">\n"
"    <title>Ruby Programming Language</title>\n"
"    <script type=\"text/javascript\">\n"
"      var languages = {\n"
"        \"bg\":    \"bg\",\n"
"        \"de\":    \"de\",\n"
"        \"es\":    \"es\",\n"
"        \"fr\":    \"fr\",\n"
"        \"id\":    \"id\",\n"
"        \"it\":    \"it\",\n"
"        \"ja\":    \"ja\",\n"
"        \"ko\":    \"ko\",\n"
"        \"pl\":    \"pl\",\n"
"        \"pt\":    \"pt\",\n"
"        \"ru\":    \"ru\",\n"
"        \"tr\":    \"tr\",\n"
"        \"vi\":    \"vi\",\n"
"        \"zh-CN\": \"zh_cn\",\n"
"        \"zh-TW\": \"zh_tw\"\n"
"      };\n"
"\n"
"      var code = window.navigator.language || window.navigator.userLanguage || \"en\";\n"
"      if (code.substr(0,2) !== \"zh\") { code = code.substr(0,2); }\n"
"\n"
"      var language = languages[code];\n"
"      if (!language) { language = \"en\"; }\n"
"\n"
"      document.location = \"/\" + language + \"/\";\n"
"    </script>\n"
"    <noscript>\n"
"      <meta http-equiv=\"refresh\" content=\"0; url=/en/\">\n"
"    </noscript>\n"
"  </head>\n"
"  <body>\n"
"    <p><a href=\"/en/\">Click here</a> to be redirected.</p>\n"
"  </body>\n"
"</html>\n"
=> #<StringIO:0x00007f86499dc840 @base_uri=#<URI::HTTP http://www.ruby-lang.org/>, @meta={"server"=>"Cowboy", "strict-transport-security"=>"max-age=31536000", "x-served-by"=>"cache-itm18835-ITM", "x-cache"=>"HIT", "x-cache-hits"=>"1", "x-timer"=>"S1551849421.669958,VS0,VE5", "content-type"=>"text/html", "etag"=>"W/\"1a21a6606a9480e0505fe61b247a60b7\"", "x-frame-options"=>"SAMEORIGIN", "via"=>"1.1 vegur, 1.1 varnish", "content-length"=>"460", "accept-ranges"=>"bytes", "date"=>"Wed, 06 Mar 2019 05:17:00 GMT", "age"=>"1676", "connection"=>"keep-alive", "vary"=>"Accept-Encoding"}, @metas={"server"=>["Cowboy"], "strict-transport-security"=>["max-age=31536000"], "x-served-by"=>["cache-itm18835-ITM"], "x-cache"=>["HIT"], "x-cache-hits"=>["1"], "x-timer"=>["S1551849421.669958,VS0,VE5"], "content-type"=>["text/html"], "etag"=>["W/\"1a21a6606a9480e0505fe61b247a60b7\""], "x-frame-options"=>["SAMEORIGIN"], "via"=>["1.1 vegur", "1.1 varnish"], "content-length"=>["460"], "accept-ranges"=>["bytes"], "date"=>["Wed, 06 Mar 2019 05:17:00 GMT"], "age"=>["1676"], "connection"=>["keep-alive"], "vary"=>["Accept-Encoding"]}, @status=["200", "OK"]>

9.2 JSON

CSVは表みたいに見た目

XMLはHTMLみたいな見た目

JSONはハッシュみたいな見た目

JSONは通信時のデータ量を減らせて、記述が簡単で人が理解しやすい

用途としてデータフォーマットが最適

標準添付ライブラリjsonを使えばJSONから配列やハッシュに変換できる

require 'open-uri'
require 'json'

uri = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=130010'
response = JSON.load(open(uri).read)

これでuriのJSONがハッシュで返される

title = response['title']
=> "東京都 東京 の天気"

weather = response['forecasts'].first
=> {"dateLabel"=>"今日", "telop"=>"曇時々雨", "date"=>"2019-03-06", "temperature"=>{"min"=>nil, "max"=>{"celsius"=>"13", "fahrenheit"=>"55.4"}}, "image"=>{"width"=>50, "url"=>"http://weather.livedoor.com/img/icon/10.gif", "title"=>"曇時々雨", "height"=>31}}

message = "#{weather['date']}#{title}は「#{weather['telop']}」です!"
=> "2019-03-06の東京都 東京 の天気は「曇時々雨」です!"

どのサイトでもこれが使えるわけではなく、Web APIでJSONを返してくれるようなサイトならJSONから配列・ハッシュに変換できる

.classとするとクラス名がわかる

response.class
#=> Hash

ハッシュの書き方は2種類あるっぽい

a = {"b": 1, "c": 2, "d": 3}
a[:"b"]
#=> 1

a["b"]
#=> nil

a = {"b"=>1, "c"=>2, "d"=>3}
a["b"]
#=> 1

a[:"b"]
#=> nil

キーとバリューを:で分けるか、=>で分けるかで取り出し方が違うっぽい
"b":はシンボルで:"b"やb:と同じ
"b"は文字列なのでシンボルとは違う
記法の違いというよりは文字列とシンボルは違うものなので、指定の仕方が違う

10.  第10回 入門総集編

カプセル化

内部に何が入ってるかを意識せずに、指示や命令を与えることができる仕組み

クラスの中身を細かく知らなくても、クラスの役割やできることがわかっていればクラスに任せられる

ポリモルフィズムは同じ種類のものでもそれぞれが異なるものとして動くことができる仕組み

同じクラスから生成されたインスタンスでも初期値によって、違うインスタンスを生成することができる

1つのものから多様性を作ることができる

色々なものを作るためにたくさんのものを作る必要がない

おわりに

最後まで読んでいただきありがとうございました。
次はRuby実践の内容をまとめた記事を書きます!
QiitaやTwitterなどにコメントをしてもらったり、SNSでシェアしてもらえるとうれしいです!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away