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

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

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

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

Q&A

解決済

1回答

426閲覧

ruby のメソッドの使い方について

shutainer

総合スコア11

Ruby

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

0グッド

1クリップ

投稿2020/08/14 08:23

https://gihyo.jp/book/2017/978-4-7741-9397-7
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

上記を用いrubyの基本を習得中です。

ruby 2.7.0です

150あるいは190円の切符をかい、改札から入場し、電車に乗って、改札から出場するプログラムです、さらにminitestを使ってtestも書いています。

ここで以下疑問点があります。

ruby

1def exit(ticket) 2 #なぜオブジェクト(レシーバ)を使わずにメソッドが呼び出せる? 3 fare = calc_fare(ticket) 4 fare <= ticket.fare 5 end

ruby

1calc_fare(ticket)

はなぜインスタンスを用いずに、メソッド呼び出しができているのでしょうか?

ruby

1class Gate 2 3 STATIONS = [:umeda, :juso, :mikuni] 4 FARES = [150, 190] 5 6 def initialize(name) 7 @name = name 8 end 9 10 def enter(ticket) 11 ticket.stamp(@name) 12 end 13 14 def exit(ticket) 15 #なぜオブジェクト(レシーバ)を使わずにメソッドが呼び出せる? 16 fare = calc_fare(ticket) 17 fare <= ticket.fare 18 end 19 20 def calc_fare(ticket) 21 from = STATIONS.index(ticket.stamped_at) 22 to = STATIONS.index(@name) 23 distance = to - from 24 FARES[distance - 1] 25 end

ruby

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

ruby

1require 'minitest/autorun' 2require './lib/rgb' 3 4class RgbTest < Minitest::Test 5 6 def test_to_hex 7 assert_equal '#000000', to_hex(0, 0, 0) 8 assert_equal '#ffffff', to_hex(255, 255, 255) 9 assert_equal '#043c78', to_hex(4, 60, 120) 10 end 11 12 def test_to_ints 13 assert_equal [0, 0, 0], to_ints('#000000') 14 assert_equal [255, 255, 255], to_ints('#ffffff') 15 assert_equal [4, 60, 120], to_ints('#043c78') 16 end 17 18end 19

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

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

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

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

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

guest

回答1

0

ベストアンサー

自分自身のインスタンスメソッドであれば、インスタンスを指定せずに呼び出せます。
イメージとしては、selfが省略されている感じです。

class Gate def exit(ticket) # fare = calc_fare(ticket) fare = self.calc_fare(ticket) # このように書いても(大体)同じ fare <= ticket.fare end def calc_fare # ... end end

投稿2020/08/14 08:32

maai

総合スコア463

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

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

jnchito

2020/08/15 07:06

「プロを目指す人のためのRuby入門」著者の伊藤です。 レシーバがないのはmaaiさんも書かれたとおり、 `self` が省略されているためです。 なお、 `self` キーワードについては例題のあとの7.5節で詳しく説明します。 また、Ruby 2.7からはprivateメソッドも `self` 付きで呼び出せるように仕様が変わっているので、この点もご注意ください。 参考 https://qiita.com/jnchito/items/aa4ebf6f0e363a1b8098
maai

2020/08/15 08:09

著者さんありがとうございます!! > Ruby 2.7からはprivateメソッドも `self` 付きで呼び出せるように仕様が変わっている これは知りませんでした…勉強になります
shutainer

2020/08/17 07:51

>jnchito 著者の方から回答いただき光栄です。 7.5節を読み、理解しました。 プライベートメソッドについても、了解いたしました。 maaiさん jnchitoさん ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問