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

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

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

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

Q&A

解決済

4回答

1851閲覧

rubyのクラス設計が分かりません

DrqYuto

総合スコア432

Ruby

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

0グッド

0クリップ

投稿2018/08/14 09:23

前提・実現したいこと

CODEPREPしてます。

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

class Car class Car def initialize(speed) @speed = speed km = @speed/time end def time(distance) end attr_accessor @speed,@time print speed car = Car.new(50) p car.speed speed = car.time(100)

エラーになりました。

/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': /root/codecheck/main.rb:18: syntax error, unexpected end-of-input, expecting keyword_end (SyntaxError) speed = car.time(100) ^ from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from test.rb:1:in `<main>'

問題 車を表すCarクラスを実装してみましょう。

実装内容

Carクラスはインスタンスオブジェクトの初期化時に引数speedを受け取り、インスタンス変数speedにその値をセットします
インスタンス変数speedは車の時速(km/h)を表す変数です。
インスタンス変数speedはクラス外から参照できるようにしてください。
インスタンスメソッドとして距離(km)を渡すと必要時間を返すtimeメソッドを持ちます
timeメソッドはインスタンス変数speedが0の時はnilを返してください
実行例

car = Car.new(50)
p car.speed
#=> 50

speed = car.time(100)

=> 2.0

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答4

0

ベストアンサー

まずは公式リファレンスを読むことをオススメします。
クラス/メソッドの定義
Module#attr_accessor


class Car
class Car

2つ続けてはいけません。CarクラスにもうひとつCarクラスが作られてしまいます。

def time(distance)
end

インデントは揃えましょう

attr_accessor @speed,@time
print speed

  • attr_accessor :speed, :timeが正しいでしょう
  • class Carに対応するendがありません。

ruby

1class Car 2 attr_accessor :speed 3 def initialize(speed) 4 self.speed = speed 5 end 6 def time(distance) 7 return nil if speed == 0 8 distance.fdiv speed 9 end 10end 11 12car = Car.new(50) 13p car.speed 14p car.time(100)

投稿2018/08/14 10:20

asm

総合スコア15147

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

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

0

クラス設計以前に、classenddefendのネストが対応していません。ネストをきれいにして書き直してみます。

ruby

1class Car 2 class Car 3 def initialize(speed) 4 @speed = speed 5 km = @speed/time 6 end 7 8 def time(distance) 9 end 10 11 attr_accessor @speed,@time 12 print speed 13 14 car = Car.new(50) 15 p car.speed 16 17 speed = car.time(100) 18 19## クラスを閉じるendがない!

投稿2018/08/14 10:04

maisumakun

総合スコア145121

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

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

0

書いてみました。

ruby

1class Car 2 attr_reader :speed 3 def initialize(speed) 4 raise ArgumentError, 'speed < 0' if speed < 0 5 @speed = speed 6 end 7 8 def time(distance) 9 raise ArgumentError, 'distance < 0' if distance < 0 10 return nil if @speed.zero? 11 distance.to_f / @speed 12 end 13end 14 15car = Car.new(50) 16p car 17p car.speed 18p car.time(100) # => 2.0 19 20car = Car.new(0) 21p car.time(100) # => nil 22 23begin 24 Car.new(-1) 25rescue ArgumentError => ex 26 p ex 27end

spped も distance も 0 より小さい値は設定できないようにしています。

投稿2018/08/14 14:11

katoy

総合スコア22324

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

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

0

ありがとうございます

投稿2018/08/14 10:06

DrqYuto

総合スコア432

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問