Ruby勉強ノート（ドットインストールを見ながら編）

ドットインストールを見ながら勉強したノートです。
.rbのファイルををコピペしてるので、表示がちょっと変かも
（scivolaさんに教えてもらって、表示が改善されました。ありがとうございます。）

```rb
puts "Hello World!"
=begin
 実行方法
 その１
 Interactive ruby　irb
 irbで返り値を表示するのはirbの機能
 exit
 その２
 ファイルに書き込んで
 ruby hoge,rb　で実行
 ;で区切ると１行内に複数書ける
=end

# 出力
print "hello world(print)"# 終わった後に改行がない
puts "hello world(puts)"#改行がある文字列に変換する
p "hello world(p)"#データ形式がわかる　クォートで囲んであって文字列とわかったりする

# 変数：データにつけるラベル
 msg = "hello world"# 英小文字始まり　全部小文字で書くことが一般的
 puts msg


# 定数:変更されないデータにつけるラベル（これは変更されると困るというもの）

ADMIN_EMAIL = "info@gratitude-happy.com" 

=begin
 英大文字始まり。最初が大文字なら定数と認識されるけど基本全部大文字で書くよ。
 値を後から変更しようとするとwarningがでるよ

 データ（全てオブジェクト）
 オブジェクト→いろんな便利な命令（＝メソッド）が詰まったデータ型くらいの認識でオッケー
=end

# メソッド(クラスで定義)
p "hello world" .length #11 スペースもカウントする

=begin
クラス＝オブジェクトの設計図のようなもの、全てのデータはなんらかのクラスに属している。
文字列 - stringメソッド（ruby コアリファレンスに入っている）
シングルでもダブルでもどちらでも文字列になります。 `#{}` はダブルの場合のみ展開されます
数値オブジェクト-Numerinクラス
=end

x = 10 #_を無視するので桁が大きい時は100_000_000
y = 20.5
z = Rational(1,3)

puts x,y,z

p x % 3
p x ** 3
p z * 2
p x += 5
p y.round

#文字列オブジェクト
name = "Rumiko Nishikawa"
x = "hello\tworld,\n #{name}"
y = 'hello\t world, \n#{name}'  #こっちはつかえない
z = "hello world\t"
puts x
puts y

#文字列連結  +  繰り返し  *
puts z + name
puts z * 5

=begin
メソッド
 ! 破壊的メソッド 元データも書き換えてしまう
 ? 真偽値を返すメソッド true false
=end

puts name.upcase
puts name

puts name.upcase!
puts name

p name.empty? #空文字かい？

#配列オブジェクト　コアリファレンス Array参照
sales = [5,8,4]
p sales[2]
sales[1]=10
p sales[1]
p sales[0..2] #0から2まで
p sales[0...2]#0から2未満
p sales[-1] #配列の一番最後
p sales[1, 2]#配列の"１"番目から２個分
sales[0...2] = [1, 2]#配列の０～２未満の数字を１，２に書き換える
p sales
sales[1,0] = [10, 11 , 12]#添え字の１から０個分のところに10,11,12を入れる
p sales
sales[0, 2] = [] #0から2個分を空配列にする
p sales
p sales.size#配列の要素数
p sales.sort#配列のソート
p sales.sort.reverse#配列のソート逆順　メソッドはつなげられる

p sales.push(100) #配列の末尾に100を追加
#sales <<101 <<102  #pushのショートカット末尾に101 102を追加
p sales

#ハッシュ  key value
sales = {"yamada" =>200, "tanaka" =>3000}
p sales["yamada"]

#シンボルを使うこともできる シンボル-識別子として使えるオフジェクト
#文字列を使うより動作が速い

sales = {:yamada =>200, :tanaka =>3000}
sales = {yamada:200, tanaka: 3000}
p sales[:tanaka] 
p sales.size
p sales.keys
p sales.values
p sales.has_key?(:yamada)

#オブジェクトの種別変換
a = 10
b = "5"
p a + b.to_i #int に変換
p a + b.to_f
p a.to_s + b

h = {yamada: 100, tanaka: 200}
p h.to_a  #配列に変換
p h.to_h #ハッシュに変換

#%記法
s = "hello"
s = %Q{hello} #記号か（）だったらなんでもよい !! {} ??でも
s = %(hello) #Qは省略できる
s = %(hell"o) 

# でエスケープしなくてもオッケー
# s = 'hello' 
# s = %q(hello)シングルクォーテのときは小文字ｑ
p s
puts s
b = ["a" ,"b" ,"c" ]
a = %W(a b c) #空白区切りで書く

#b = ['a' ,'b' ,'c' ]の場合は
#b = %w(a,b,c)と書く

p b
p a

#文字列や配列だと""をたくさん打つことになるので%記法も便利

score = 50
if score > 60
  puts "ok!"
elsif score >40  #"elsif"の綴りに気を付けよう
  puts "soso..."
else
  puts "NG!"
end

=begin
比較演算子
><
>= <=
== !=
&&
||
!
=end

score = 90
puts "great!"if score > 80 #後にif文をつなげることができる

if x # ==true省略
  puts "..."
end

=begin

false: false nil
true: それ以外(0 ''を含む)


if条件
  a = b
else
  a = c
end
a = 条件　? b : c
=end


b = 10
c = 20 # b, c = 10, 20 と一気に代入できる  多重代入
a = b > c ? b : c 
# ｂがcより大きかったらbを返して  そうでなければcを返しての意
puts a

=begin

# unless

a = 1
unless a == 0
 puts "aは0ではありません。"
end

a = 1
if a != 0
 puts "aは0ではありません。"
end



条件分岐 case

case 比較したいオブジェクト

when 値
  処理
when 値
  処理
when 値
  処理
else 処理
end
=end

signal = "blue"

case signal
when "red"
  puts "stop!"
when "green","blue"
  puts "go!"
when "yellow"
  puts "caution!" 
else
  puts "wrong signal"
end

#roop処理
#timesメソッド
#while文

3.times do |i|
  puts "#{i}:hello"
end

# upto　メソッド
#数値を指定した範囲内で変化させながら処理を実行する

1.upto(10) do |n|
 puts "■" * n
end

1.upto(10) do |n|
 puts "■" * (n * 3) 
 #改行スペースシビアなので気を付ける
end

#|i|で何回目の処理なのかをとることができる。０始まり


i = 0
while i < 3 do
 puts "#{i}:hello"
 i += 1
end


#break:ル:ープを抜ける
#next:ループをスキップ

3.times do |k|
  if k == 1
   #break 0回目のループで終わる
   next puts "スキップしてるよ"
  end
  puts "#{i}:good"
end

#for

for i in 0..2 do
 puts i
end

#for文は配列も扱えるよ
for color in ["red","blue","pink"] do
 puts color
end

#eachメソッド 配列バージョン
["momo","suika","kaki"].each do |fruit|
 puts fruit
end

#eachメソッド　ハッシュバージョン
{"momo"=>200, "suika"=>1000 ,"kaki"=>300}.each do |fruit, price|
 puts "#{fruit}:#{price}"
end
#[]で囲むと配列で出力されちゃうよ｛｝で書こうね

#関数的メソッド
#defで呼び出して　定義する

def sayHi
 puts "hello!"
end

sayHi()

#アレンジ

def sayHiname(name="ななし")
 puts "hello! " + name + "さん"
end

sayHiname("tanaka")
sayHiname("katou")
sayHiname()

#返り値　を持たせる

def sayHiname2(name="hoge")
 s = "hello! " + name + "さん"
 return s
end

greet = sayHiname2()
puts greet

#メソッドの中で宣言された変数は外からアクセスできない。アクセスするとundefined言われちゃうよ。

#クラス(オブジェクトの設計図)この中でメソッドの定義をしていく
#クラスから作られたオブジェクトのことをインスタンスと呼ぶ

class User #クラス名は必ず大文字から始まる

  @@count = 0 #クラス変数


  def initialize(name) 
   #クラスからオブジェクトを作るときに必ず実行される初期化処理
   @name = name
   #@から始まるものはインスタンス変数と呼ばれる
   
   @@count += 1
   #初期化される度にカウントを１ずつ増やす
  end

  def name
   return @name
  end

 def setName(newName)
  @name = newName
 end

  def sayHello
   #クラスの中でメソッドを定義する→インスタンスから呼び出すことができるインスタンスメソッドという
   puts "hello,my name is #{@name}"
  end
  
  def User.sayfrom #クラスメソッド
   puts "hello from User class(#{@@count}users)"
  end
end






class SuperUser < User #Userのクラスを継承して拡張できるよ
 
 def shout
  puts "HELLO! from #{@name}! I'm SuperUser!"
 end
end 

User.sayfrom()#クラスメソッドの実行
tom = User.new("tom")
bob = SuperUser.new("bob")
#インスタンスを作るときの決まり文句は.new
tom.sayHello()
bob.sayHello()
bob.shout()
User.sayfrom()
#bobさんはUserを継承したSuperUserなのでsayhelloもshoutも使えるけど
#tomさんはUserなのでshoutするとundefined言われちゃうよ

#アクセサ
=begin
基本クラスの外からインスタンス変数にアクセスできない
アクセスしたいときは別途メソッドを書く
例：
 取得する方　getter
 def name
   return @name
  end
 設定する方　setter
 def satName(newName)
  @name = newName
 end
 合わせてアクセサという
 
 一気にアクセサを生成するには
 attr_accessor :name　シンボルでインスタント変数の名前を与える
 attr_reader :name #getterだけ
 attr_writer :name #setterだけ
アクセサを使えば
kana.setName('momo')も簡単に
kana.name = 'momo'と書ける
=end

kana = User.new('kana')
kana.sayHello()
p kana.name
kana.setName('momo')
p kana.name
kana.sayHello()

#timeクラス
t = Time.now #クラスなので大文字始まり
t = Time.new(2016, 2, 8, 7, 00, 10)
p t.strftime("Updated:%y-%m-%d")
p t
p t.year
p t.month

t += 10 #秒単位で四則演算することができる
#ほかコアリファレンスのTimeクラス参照
p t

class Shop
 attr_accessor :name
 #シンボルの:の後スペースを空けない

 def initialize(name)
  @name = name
 end
 
 def print_details
  puts "shop:
 #{name}
 "
 end
end

module AnimalModule
 attr_accessor :animals
 
 def print_animals
  puts "animals :
  #{animals.join(',')}
  "end
 end
```