muffin-men
@muffin-men (muffin men)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

メソッド内にあるselfってなんなんだ

Q&A

Closed

Railsの参考書を読みながら勉強を進めていたらメソッド内にselfが出てきたので自分で理解しようとしたのですがなかなか理解できず記事にしてみました。

問題点

コールバックの実装をしていたらメソッド内にselfが出てきた…

app/models/task.rb
class Task < ApplicationRecord
  before_validation :set_nameless_name

#省略
  private

  def set_nameless_name
   self.name = '名前なし' if name.blank?
  end
end

ここではnameの値が入力されていないとき「名前なし」という値を自動でつけるようにしています。

自分で調べたこと

下記の記事を参考にしてみました。
https://qiita.com/suzuki-koya/items/1553c405beeb73f83bbc

しかし、理解ができず今思うことはどうしてここにselfをつける意味があるのか
nameだけではいいのでは?と思います。

分かりづらい記事になってしまいましたが、心優しい方コメントいただけたら幸いです。

参考本

・ 現場で使える Ruby on rails 5 速習実践ガイド

0

2Answer

単純に

  • ローカル変数なのか
  • インスタンス変数なのか
  • クラスメソッドなのか
  • インスタンスメソッドなのか

rubyは柔軟なのでソースを読まないとどれに当たるのかはパッと見わからないかもしれません。
pry gemを入れて途中途中でp selfとか色々やってみるとわかり易いかも。

class A
  attr_accessor :name

  def method1(name)
    # インスタンス変数nameにローカル変数nameを割り当てる
    @name = name
    # @nameと同じ インスタンス変数nameにローカル変数nameを割り当てる
    self.name = name
    # これはローカル変数nameにローカル変数nameを割り当てるんで意味がない
    # name = name 
  end

  def method2(text)
    # @もself.もなければただ単にローカル変数nameにtextを割り当ててるだけ
    name = text
  end
end

class B
  def name=(text)
    # インスタンス変数をその場で作ってる
    @name = text
    # これは出来ない 上の例では[attr_accessor :name]でname=メソッドが自動挿入されていたので出来た
    # https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html
    # self.name = text
  end

  def method1(text)
    # この場合はメソッドとしてのname=を呼んでる
    # ローカル変数に割り当てているようでそうではない
    name = text
  end
end
0Like

Your answer might help someone💌