インスタンス変数とは?
クラス内部ではインスタンス変数を使うことができます。インスタンス変数は同じインスタンス(同じオブジェクト)内部で共有される変数です。インスタンス変数の変数名は必ず@で始めます。
ローカル変数
ローカル変数はアルファベットの小文字、またはアンダースコアで始めます
ローカル変数に代入されていないとエラーになる
irb(main):189* class User4
irb(main):190*
irb(main):191* def initialize(name)
irb(main):192* @name = name
irb(main):193* end
irb(main):194*
irb(main):195* def hello
irb(main):196* # shuffled_name = @name.chars.shuffle.join
irb(main):197* "Hello, I am #{shuffled_name}."
irb(main):198* end
irb(main):199> end
=> :hello
irb(main):200> user = User.new('Alice')
(irb):54:in `initialize': wrong number of arguments (given 1, expected 3) (ArgumentError)
...
irb(main):201> user = User4.new('Alice')
=> #<User4:0x000000010ae9d710 @name="Alice">
irb(main):202> user.hello
(irb):197:in `hello': undefined local variable or method `shuffled_name' for #<User4:0x000000010ae9d710 @name="Alice"> (NameError)
"Hello, I am #{shuffled_name}."
^^^^^^^^^^^^^
インスタンス変数が代入されなくてもエラーにならない
irb(main):217* class User6
irb(main):218*
irb(main):219* def initialize(name)
irb(main):220* # @name = name
irb(main):221* end
irb(main):222*
irb(main):223* def hello
irb(main):224* # shuffled_name = @name.chars.shuffle.join
irb(main):225* "Hello, I am #{@name}."
irb(main):226* end
irb(main):227> end
=> :hello
irb(main):228> user = User6.new("Alice")
=> #<User6:0x000000010755cdc0>
irb(main):229> user.hello
=> "Hello, I am ."
クラス外からのインスタンス変数の参照、書き換え
irb(main):275* class User7
irb(main):276* def initialize(name)
irb(main):277* @name = name
irb(main):278* end
irb(main):279*
irb(main):280* def name
irb(main):281* @name
irb(main):282* end
irb(main):283*
irb(main):284* def name=(value)
irb(main):285* @name = value
irb(main):286* end
irb(main):287> end
=> :name=
irb(main):288> user = User7.new("Alice")
=> #<User7:0x0000000107417898 @name="Alice">
irb(main):289> user.name
=> "Alice"
irb(main):290> user.name="Bob"
=> "Bob"
irb(main):291> user.name
=> "Bob"
irb(main):292>
- 普段railsで行っている
user.name
やuser.name="Bob"
はクラスの中でこういう処理をしてくれているおかげなのか
感想
インスタンス変数の書き間違え、代入をするとおかしな結果になる
ローカル変数は必ず代入して処理をする