Ruby超初心者構文まとめ(Pythonとの比較も添えて)

# 概要
今後rubyを求められることがありそうだったので、手始めにどういう書き方をするのかをアウトプット
ほぼPythonしか使ってこなかったので、混ざりませんようにという願いを込めながら学習していきます。

注) 四則演算や変数宣言など、基本概念の特に意識しなくても良さそうなところは独断と偏見で飛ばしていますのでご了承くださいmm

# 文字出力
Pythonではprint("xxx")だがRubyでは、`puts`, `p`, `print`の3種類がある模様

~~しかも括弧が必要なくて、単なるダブルクウォートという形で違和感の塊ですね、、~~
↑よくよく調べていたらついてても良かったです、括弧がなくても良いよということでした

```rb
puts "rbrbrb"
puts"rbrbrb"
puts("rbrbrb")
# 全て同義
```

また、3種類の使い分けについてですが以下の内容になっています

```rb
# 出力される結果に改行がつく
puts "rbrbrb"

# 出力される結果のデータ型がわかる
# Integerの1なのかStringの1なのかが出力時にわかります
puts "1"
p "1"

# 出力される結果に改行がつかない
print "rbrbrb"
```

また変数に代入された文字列の展開方法は#{変数名}という形で展開ができるそうです
Pythonではf-Stringやstr.format()を使ったりしていましたね

```rb
var = "hen"

p "hensu is #{var}"
```

# for文, while文
- for文
`for {配列などの要素を表す変数} in {配列など} do ... end`を使用
基本の概念としてはどの言語とも同様、「do」と「end」が必要になります
どこまでがfor文の内容かは分かりやすいですね

```rb
members = ["A", "B", "C"]

for member in members do
    puts "#{member}" #「A」「B」「C」と出力される
end
```

- while文
`while {条件式} do ... end`を使用
こちらもfor文と同様の感想

```rb
members = ["A", "B", "C"]
excute_count = 0

while excute_count < 10 do
    puts "#{members}" #「["A", "B", "C"]」と10回分出力される
    excute_count += 1
end
```

# if文
`if...then elsif...then else...end`を使用
こちらもfor文と同様の感想、あとはelseifではなくてelsifもですね

```rb
members = ["A", "B", "C"]

for member in members do
    if member == "A" then
        puts "Aです！"
    elsif member == "B" then
        puts "Bですよ！"
    else
        puts "？？？"
    end
end
```

# 配列(array)
すでにこれまでの説明でも何回も使用していますが、配列の宣言には`[]`を使用します
for文などで使用するときの使用方法は[こちら](#for文-while文)で確認をお願いします

# 連想配列(hash)
Pythonでいうところの辞書に似ている所感
記載する以外にも他にありますが、基礎的なものとしてはこのような感じかなと

```rb
# 初期化方法
hash_var = {"a" => 1, "b" => 2, "c" => 3}

## 以下のように=>を省略する初期化もできる
## hash_var2 = {a: 1, b: 2, c: 3}

# 取り出し
hash_var["a"]

## 存在しないキーを指定すると例外やエラーが発生するのではなく、"nil"というものが返る
## nilはほぼnullと同義で、Rubyだからnilを使っているだけの模様
## hash_var["z"] => nil

# 要素の数
## lenではなくsizeを使う
hash_var.size

# keyだけ, valueだけ取り出したい時
## 括弧がないだけでPythonと同じ
hash_var.keys
hash_var.values

# for文回したい時
## Pythonと結構違う
hash_var.each do |key,val|
  puts key,val
end
```

# メソッド, クラス
- メソッド
メソッドの定義は`def`を使用します(これもPythonと同じ)
最後にendがつくのはもうお馴染みですね

```rb
# 配列の要素数だけ連想配列のバリューに0をもつ要素を追加して連想配列を作成するメソッド
def convert_array_to_hash(arr)
    return_hash = {}

    for element in arr do
        return_hash[element] = 0
    end

    return return_hash
end


origin_arr = ["A", "B", "C"]
converted_hash = convert_array_to_hash(origin_arr)
puts converted_hash

```

- クラス
    - メソッドをまとめておくところはPythonとさほど変わりがないですが、インスタンスの生成などが大きな差分かと思われます
    - オブジェクト指向なので、何か共通した型を用意してそれを元に作成・複製するようなイメージですね
    - また、インスタンス内の変数にアクセスするには`@マーク`をつける必要があります

```rb
# クラスの定義
class User
    def initialize(name)
        @name = name
    end

    def read_name
        @name
    end

    def update_name=(name)
        @name = name
    end
end

# Userクラスのインスタンスを作成
user = User.new("initialize user")
puts user.read_name # この時点では「initialize user」


user.update_name = "A"
puts user.read_name # この時点では「A」
```

クラス変数、インスタンス変数、クラスの継承については長くなりそうなので、また別で書くか実際に使ってみて理解したいと思います

# おわりに
結構Pythonと似ているところが多々あるなというのが所感でした(むしろ言語を一つでもある程度知っていればそういうパターンの方が多いのかも？)
また、久しぶりにオブジェクト指向やポリモフィズム(今回の記事では書いていないですが)について触れたのでどこか懐かしい雰囲気を感じました

次回は、フレームワーク使って何か作成するかしたいなと思います(色々試したい気分がマシマシなので)