質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

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

Q&A

解決済

5回答

753閲覧

継承関係にない他のクラス内の値(変数データ)を使う方法はありますか?

dentiste

総合スコア5

Ruby

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

0グッド

0クリップ

投稿2020/06/27 02:04

編集2020/06/27 07:03

ruby

1[a.rb] 2class A #様々なメソッドが格納されているクラス 3 attr_accessor :calorie_of_main_dish, :calorie_of_side_dish 4 5 def initialize 6 @calorie_of_main_dish = 0 7 @calorie_of_side_dish = 0 8 end 9 10 def suggest_main_dish 11 puts "料理の提案をします" 12 main_dish_and_calorie_key = list_of_main_dish_and_calorie.keys.sample 13 @calorie_of_main_dish = list_of_main_dish_and_calorie[main_dish_and_calorie_key] 14 puts "・メイン料理: #{main_dish_and_calorie_key}(#{calorie_of_main_dish} kcal)" 15 end 16 def suggest_side_dish 17 side_dish_and_calorie_key = list_of_side_dish_and_calorie.keys.sample 18 @calorie_of_side_dish = list_of_side_dish_and_calorie[side_dish_and_calorie_key] 19 puts "・副菜: #{side_dish_and_calorie_key}(#{calorie_of_side_dish} kcal)" 20 end 21 def output_calorie_of_suggested_dishes 22 total_calorie_of_suggested_dishes = calorie_of_main_dish + calorie_of_side_dish 23 puts "これらの料理の総カロリーは#{total_calorie_of_suggested_dishes} kcalです" 24 end 25end 26 27[b.rb] 28class B #class A で使う、様々な料理やカロリーなどのデータが格納されているクラス 29 attr_accessor :list_of_main_dish_and_calorie, :list_of_side_dish_and_calorie 30 31 def initialize 32 @list_of_main_dish_and_calorie = nil 33 @list_of_side_dish_and_calorie = nil 34 end 35 36 def calorie_labeling 37 @list_of_main_dish_and_calorie= { 38 "ハンバーグ" => 437, 39 "ラーメン" => 443, 40 : 41 } 42 43 @list_of_side_dish_and_calorie = { 44 "シーザーサラダ" => 287, 45 "キャベツサラダ" => 194, 46 : 47 } 48 end 49end

これらのクラスは継承関係でもないと思うので
class B < A
とするのはおかしいと思います。

そこで下記のようにすべてのクラス名を"A"で統一してしまい、元のclass B 内の変数データをclass A に追加(上書き)するという形をとっても良いのでしょうか。

ruby

1[a.rb] 2require "./b" 3class A 4 5[b.rb] 6class A #元のclass B

それともいくらクラス内で使う変数データを格納してあるとしても、同じクラス名を使うと混乱する可能性があるため、やめたほうがいいのでしょうか。

やめたほうがいい場合、他に良い方法があれば教えていただきたいです。

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

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

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

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

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

maisumakun

2020/06/27 02:11

class 1の「メソッド」は、通常のインスタンスメソッドでしょうか?それとも、クラスメソッドでしょうか?
dentiste

2020/06/27 02:13

通常のインスタンスメソッドです。
guest

回答5

0

csvファイルに料理のリスト(class B の内容)をまとめ、class A で読み込む設計にしました。

[dishes_list.csv] dishes,calorie,genre ハンバーグ,437,main-dish ラーメン,443,main-dish シーザーサラダ,287,side-dish キャベツサラダ,194,side-dish

投稿2020/07/01 04:12

dentiste

総合スコア5

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

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

0

自己解決

csvファイルに料理のリスト(class B の内容)をまとめ、class A で読み込む設計にしました。

[dishes_list.csv]
dishes,calorie,genre
ハンバーグ,437,main-dish
ラーメン,443,main-dish
シーザーサラダ,287,side-dish
キャベツサラダ,194,side-dish

投稿2020/07/01 04:10

dentiste

総合スコア5

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

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

0

rails ではなく 純rubyですね?
ですと、他のclass内の値(変数データ)(多分classの変数ではなくインスタンスの変数ですね?)を用いるには、
そのインスタンスを特定して 例えば recipeに代入し、recipeに定義したmethodを参照する(recipe.calorie) というのが正道かと。

投稿2020/06/27 07:17

winterboum

総合スコア23284

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

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

0

ruby

1# 1+2 プロフィール+基礎代謝計算 2class User 3 # 外部から見られるデータを公開する 4 attr_reader :weight, :height, :age, :sex 5 # 基礎代謝を計算し返すメソッド 6 def bee 7 end 8 def initialize(sex, age, height, weight) 9 @sex = sex 10 @age = age 11 @height = height 12 @weight = @weight 13 end 14end 15 16# 3 レシピ(特にメソッド生やす必要性を感じなかった為Structを採用) 17Recipe = Struct.new(:name, :energy)

レシピオススメ部分の実装はいろいろあるが
オススメしてくれるレシピ本クラスを作ったりするのがわかりやすそう

ruby

1class RecipeBook 2 # レシピを追加 3 def add(recipe) 4 @book << recipe 5 end 6 # オススメ 7 def recommend(user) 8 @book.select{|recipe| recipe.energey <= user.bee} 9 end 10end

投稿2020/06/27 05:26

asm

総合スコア15147

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

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

0

同じクラス名を使うと混乱する可能性があるため、

同じクラス名というより、同じクラスです。

これらのクラスは継承関係でもないと思うので

class 2 < 1
class 3 < 1
とするのはおかしいと思います。

と言うことであれば、同じクラスにするのもおかしいでしょう。

「変数データが格納されている」という意味が何を言わんとしているのかわかりませんが、使用目的によって適切なやり方があるかと思います。

投稿2020/06/27 02:17

otn

総合スコア84421

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

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

dentiste

2020/06/27 02:40

少し詳細を追記させていただきました。 上記のようなクラスの場合、やはり継承関係もなく、同じクラスにするのもおかしいのでしょうか。
otn

2020/06/27 03:06

具体性が無いため、何を言わんとしているのか、さっぱりです。
dentiste

2020/06/27 03:36 編集

申し訳ありません。質問を変えます。 class 3 内で定義されているハッシュ(下記のような料理名とカロリーが格納されているもの) @dishes = { "ハンバーグ" => 437, "ラーメン" => 443, : } これをclass 1 内で下記のように使いたい a = dishes.keys.sample #料理名をランダムに取得 b = dishes[a] #選ばれた料理のカロリー取得 puts "#{a} #{b} kcal" #料理名とカロリー出力 とすると、下記のうちどのような方法が良いのでしょうか 1. 継承する (class 3 < 1) 2. 同じクラスにする (class 3 から class 1 にする) 3. その他
otn

2020/06/27 03:42

class1は何のクラスなんでしょうか?(class1オブジェクトは何を表しているのか?) class3は何のクラスなんでしょうか?(class3オブジェクトは何を表しているのか?)
dentiste

2020/06/27 03:50

class1 は料理を提案するクラス class3はデータ(料理名とカロリー)管理用のクラス としています。
otn

2020/06/27 05:10

class1オブジェクトは「料理の提案」を表すと言うことですか? class3オブジェクトは何を表しているのでしょうか? 「料理」を表すクラスは無い?
dentiste

2020/06/27 07:15

詳細なソースコードを追記させていただきました。 class1オブジェクトは「料理の提案」を表します。 class3オブジェクトは「料理とカロリー」を表します。 「料理」を表すクラスがclass3のつもりでした
otn

2020/06/27 11:03

クラスに対する基本的な理解が間違っている気がします。 ・オブジェクト指向でゼロから設計し直す ・非オブジェクト指向で、クラスを使わないで書く のどちらかがいいと思います。現状ベースなら、後者が近道です。
dentiste

2020/06/27 12:32

理解したいので、再度勉強し直してみることにします。ご回答ありがとうございました。
otn

2020/06/27 12:41

・1つの料理を表すクラス ・料理のリストを表すクラス を作ると良いと思います。2つは継承関係に無いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問