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

Ruby クラス

More than 1 year has passed since last update.

クラス

プログラミングでつくりたい「もの」を生成するには、まずその「設計図」を用意する必要があります。
設計図のことをクラス、「もの」のことをインスタンスと呼びます。

インスタンスを生成するステップ

① クラスを用意する
② クラスからインスタンスを生成する
③ インスタンスに情報を追加する

① クラスを用意する

まずはクラス(設計図)を用意します。
クラスは「class クラス名」とすることで定義できます。
クラス名は必ず大文字で始めることと、「end」を書く必要があります。

例)

class Menu #クラス名は大文字で始める

end

② クラスからインスタンスを生成する

クラス(設計図)を元に、新しくインスタンスを生成するには、「クラス名.new」とします。
また、「変数名 = クラス名.new」とすることで、生成したインスタンスを変数に代入することができます。

例)

class Menu

end

menu1 = Menu.new #Menuクラスからインスタンスを作成し、変数 menu1に代入

インスタンス変数

インスタンス変数とは、インスタンスごとに独立して持つ変数である。
インスタンス変数のスコープはクラス内のメソッドであればどのメソッドでも生成した値と変わらず呼び出すことが可能です。

attr_accessor

attr_accessorとはインスタンス変数にアクセスするために元からRubyに用意された機能のひとつです。
「attr_accessor :インスタンス変数」と入力します。
「attr_accessor :インスタンス変数」と書かないと、インスタンス変数にアクセスできないのでインスタンス変数を呼び出すことができません。

③ インスタンスに情報を追加しよう

インスタンスに情報をもたせるには、インスタンス変数に値を代入する必要があります。
具体的には「インスタンス.変数名 = 値」とすることで、そのインスタンス変数に値を代入することができます。
また、「インスタンス.変数名」とすることで、そのインスタンス変数の値を用いることができます。

例)

class Menu
  attr_accessor :name
  attr_accessor :price
end

menu1 = Menu.new
menu1.name = "すし" #インスタンス(menu1)のインスタンス変数(name)に文字列("すし")を代入している
puts menu1.name

コンソール

すし

システムをつくる

クラスに処理を追加する

クラスの中ではメソッドを定義することができます。
クラスの中で定義し、インスタンスに対して呼び出すメソッドのことをインスタンスメソッドと呼びます。
インスタンスメソッドは、「インスタンス.メソッド名」のようにすることで、そのメソッドを呼び出すことができます。

例)

class Menu
  attr_accessor :name
  attr_accessor :price

  def show  #showメソッドを定義
    puts "私はメニューです"
  end
end
menu1 = Menu.new
menu1.show #クラスの中で定義したメソッドを呼び出す 

コンソール

私はメニューです

インスタンスメソッドも、メソッドと同様に引数を受け取ったり戻り値を返すことができます。

例)

class Menu

  def show(data)  
    return "私は#{data}です"
  end
end
menu1 = Menu.new
puts menu1.show("メニュー")

コンソール

私はメニューです

インスタンスメソッドの中でインスタンス変数を扱う

インスタンスメソッドの中では、特殊な変数「self」を用いて「self.変数名」とすることで、インスタンス変数を扱うことができるようになります。

例)

class Menu

  def show_name
    puts "私は#{self.name}です"
  end
end
menu1 = Menu.new
menu1.name = "ピザ"
menu1.show_name #インスタンスメソッドの呼び出し

コンソール

私はピザです

インスタンスメソッドでは、変数「self」に、呼び出したインスタンス自身が代入されています。

initializeメソッド

initializeメソッドとはインスタンスを生成した直後に処理を実行することができるメソッドである。
initializeメソッドは、「クラス名.new」でインスタンスを生成した直後に自動で呼び出されます。

例)

class Menu
    ...
  def initialize
    puts "メニューが生成されました"
  end
    ...
end
menu1 = Menu.new

コンソール

メニューが生成されました

initializeメソッドでインスタンス変数を扱う

例)

class Menu
    ...
  def initialize
    self.name = "ピザ"  #インスタンス生成時に、"ピザ"をインスタンス変数nameに代入
  end
    ...
end
menu1 = Menu.new
puts menu1.name

コンソール

ピザ

initializeメソッドの引数

initializeメソッドは通常のインスタンスメソッドと同じように、引数を渡すこともできます。
その際、「クラス.new」に対して引数を渡すことで、initializeメソッドにその値を渡すことができます

例)

class Menu
    ...
  def initialize(message)
    puts message
  end
    ...
end
menu1 = Menu.new("こんにちは")

コンソール

こんにちは

initializeメソッドでインスタンス変数に値を代入する

initializeメソッドでインスタンス変数に引数の値を代入することで、インスタンス毎にインスタンス変数の値を変えることができます。
また、キーワード引数を使うことで見やすく書くことができます。

例)

class Menu
    ...
  def initialize(name:,price:)
    self.name = name
    self.name = price
  end
    ...
end
menu1 = Menu.new(name:"ピザ",price:800)

インスタンスの配列

Menuクラスから生成したインスタンスも、配列の要素にすることが可能です。

例)

*
class Menu
  attr_accessor :name
  attr_accessor :price

  def initialize(name:, price:)
    self.name = name
    self.price = price
  end

  def info
    return "#{self.name} #{self.price}円"
  end

  def get_total_price(count)
    total_price = self.price * count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end
end *

menu1 = Menu.new(name:"ピザ",price: 800)
menu2 = Menu.new(name:"すし",price: 1000)
  ...
menus = [menu1,menu2, ...]


menus.each do |menu|
  puts menu.info
end

# この例から、*~*の部分は「*省略」とします。

コンソール

ピザ 800円
すし 1000円
  ...

繰り返し処理で番号をつける

番号をつけるには、番号を保存するための変数をeach文の外で用意して、each文の処理の中で値を1だけ増やして更新するようにします。

例)

# *省略

menu1 = Menu.new(name:"ピザ",price: 800)
menu2 = Menu.new(name:"すし",price: 1000)
  ...
menus = [menu1,menu2, ...]

index = 0

menus.each do |menu|
  puts "#{index}. #{menu.info}"
  index += 1
end

コンソール

0. ピザ 800円
1. すし 1000円
  ...

gets.chomp

入力を受け付けるには「gets.chomp」を使います。このコードが実行されると、コンソールが入力待機状態になります。
「変数 = gets.chomp」とすることで、エンターキーを押されるまでに入力された値を変数に代入することができます。

例)

puts "名前を入力してください"

name = gets.chomp  # 入力した内容を変数に代入
puts "#{name}さん、いらっしゃいませ"

コンソール

名前を入力してください

Yukihiroと入力すると...

Yukihiroさんいらっしゃいませ

数値の場合は、「gets.chomp.to_i」とすることで、入力された内容を数値に変換し、計算などにも使えるようになります。

例)

puts "1つ100円のお菓子があります"
puts "いくつ買いますか?"

count = gets.chomp.to_i  # 入力した内容を数値に変換

total_price = 100 * count

puts "お会計は#{total_price}円です"

コンソール

1つ100円のお菓子があります
いくつ買いますか?

3と入力すると...

お会計は300円です

require

別のファイルに入っているコードを一番上の行で、「require "./〇〇"」とすることで、別のファイルのコードを読み込めるようになります。

例)

〇〇.rb

class 〇〇
  ...
  ...
end

△△.rb

require "./〇〇"  # 〇〇.rbの読み込み

...
...

おわり

Ruby 基礎
Ruby 基礎(配列について)
Ruby メソッド

Why not register and get more from Qiita?
  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
No 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
ユーザーは見つかりませんでした