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

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

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

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

Q&A

解決済

2回答

895閲覧

ruby プロを目指す人のためのruby入門

kwtkwt

総合スコア21

Ruby

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

0グッド

1クリップ

投稿2019/02/20 09:15

enterメソッドで駅名が一緒に保存される理由がわかりません。。。
よろしくお願いいたします。

ruby

1class Gate 2 STATIONS = [:umeda, :juso, :mikuni] 3 FARES = [150, 190] 4 5 def initialize(name) 6 @name = name 7 end 8 9 def enter(ticket) 10 ticket.stamp(@name) 11 end 12 13 def exit(ticket) 14 fare = calc_fare(ticket) 15 fare <= ticket.fare 16 end 17 18 def calc_fare(ticket) 19 from = STATIONS.index(ticket.stamp_at) 20 to = STATIONS.index(@name) 21 distance = to - from 22 FARES[distance - 1] 23 end 24end 25

ruby

1class Ticket 2 attr_reader :fare, :stamp_at 3 4 def initialize(fare) 5 @fare = fare 6 end 7 8 def stamp(name) 9 @stamp_at = name 10 end 11end 12

ruby

1require 'minitest/autorun' 2require './lib/gate' 3require './lib/ticket' 4 5class GateTest < Minitest::Test 6 def test_gate 7 require 'byebug'; byebug 8 umeda = Gate.new(:umeda) 9 juso = Gate.new(:juso) 10 ticket = Ticket.new(150) 11 umeda.enter(ticket) 12 assert juso.exit(ticket) 13 end 14 15 def test_umeda_to_mikuni 16 umeda = Gate.new(:umeda) 17 mikuni = Gate.new(:mikuni) 18 19 ticket = Ticket.new(150) 20 umeda.enter(ticket) 21 refute mikuni.exit(ticket) 22 end 23end 24

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

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

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

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

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

y_waiwai

2019/02/20 09:17

プロを目指すなら、丸投げでぶん投げる質問はいかがなものかと思いますがw
guest

回答2

0

ベストアンサー

「プロを目指す人のためのRuby入門」の著者の伊藤です。
拙著を読んでいただき、どうもありがとうございます。

enterメソッドで駅名が一緒に保存される理由がわかりません。。。

わからないポイントがいったいどこなのか、理解されているのはどこまでなのか、ちょっとこの質問文だけでは推測しかねるのですが、コードの動きを丁寧に説明してみますね。

以下のサンプルコードに、連番付きのコメントを付けてみました。
これを順番に追っていくと、切符に改札機の駅名が保存される理由がわかるかもしれません。

ruby

1class GateTest < Minitest::Test 2 def test_gate 3 # 1. 私は改札機です。umedaという名前(@name)を持っています 4 umeda = Gate.new(:umeda) 5 juso = Gate.new(:juso) 6 # 2. 私は切符です。150円という運賃(@fare)を持っています 7 ticket = Ticket.new(150) 8 # 3. umedaの改札機に、切符を挿入(enter)します 9 umeda.enter(ticket) 10 assert juso.exit(ticket) 11 end 12 13 # 省略 14end 15 16class Gate 17 STATIONS = [:umeda, :juso, :mikuni] 18 FARES = [150, 190] 19 20 def initialize(name) 21 @name = name 22 end 23 24 def enter(ticket) 25 # 4. 受け取った切符(ticket)に対して、改札機の名前(@name)を記録(stamp)せよ、と伝えます 26 ticket.stamp(@name) 27 end 28 29 def exit(ticket) 30 fare = calc_fare(ticket) 31 fare <= ticket.fare 32 end 33 34 def calc_fare(ticket) 35 from = STATIONS.index(ticket.stamp_at) 36 to = STATIONS.index(@name) 37 distance = to - from 38 FARES[distance - 1] 39 end 40end 41 42class Ticket 43 attr_reader :fare, :stamp_at 44 45 def initialize(fare) 46 @fare = fare 47 end 48 49 def stamp(name) 50 # 5. 受け取った名前(name)を、通った駅名(@stamp_at)に保存します 51 @stamp_at = name 52 end 53end

オブジェクト指向プログラミングは、上のように擬人法で考えると理解しやすいかもしれません。

上の説明でもまだピンとこない、擬人法で説明されてもイメージがわかない、という場合は、いったん本書を置いて、「ゼロからわかる Ruby超入門」のような、もう一段やさしめの本を読んでみることをお勧めします。

投稿2019/02/21 01:51

編集2019/02/21 12:06
jnchito

総合スコア357

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

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

kwtkwt

2019/02/21 05:06

丁寧に解説していただきありがとうございます。 説明不足申し訳ありません。 4. 受け取った切符(ticket)に対して、改札機の名前(@name)を記録(stamp)せよ、と伝えます >> enterメソッドでticketを引数にしているのはticketと@nameを関連づけるためという認識で合っていますか?
jnchito

2019/02/21 08:15

> enterメソッドでticketを引数にしているのはticketと@nameを関連づけるためという認識で合っていますか? その認識でよいと思います。 otnさんも回答されているとおり、現実の切符と改札機を考えたときに、 - 切符を改札機に入れる - (おそらく)切符に通った改札機の駅情報が記録される という仕組みになっていると思うので、プログラム上でも `gate.enter(ticket)` のように、まずticketをgateにenterして(切符を改札機に入れて)、gate.nameをticketにstampする(駅名を切符に記録する)というふうに設計してみました。 ただし、これはあくまで筆者が考えたコード設計ですので、他の人に同じ課題を出すと別の設計や実装が出てくる可能性があります。(というか、おそらくそうなると思います)
kwtkwt

2019/02/21 11:55

ありがとうございます。 擬人法で考えてみるとよく分かりました。 また、attr_reader :fare, :stamp_at の中身を考えることで コードの意味を理解できました。 引き続き読み、頑張ります。
guest

0

その駅から入場したと言うことを記録するメソッドのようなので、駅名を保存するのでは?
切符を買って、自動改札を通れば、切符に駅を示すコードや日時が記録されますよ。

投稿2019/02/20 14:28

otn

総合スコア84555

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

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

kwtkwt

2019/02/21 06:46

回答ありがとうございます。
otn

2019/02/21 06:53

あら、「理由(何故そうするか)」が分からないのじゃなくて、「仕組み(どういう手段でそうしているか)」が分からないという質問でした?
kwtkwt

2019/02/21 11:57

ありがとうございます。 擬人法で考えてみることで仕組みを理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問