次のページを見ていて、自分なりのテストプログラムを書きたくなったので、投稿します。
Markdown: Qiita
テーマは、rubyでのselfと@の違い
動作環境は、cloud9
クラス内の変数hogeにselfと@をつけたり、付けなかったりして、エラーの有無を調べました。
中級者以上の人は見ただけで予想がつくのでしょうが、初心者は実験をしないとエラーがでるかどうか
わからんのですよ。
rubyでのselfと@の違い
# ruby self @ の違いとアクセサの有無によるエラーの有無を総当たりで動作チェック
# コメントアウトされている行はエラーとなるので、コメントインして文法エラー確認が可能
class TestClass
  attr_accessor :hoge1, :hoge3
  def initialize(arg)
    @hoge1 = arg        # @hoge はアクセサがある
    @hoge2 = arg        # @hoge2 はアクセサがない
    self.hoge3 = arg    # @の代わりにselfを使った場合、アクセサあり
    #self.hoge4 = arg   # @の代わりにselfを使った場合、アクセサなし、これはエラーになるので、コメントアウト
  end
  def func
    puts "========hoge1をインスタンスメソッド内で使った場合========"
    puts hoge1 + "1"
    puts @hoge1 + "2"
    puts self.hoge1 + "3"
    puts "========hoge2をインスタンスメソッド内で使った場合========"
    #puts hoge2 + "4"       # hoge2 はローカル変数となり、この行で初登場なので値なしエラー
    puts @hoge2 + "5"       #@hoge2 はインスタンス変数なので、インスタンス関数から利用できるのでOK
    #puts self.hoge2 + "6"  # hoge2 のアクセサを用意してないので、エラー(selfはアクセサを呼び出す呪文)
    puts "========hoge3をインスタンスメソッド内で使った場合========"
    puts hoge3 + "7"
    puts @hoge3 + "8"
    puts self.hoge3 + "9"
  end
end
obj = TestClass.new("テスト")
obj.func
puts "========hoge1をインスタンス変数として使った場合(hoge1はアクセサあり)========"
puts obj.hoge1 + "11"
# puts obj.@hoge1 + "12"       #文法エラー .の後に@はおかしい
# puts obj.self.hoge1 + "13"   #selfはインスタンスメソッドではないので、文法エラー
puts "========hoge2をインスタンス変数として使った場合(hoge2はアクセサなしなので全滅)========"
# puts obj.hoge2 + "14"       #hoge2にはアクセサがないので、インスタンス変数として利用するとエラー
# puts obj.@hoge2 + "15"      #文法エラー .の後に@はおかしい
# puts obj.self.hoge2 + "16"   #selfはインスタンスメソッドではないので、文法エラー
puts "========hoge3をインスタンス変数として使った場合(hoge3はアクセサあり)========"
puts obj.hoge3 + "17"
# puts obj.@hoge3 + "18"       #文法エラー .の後に@はおかしい
# puts obj.self.hoge3 + "19"   #selfはインスタンスメソッドではないので、文法エラー