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

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

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

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Q&A

解決済

2回答

4202閲覧

【Rails】selfと@の使い分けはどうすればいいでしょうか?

kazuki0714

総合スコア28

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

0グッド

4クリップ

投稿2019/07/25 02:26

selfの使い方を色々調べてましたが、selfを使った場合と@を使った場合で結果が同じになります。
Qiitaとか色々見たのですがイマイチ理解できずでして。。。
どっちがいいとかございますでしょうか?

Ruby

1# selfメソッドを使った場合 2class User 3 attr_accessor :name, :station 4 5 def initialize(name, station) 6 # self.nameに引数name を代入する 7 self.name = name 8 self.station = station 9 end 10 def my_profile 11 p "私の名前は#{self.name}で最寄駅は#{self.station}駅です。" 12 end 13 14 # クラスメソッド 15 def self.description 16 # この場合のselfの扱いは、 Userオブジェクトではなく、Userクラス 17 puts "#{self}クラス" 18 end 19end 20 21# Userのオブジェクトを生成し、引数で名前を与える 22user = User.new("田中太郎", "白金高輪") 23user.my_profile # => "私の名前は田中太郎で最寄駅は白金高輪駅です。" 24 25# クラスメソッドの呼び出し 26User.description # => Userクラス

Ruby

1# @を使った場合 2class User 3 attr_accessor :name, :station 4 5 def initialize(name, station) 6 # self.name の代わりに@name にする 7 @name = name 8 @station = station 9 end 10 def my_profile 11 p "私の名前は#{@name}で最寄駅は#{@station}駅です。" 12 end 13 14 # クラスメソッド 15 def self.description 16 # 適当にaaaクラスを記入 17 puts "aaaクラス" 18 end 19end 20 21# Userのオブジェクトを生成し、引数で名前を与える 22user = User.new("田中太郎", "白金高輪") 23user.my_profile # => "私の名前は田中太郎で最寄駅は白金高輪駅です。" 24 25# クラスメソッドの呼び出し 26User.description # => aaaクラス

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

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

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

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

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

guest

回答2

0

ベストアンサー

self.nameとした場合、attr_accessorで作成されたメソッドを呼び出します(ローカルに同じnameがない場合かつ代入でない場合は、nameとだけ書いても同じ動作となります)。self.name = ''のような代入メソッドを呼びたい場合はselfが必須です(selfなしだとローカル変数を作るものとみなされます)。

@nameとした場合は、attr_accessorが裏で保管しているインスタンス変数を読みに行きます。

attr_accessorの場合はどちらも同じですが、アクセサがなくインスタンス変数しかない場合、@nameでのアクセスしかできません。逆に、RailsのActiveRecordでは、@nameのような変数に格納しているわけではないので、nameというメソッド形式のアクセスが必要となります。

投稿2019/07/25 02:56

編集2019/07/25 02:59
maisumakun

総合スコア145184

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

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

kazuki0714

2019/07/25 05:19

ありがとうございます! まだ自分の中で腹落ちしていないので`attr_accessor` なしor あり など色々試してみます!
guest

0

ruby

1attr_accessor :name, :station

まず、attr_accessorでインスタンス変数を読み書きするためのアクセサメソッドを定義しています。

@nameはrubyのインスタンス変数です。
selfは**"Userクラスのインスタンス"を指しています。
self.nameは、Userクラスのインスタンスが持っている
メソッドname**を指しています。
仮にnameがインスタンス変数ではなかった場合でも、self.nameでアクセスができます。

好みの問題だとは思いますが、僕だったらインスタンス変数nameに代入していることがパッと見でわかる@nameを使います。

投稿2019/07/25 02:56

編集2019/07/25 03:14
KaiShoya

総合スコア551

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

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

kazuki0714

2019/07/25 05:17

ありがとうございます。とりあえず `@` でやってみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問