🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

1回答

3840閲覧

Rubyのエラー:/human.rb:3:in `<top (required)>': uninitialized constant Animal (NameError)

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

0クリップ

投稿2020/01/05 11:35

前提・実現したいこと

少し長くなってしまいますが、ご教授お願いします。

仕様
Animalクラス ( animal.rb )

Humanクラスの親となるクラスです。

attr_accessor を使って、名前を格納する変数と年齢を格納する変数を定義してください。(苗字と名前は分けなくてOKです。変数名は自由とします。)

initializeに名前・年齢の情報を格納する引数を設定し、処理内容として名前・年齢の各変数を引数の情報で初期化するようにしてください。引数の名前は自由とします。

say という名前のメソッドを定義してください。このメソッドを実行すると、変数に代入された名前と年齢を使って「○○です。△△歳です。」と画面に puts で表示するように処理を作りましょう。

Thinkableモジュール ( thinkable.rb )

クラスではなく モジュール として作ってください。

think メソッドを中に定義してください。このメソッドを実行すると、Human クラスに定義された”趣味”の文字列が入っている変数(後述) の中身を利用して「私は□□について考えています。」と画面に puts で表示するように処理を作りましょう。

Humanクラス( human.rb )< を使って、Animal クラスを継承する記述を入れてください。

Thinkable モジュールの think メソッドを、このクラスで使えるようにしたいので、Thinkable モジュールを include してください。

attr_accessor を使って、趣味の情報を保管する変数を定義してください。変数名は自由とします。

initializeに名前・年齢・趣味の情報を格納する引数を設定し、処理内容として名前・年齢・趣味の各変数を引数の情報で初期化するようにしてください。引数の名前は自由とします。

実行ファイル( main.rb )
以下のコードをひな形として利用してください。
require './human'

#インスタンスの作成
tanaka = Human.new()
suzuki = Human.new()
sato = Human.new()

#メソッドを実行

上記のひな形では new の括弧内に何も引数を記述できていません。Humanクラスの initialize が正しく実行され、名前・年齢・趣味の各変数が引数の情報で初期化されるように、引数を設定してください。

発生している問題・エラーメッセージ

/home/ec2-user/environment/kadai-ruby-3/human.rb:3:in `<top (required)>': uninitialized constant Animal (NameError)というエラーメッセージが表示されます。
クラスの定義を読み込めないことに原因があると分かったので、クラスの記述の仕方などをネットで記載されているサンプルコードを参考にして確認したのですが間違いが分かりませんでした。

該当のソースコード

animal.rbのコードです。
#クラス定義
class Animal

#オブジェクトの変数(値)
attr_accessor :name, :age

#インスタンス初期化用の特別なメソッド
def initialize(name, age)
self.name = name
self.age = age
end

#オブジェクトのメソッド(処理)
def say
puts "#{self.name}です。#{self.age}歳です。"
end

end

#インスタンスの生成と、変数への代入
animal = Animal.new("田中 太郎", 25)
animal.say

animal = Animal.new("鈴木 次郎", 30)
animal.say

animal = Animal.new("佐藤 花子", 20)
animal.say

thinkable.rbのコードです。
module Thinkable
def think
puts "私は{@self.hobby}について考えています。"
end
end

human.rbのコードです。
require "./thinkable"

class Human < Animal

#オブジェクトの変数(値) attr_accessor :hobby #インスタンス初期化用の特別なメソッド def initialize(name, age, hobby) self.name = name self.age = age self.hobby = hobby end #includeでThinkableの処理を利用 include Thinkable

end

main.rbのコードです。

require "./human"

#インスタンスの作成
tanaka = Human.new("田中 太郎", 25, "電車")
human.say
human.think
suzuki = Human.new("鈴木 次郎", 30, "野球")
human.say
human.think
sato = Human.new("佐藤 花子", 20, "映画")
human.say
human.think

### 出力したい実行結果

$ ruby main.rb

田中 太郎です。25歳です。
私は電車について考えています。
鈴木 次郎です。30歳です。
私は野球について考えています。
佐藤 花子です。20歳です。
私は映画について考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ecorilaa

2020/09/03 13:32 編集

同じ問題に取り組んでいますが、私の場合、main.rbのhuman.sayの行にin `<main>': undefined local variable or method `human' for main:Object (NameError)と表示されます。コードは上に書かれているものと同じです。human.rbの呼び出しがうまくできていないことが原因と考えていますが、どうすれば解決できるかご教授して頂きたいです。
guest

回答1

0

ベストアンサー

require "./human"
というのがあります。
これが このfileを揉み込め という指示です。
このfileを読み込むと、中に定義されている class Humanが定義されます。
Animalも同じようにしてください

投稿2020/01/05 11:44

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/05 15:10

human.rbのコードに require "./animal"を追加したらエラーが直りました。 ありがとうございました。
winterboum

2020/01/06 11:20

それでも良いんだけど、mainのhuman取込みの前にやるほうが素直かも
退会済みユーザー

退会済みユーザー

2020/01/07 15:37

ご教授ありがとうございます。
yasshun1229

2021/08/31 10:52

TechAcademyの課題じゃん笑
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問