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

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

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

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

Q&A

解決済

1回答

2148閲覧

【ruby】selfについて

Miracle

総合スコア54

Ruby

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

0グッド

0クリップ

投稿2016/04/19 16:06

rubyの以下の様なプログラムがあるとします。

lang

1class Review 2 attr_accessor :genre, :title, :impression 3 @@review_count = 0 4 @@reviews = [] 5 def self.get_review_count 6 return @@review_count 7 end 8 9 def self.show_review 10 number = 0 11 @@reviews.each do |review| 12 puts "[#{number}]:#{review.title}のレビュー" 13 number += 1 14 end 15 puts "\n見たいレビューの番号を入力してください:" 16 input = gets.to_i 17 review = @@reviews[input] 18 review.show_review 19 end 20 21 def initialize 22 puts "タイトルを入力してください" 23 self.title = gets.chomp 24 puts "ジャンルを入力してください" 25 self.genre = gets.chomp 26 puts "感想を入力してください" 27 self.impression = gets.chomp 28 @@review_count = @@review_count + 1 29 @@reviews << self 30 show_review 31 end 32 33 def show_review 34 line = "---------------------------" 35 puts "ジャンル : #{self.genre}\n#{line}\n" 36 puts "タイトル : #{self.title}\n#{line}\n" 37 puts "感想 :\n#{self.impression}\n#{line}\n" 38 end 39 40end 41 42while true do 43 puts "書いたレビューの数:#{Review.get_review_count}" 44 puts "[0]レビューを書く" 45 puts "[1]レビューを読む" 46 puts "[2]アプリを終了する" 47 48 input = gets.to_i 49 50 if input == 0 51 review = Review.new 52 elsif input == 1 53 Review.show_review 54 elsif input == 2 55 exit 56 else 57 puts "入力された値は無効な値です" 58 end 59end

selfは省略できるので、以下のように変更したのですが、上手く行きません。

lang

1class Review 2 attr_accessor :genre, :title, :impression 3 @@review_count = 0 4 @@reviews = [] 5 def self.get_review_count 6 return @@review_count 7 end 8 9 def self.show_review 10 number = 0 11 @@reviews.each do |review| 12 puts "[#{number}]:#{review.title}のレビュー" 13 number += 1 14 end 15 puts "\n見たいレビューの番号を入力してください:" 16 input = gets.to_i 17 review = @@reviews[input] 18 review.show_review 19 end 20 21 def initialize 22 puts "タイトルを入力してください" 23 title = gets.chomp 24 puts "ジャンルを入力してください" 25 genre = gets.chomp 26 puts "感想を入力してください" 27 impression = gets.chomp 28 @@review_count = @@review_count + 1 29 @@reviews << self 30 show_review 31 end 32 33 def show_review 34 line = "---------------------------" 35 puts "ジャンル : #{genre}\n#{line}\n" 36 puts "タイトル : #{title}\n#{line}\n" 37 puts "感想 :\n#{impression}\n#{line}\n" 38 end 39 40end 41 42while true do 43 puts "書いたレビューの数:#{Review.get_review_count}" 44 puts "[0]レビューを書く" 45 puts "[1]レビューを読む" 46 puts "[2]アプリを終了する" 47 input = gets.to_i 48 49 if input == 0 50 review = Review.new 51 elsif input == 1 52 Review.show_review 53 elsif input == 2 54 exit 55 else 56 puts "入力された値は無効な値です" 57 end 58end

しかい、以下のようにinitializeメソッド内ではselfを使うと(show_reviewメソッドでは使わなくても)うまくいきました。

lang

1class Review 2 attr_accessor :genre, :title, :impression 3 @@review_count = 0 4 @@reviews = [] 5 def self.get_review_count 6 return @@review_count 7 end 8 9 def self.show_review 10 number = 0 11 @@reviews.each do |review| 12 puts "[#{number}]:#{review.title}のレビュー" 13 number += 1 14 end 15 puts "\n見たいレビューの番号を入力してください:" 16 input = gets.to_i 17 review = @@reviews[input] 18 review.show_review 19 end 20 21 def initialize 22 puts "タイトルを入力してください" 23 self.title = gets.chomp 24 puts "ジャンルを入力してください" 25 self.genre = gets.chomp 26 puts "感想を入力してください" 27 self.impression = gets.chomp 28 @@review_count = @@review_count + 1 29 @@reviews << self 30 show_review 31 end 32 33 def show_review 34 line = "---------------------------" 35 puts "ジャンル : #{genre}\n#{line}\n" 36 puts "タイトル : #{title}\n#{line}\n" 37 puts "感想 :\n#{impression}\n#{line}\n" 38 end 39 40end 41 42while true do 43 puts "書いたレビューの数:#{Review.get_review_count}" 44 puts "[0]レビューを書く" 45 puts "[1]レビューを読む" 46 puts "[2]アプリを終了する" 47 input = gets.to_i 48 49 if input == 0 50 review = Review.new 51 elsif input == 1 52 Review.show_review 53 elsif input == 2 54 exit 55 else 56 puts "入力された値は無効な値です" 57 end 58end

なぜinitializeメソッド内にselfを使わないと、上手く表示されないのでしょうか?

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

self.title = gets.chompself.title=(gets.chomp)と解釈されます。つまり、selfに対してgets.chompの戻り値を引数としてtitle=()メソッドを呼び出すという意味です。

それに対し、title = gets.chomptitleというローカル変数の定義と解釈されます。つまり、titelローカール変数にgets.chompの戻り値を代入するという意味になります。

このようにselfは常に省略できるとは限りません(逆も然りです)。なお、インスタンス変数に対するゲッターセッターを自分自身のクラス内で呼び出すことはあまりありません。@titleと記述する場合の方が多いですし、書きやすくなります。Rubyは推奨する書き方を書きやすくするという手法をとっており、書きやすい方を採用していくと推奨の書き方になるという性質をもっています。そのため洗脳言語と言われています。

投稿2016/04/19 22:11

raccy

総合スコア21733

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

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

Miracle

2016/04/20 04:48

分かりやすい解説をして頂き、ありがとうございます! > self.title = gets.chompはself.title=(gets.chomp)と解釈されます。 ここには全く気が付きませんでした。単に `title = gets.chomp` と書くのとは全く違う意味になるのですね。 便利なのか、わかりづらいのか、難しいところですね。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問