1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby クラスとインスタンス

Last updated at Posted at 2023-08-09

Menu クラスのインスタンスを作成し、それぞれのインスタンス変数に値を設定して、コンソールで結果を表示します。

class Menu
  attr_accessor :name
  attr_accessor :price
end

# インスタンスを作成して値を設定
menu1 = Menu.new
menu1.name = "ハンバーガー"
menu1.price = 500

menu2 = Menu.new
menu2.name = "フライドポテト"
menu2.price = 250

# 結果を表示
puts "メニュー1: #{menu1.name} - ¥#{menu1.price}"
puts "メニュー2: #{menu2.name} - ¥#{menu2.price}"

上記のコードを実行すると、以下のような結果がコンソールに表示されるでしょう:

メニュー1: ハンバーガー - ¥500
メニュー2: フライドポテト - ¥250

この例では、Menu クラスのインスタンスを作成し、name と price のインスタンス変数に値を設定しています。そして、それぞれのメニューの情報をコンソールに表示しています。

attr_accessorとは

attr_accessor は、Rubyプログラミング言語において、インスタンス変数にアクセスするためのゲッター(getter)メソッドとセッター(setter)メソッドを自動的に生成するための便利なメソッドです。これにより、オブジェクトのプロパティを簡単に読み取ったり、変更したりすることができます。

具体的には、attr_accessor を使うことで、次のようなことが可能になります:

ゲッターメソッド(getter)の生成: インスタンス変数の値を取得するためのメソッドが自動的に生成されます。例えば、attr_accessor :name を使うと、name インスタンス変数にアクセスするための name メソッド(ゲッター)が生成されます。

セッターメソッド(setter)の生成: インスタンス変数の値を設定するためのメソッドが自動的に生成されます。例えば、attr_accessor :price を使うと、price インスタンス変数に値を設定するための price= メソッド(セッター)が生成されます。

以下は、attr_accessor の使用例です:

class Menu
  attr_accessor :name
  attr_accessor :price
end

menu = Menu.new
menu.name = "ハンバーガー"  # セッターメソッドを使用してnameを設定
menu.price = 500           # セッターメソッドを使用してpriceを設定

puts menu.name             # ゲッターメソッドを使用してnameを取得して表示
puts menu.price            # ゲッターメソッドを使用してpriceを取得して表示

このようにすることで、インスタンス変数の値に対して直接アクセスするのではなく、ゲッターメソッドとセッターメソッドを介してプロパティにアクセスすることができます。これにより、プロパティの制御や変更の際に追加のロジックを組み込むことが容易になります。

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

インスタンスメソッドの中では、特殊な変数「self」を用いて「self.変数名」とすることで、インスタンス変数を扱うことができるようになります。
インスタンスメソッドでは、変数「self」に、呼び出したインスタンス自身が代入されています。

class Person
  def initialize(name)
    @name = name
  end

  def greet
    puts "こんにちは、私は#{@name}です!"
  end
end

# インスタンスを作成
person1 = Person.new("Alice")
person2 = Person.new("Bob")

# インスタンスメソッドを呼び出して挨拶を表示
person1.greet
person2.greet

コンソール結果

こんにちは、私はAliceです!
こんにちは、私はBobです!

合計金額を求めるメソッド

class Menu
  attr_accessor :name
  attr_accessor :price
  
  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
menu1.name = "ピザ"
menu1.price = 800

menu2 = Menu.new
menu2.name = "サラダ"
menu2.price = 300

puts menu1.info
puts "合計価格(3個): ¥#{menu1.get_total_price(3)}"

puts menu2.info
puts "合計価格(2個): ¥#{menu2.get_total_price(2)}"

コンソール

ピザ 800円
合計価格(3個): ¥2300
サラダ 300円
合計価格(2個): ¥600

initializeメソッド

initializeメソッドは、「クラス名.new」でインスタンスを生成した直後に自動で呼び出されます。

class Menu
  attr_accessor :name
  attr_accessor :price
  
  def initialize 
    self.name = "ハンバーガー"
    self.price = 500
  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


puts menu1.info

上記のコードを実行すると、以下のような結果がコンソールに表示されるでしょう:

ハンバーガー 500円

この例では、Menu クラスの initialize メソッドによって、新しい Menu オブジェクトが作成される際に自動的に初期値が設定されます。その後、info メソッドを呼び出して戻り値を表示しています。

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

キーワード引数を使うことで見やすく書くことができます。

class Menu
  attr_accessor :name
  attr_accessor :price
  
  # initializeメソッドを書き換えてください
  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: 750)
menu2 = Menu.new(name: "ハンバーガー", price: 500)

puts menu1.info
puts menu2.info

コンソール

カレーライス 750円
ハンバーガー 500円

インスタンスの配列

# animal.rb

class Animal
  attr_accessor :name
  attr_accessor :species
  
  def initialize(name:, species:)
    self.name = name
    self.species = species
  end
  
  def info
    return "#{self.name} (#{self.species})"
  end
end

# main.rb

require "./animal"

animal1 = Animal.new(name: "チーター", species: "哺乳類")
animal2 = Animal.new(name: "ワニ", species: "爬虫類")
animal3 = Animal.new(name: "ワシ", species: "鳥類")
animal4 = Animal.new(name: "カエル", species: "両生類")

# 変数animalsを定義して配列を代入してください
animals = [animal1, animal2, animal3, animal4]

# animalsに対して繰り返し処理を実行してください
animals.each do |animal|
  puts animal.info
end

上記のコードを実行すると、以下のような結果がコンソールに表示されるでしょう:

チーター (哺乳類)
ワニ (爬虫類)
ワシ (鳥類)
カエル (両生類)

この例では、Animal クラスを別ファイルに定義し、require を使ってメインスクリプトで使用しています。そして、animals 配列にインスタンスを格納し、それぞれの動物情報を繰り返し表示しています。

gets.chomp 入力を受け取る

「gets.chomp」で入力された値を受け取ることができるが、実はこれは文字列になるため、仮に「3」と入力しても文字列の"3"になってしまいます。
数値の計算などに用いる場合は、これを数値に変換する必要があります。
そのためには、「gets.chomp.to_i」とすることで、入力された内容を数値に変換し、計算などにも使えるようになります。

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

name = gets.chomp

puts "#{name}さん、いらっしゃいませ"

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

count = gets.chomp.to_i

total_price = count * 50

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

コンソール

名前を入力してください
John
Johnさん、いらっしゃいませ
1つ50円のお菓子があります
いくつ買いますか?
3
お会計は150円です

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?