Rubyを使って初歩的なことを色々やってみる#2

Sublime textが使いやすすぎていやというかこのブログだとhtml形式すらも打ちにくすぎて一回テキストでメモってから一気にこっちに貼り付けるっていう手法があまりにも楽ちんすぎるので…。


# ハッシュオブジェクトについて
# ハッシュは配列と同じように複数の値を管理するものだが、配列は値だけ管理するのに対してハッシュはそれにプラスして識別キーをつけることが可能
# 数値だけではなくそれが誰の売上だったのかを管理したい場合
sales = {"xxx" => 200, "yyy" => 300}
p sales["xxx"] # 200
# ちなみにキーが文字列だった場合にシンボルという書き方も可能
sales = {:xxx => 200, :yyy => 300} # こっちのほうが動作処理が早く広く使われている
sales = {xxx: 200, yyy: 300}
p sales[:xxx] # 200
# 以上の文は全て同じ意味
p sales.size # 要素数 2
p sales.keys # keyだけを返してくれる [:xxx, :yyy]
p sales.values # valueだけを返してくれる [200, 300]
p sales.has_key?(:xxx) # keyがあるかどうかを真偽値で返す true

# オブジェクトを相互に変換する方法
a = 10
b = "5" # 5というオブジェクト、数字ではない
p a + b # これを足し算してもオブジェクトが違うのでエラーになる
p a + b.to_i # 文字列を整数値に直したい場合 15で返ってくる
p a + b.to_f # 実数にしたい場合 15.0という形で返ってくる
p a.to_s + b # aの10を文字列に変えて105と連結させたい場合
h = {xxx: 100, yyy: 200} # ハッシュと配列の相互変換。これで配列に直ったよ
p h.to_a # [[:xxx, 100], [:yyy, 200]]
p h.to_h # ハッシュへの変換 {:xxx=>100, :yyy=>200}

# %記法 文字列や配列の別の書き方
s = "hello"
s = %Q(hello) # ちなみに括弧のところは記号でも波括弧でもよい。ダブルクオーテーションの場合は大文字のQを省略してもよい
s = "hel\"lo" # 文字列の中で"を使いたい場合は文字列との区別をつけるためにバックスラッシュをつけなければならない
s = %Q(hel"lo) # ただこちらの場合はバックスラッシュは要らない

s = 'hel\"lo'
s = %q(hel"lo) # シングルクォーテーションの場合はQを小文字に変える

a = ["a", "b", "c"] # 要素が文字列の時に%を使える
a = %W(a b c) # 上記と全く同じ意味

a = ['a', 'b', 'c'] # シングルクォーテーション
a = %w(a b c)


=begin

条件分岐 if

if 条件

else

end

> < より大きい、より小さい
>= <= 以上、以下
== != と等しい、と等しくない

それらの条件を組み合わせるための
&& (AND)

(OR)

! (NOT)

=end

socre = 80
if socre > 60
puts "Ok!"
elsif score > 40
puts "SOSO..." # それ以外で40より大きかったらこの処理。50点にvalueを変えるとSOSO...と出てくる
else
puts "NG!"
end # OK!と出るはず。これが60以下だとNG!となる

score > 40 && score < 60 # スコアが40より大きくて60より小さい

socre = 80
if socre > 60
puts "Ok!"
end
# 以上の式を短く書くためには
score = 80
puts "OK!" if score > 60 # OK!

# 真偽値と条件演算子
if x # == trueという演算子が省略されている。rubyならでは
puts "..."
end

=begin

true: それ以外 (0 '' を含む) *他の言語だと0とか空欄でもfalseになるがrubyは違うので注意
false: false nil(オブジェクトが存在しない)

条件演算子を使ってif else文を楽にかける
if 条件
a = b
else
a = c
end
を簡単に書くと、

a = 条件 ? b : c

=end

b = 10
c = 20
a = b > c ? b : c
puts a # 大きかった方をaに返す 20

b, c = 10, 20 # 多重代入

# 条件分岐 case
=begin
あるオブジェクトをいくつかの値と比較しながら処理を振り分けていく時に使える構文
頑張ればifels文でもかけるがこっちのほうがスッキリして見える

case 比較したいオブジェクト
when 値
処理
when 値
処理
when 値
処理
when 値
処理
else
処理
end
=end

signal = "red" # 信号の色によって処理を振り分ける

signal = "pink" # wrong signalと出るはず

case signal
when "red"
puts "STOP!"
when "green", "blue" # 複数指定可能
puts "GO!"
when "yellow"
puts "CAUTION!"
else
puts "wrong signal"
end

# 繰り返し処理
# times
# while
3.times do
puts "hello"
end # hello hello hello

3.times do |i|
puts "#{i}: hello"
end #で回数付きでhelloを表示してくれる。もちろん0から

i = 0
while i < 3 do
puts "#{i}: hello"
i += 1
end # 上記と全く同じ結果になる

# break: ループから抜けるための命令
# next: ループを一回スキップ

3.times do |i|
if i == 1
break
end
puts "#{i}: hello"
end # 0: hello 1以降処理がされてない

3.times do |i|
if i == 1
next
end
puts "#{i}: hello"
end # 1がスキップされて2になっている

# for
# each
for i in 0..2 do # 012を繰り返し表示させたいときのfor構文
puts i
end # 0から2までの範囲の数値を一つ一つiにいれて表示させている

for i in ["red", "blue", "pink"] do # 配列とかハッシュも使える
puts color
end # red blue pinkと表示される
# 配列とかハッシュに関してはforよりeachメソッドを使うことが多い
["red", "blue", "pink"].each do |color|
puts color
end # 上記と全く同じ処理

{"red"=>200, "blue"=>100, "pink"=>50}.each do |color, price|
puts "#{color}: #{price}" # 文字列の中で展開
end # red: 200, blue: 100, pink: 50とでる

# 関数的メソッドを作ってみる 直接的に呼び出せるメソッド

def sayHi # defの後に関数名を適当につけてあげるだけ
puts "hello!"
end

sayHi() # メソッド名の後に()をつけてあげることでメソッドと識別可能。hello!とでる

def sayHi(name) # メソッドにはオプションを持たせることが出来る。複数持っている場合はカンマ区切りで指定
puts "hello!" + name
end

sayHi("Tom")
sayHi("Bob")
# hello! Tom hello! Bobとなる

def sayHi(name = "Steve") # 引数には初期値を設定できる
puts "hello" + name
end # nameが設定されていない場合はSteveという初期値を使ってくれる

sayHi() # とするとhello! Steveとなってくれる

def sayHi(name = "Steve")
s = "hello!" + name # メソッドは返り値を持たせることも出来る。ここではsが返り値
return s # returnは省略可能
end
# 返り値を持つのでメソッドの結果を代入することが可能
greet = sayHi()
puts greet # hello! Steve

# このメソッドで定義された変数は外からアクセスできない!!
puts s # とやるとエラーを吐く