Ruby PR

Ruby初心者に向けた基礎知識まとめ!ハッシュとシンボルどちらを使うべき?

Ruby初心者に向けた 基礎知識まとめ! ハッシュとシンボル どちらを使うべき?
記事内に商品プロモーションを含む場合があります

Rubyはプログラミング初学者にも人気なサーバーサイド言語の1つです。

Rubyを学ぶことでちょっとしたシステムを作れたり、Ruby On Railsというフレームワークを使うことでウェブサービスを作ることも出来るようになります。

そこで今回の記事ではRubyを学び始めた方に向けて、僕がRubyを勉強した時に感じた覚えておくと良い基礎をまとめてみました。

プログラミングは言葉だけでは伝えにくい部分も多いので、今回の記事ではコードもセットで解説をしています。

Rubyのクラスはキャメルケースで書く

Rubyでクラスを定義する際には最初の文字を大文字にしたキャメルケース、アッパーキャメルケースが推奨されています。

Rubyのクラス名

  • OK BakeryShop
  • NG bakeryShop
  • NG bakery_shop

Rubyのメソッドはスネークケースで書く

Rubyではメソッドは小文字のスネークケース、ローワースネークケースが推奨されているようです。

Rubyのメソッド名

  • OK get_area
  • NG Get_Area
  • NG getArea
  • NG GETAREA

言語によって異なるので、どちらで書くべきか最初は悩むと思いますがここは慣れて行きましょう。

Rubyの変数名はスネークケースで書く

Rubyの変数はメソッドと同様に、ローワースネークケースで定義していきます。

Rubyの変数名

  • OK total_score
  • NG Total_Score
  • NG totalScore
  • NG TOTALSCORE

Rubyではメソッドを呼び出す際の「()」を省略出来るので、変数なのかメソッド呼び出しなのかがパット見でわからないのが痛い所。

Rubyのコメントアウトは#を使う

PHPやGolangでは「//」を使ってコメントアウトをしますがRubyでは「#」を使います

コメントアウト


# ここにコードの補足を書いたり出来る

ハッシュとシンボルどちらを使うべきか

配列のキーにアクセスする際に利用出来るこの2つの方法。

結論としてはスッキリ書けてコードも読みやすいシンボルがおすすめ。

Title


# ハッシュ
user = {"name" => "himakuro", "country" => "Japan}
puts user["name"]

# シンボル
user = {name: "himakuro", country: Japan}
puts user[:name]

真偽値(boolean)を返すメソッドには ? を付ける

真偽値を返すメソッド


def positive?(number)
  return number >= 0
end

慣習的なやつらしいです。

パット見でメソッドの戻り値の型が判断出来るのは良いですね。

キーワード引数をは使うべきか

Rubyのメソッドは下記のように定義して呼び出すことが出来ます。

通常の引数の場合


# 通常のメソッド
def get_area(height, width)
  return height * width
end

# メソッド呼び出し
get_area(10, 5)

しかし上記の方法だと引数が増えた時に、どの値に対して何を入れているのか分かりづらくなるという問題があります。

そこでRubyはキーワード引数という、どの引数に対してどの値をセットするかを、明示的に記述した方法でも書くことが出来ます。

キーワード引数を使った場合


# キーワード引数を使ったメソッド
def get_area(height:, width:)
  return height * width
end

# キーワード引数を使ったメソッド呼び出し
get_area(height:10, width:5)

引数の数が少ないと冗長な書き方の様にも感じますが、ケアレスミスを無くすという意味では有効な気がします。

またキーワード引数で定義をしていると、渡す引数の順番を入れ替えたとしても動作しますが、混乱を招くだけなので引数の順番通りに渡してあげるのが良いです。

キーワード引数を使った場合その2


# キーワード引数を使ったメソッド
def get_area(height:, width:)
  return height * width
end

# 先にwidthから渡しても一応動く
get_area(width:5, height:10)

インスタンスの生成にはnewを使う

インスタンス生成


class Shop
  def get_name
    return "パン屋"
  end
end

shop = Shop.new
puts shop.get_name

インスタンス生成時に自動で呼ばれるメソッド

Rubyでインスタンスを生成すると自動で呼ばれるメソッドは「initialize」

initializeメソッド


class Shop
  def initialize
    # 自動で呼ばれる
    puts "initialized"
  end
end

shop = Shop.new

initializeメソッドに引数を渡すことも可能

initializeメソッドに引数


class Shop
  def initialize(name:)
    # 自動で呼ばれる
    puts "#{name}"
  end
end

shop = Shop.new(name: "パン屋")

インスタンスメソッドの中でのインスタンス変数呼び出し

インスタンス変数呼び出し


class Shop
  attr_accessor :name

  def initialize(name:)
    self.name = name
  end
  def get_name()
    return self.name
  end
end

shop = Shop.new(name: "パン屋")

「this」と間違えそうですが Rubyの場合は「self」を使います。

継承は < を使う

継承の実装


class Shop
  attr_accessor :name

  def initialize(name:)
    self.name = name
  end
  def get_name()
    return self.name
  end
end

class BakeryShop < Shop
end

bakeryShop = BakeryShop.new("パン屋1")
bakeryShop.getName

上記の例ではBakeryShopはShopを継承しているので、親となるShopが持つメソッドや変数にアクセスをすることが可能になります。

親のメソッドを上書きするオーバーライド

親のメソッドをベースとしたいけど、一部のメソッドは書き換えたい様なケースに使えるのがオーバーライドです。

オーバーライドの実装


class Shop
  attr_accessor :name

  def get_name()
    return self.name
  end
end

class BakeryShop < Shop
  # Shopクラスのget_nameは使わず、下記のget_nameが呼び出される
  def get_name()
    return "パンの名前は#{self.name}です"
  end
end

bakeryShop = BakeryShop.new("パン屋1")
puts bakeryShop.getName
# パンの名前はパン屋1ですと出力される

継承元のメソッドはsuperで呼び出す

Rubyでは他の言語と同様に、継承元(親)のメソッドを呼び出すことも可能です。

superの使い方


class Shop
  attr_accessor :name

  def initialize(name:)
    return self.name
  end
end

class BakeryShop < Shop
  attr_accessor :price
  def initialize(name:, price:)
    # Shopクラスのinitializeが呼び出される
    super(name: name)
    self.price = price
  end
end

bakeryShop = BakeryShop.new
bakeryShop.getName

まとめ

今回の記事ではRuby初心者に向けた、知っておくと良いポイントをまとめてみました。

RubyはPHPとよく比較されますが細かい記述方法は異なる部分が多いです。

今回の記事を元にしっかりとRubyの記法を覚えて、今後のコードリーディングや実装に活かしていきましょう。

ABOUT ME
himakuro
新卒で入社したブラック企業から脱出して超ホワイトな会社に転職。エンジニア歴は7年で普段はウェブサービス作ったりブログを書いたり、MENTAで未経験者の方にプログラミングを指導しています。
PR
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール