Rubyで メソッド名=()
とする方法があるのですが、
どういう意味かと、いつ使うかがイマイチ分かっていなかったので纏めました。
普通のhoge
メソッドの挙動
class Test
def hoge(hoge=nil)
@hoge = hoge
end
end
irb(main):023:0> test = Test.new
=> #<Test:0x00007f8f6db18740>
irb(main):024:0> test.hoge('こんにちは')
=> "こんにちは"
irb(main):025:0> test.hoge
=> nil
何も疑問はありません。まぁこうなりますよね(笑)
hoge=()
メソッド の挙動
class Test
def hoge=(hoge=nil)
@hoge = hoge
end
end
irb(main):002:0> test = Test.new
=> #<Test:0x00007f8f72b4baa0>
irb(main):003:0> test.hoge = 'こんにちは'
=> "こんにちは"
irb(main):004:0> test.hoge
NoMethodError: undefined method `hoge' for #<Hoge:0x00007f8c5997bb60>
hoge=()
の時は、ただの呼び出しはできないようです
hoge=()
メソッドの挙動パート2
class Test
def hoge=(hoge=nil)
@hoge = hoge
end
def hoge
@hoge
end
end
irb(main):065:0> test = Test.new
=> #<Test:0x00007f8f6d3048b0>
irb(main):066:0> test.hoge
=> nil
irb(main):067:0> test.hoge = 'こんにちは'
=> "こんにちは"
irb(main):068:0> test.hoge
=> "こんにちは"
irb(main):069:0> test.hoge = nil
=> nil
irb(main):071:0> test.hoge
=> nil
test.hoge = nil
の時は hoge=()
が呼ばれて、
ただのtest.hoge
の時はhoge
メソッドが呼ばれているっぽい。
追記
☝️のようになる理由はtest.hoge = nil
の時は =
の前後に空白はあるのですが、
関係なく、hoge=()
メソッドが呼ばれたと解釈されているからです。
hoge=()
メソッドの挙動パート3
class Test
def hoge=(hoge=nil)
@message = "Hello" + " " + hoge
end
def message
@message
end
end
irb(main):081:0> test = Test.new
=> #<Test:0x00007f8f72b06608>
irb(main):082:0> test.hoge = 'world'
=> "world"
irb(main):083:0> test.message
=> "Helloworld"
ここで、注目したいのが、test.hoge = 'world'
での返り値が **"world"
**になっている!
しかし、test.message
はHello world
になっている。
あくまでhoge=()
を使った時の返り値は引数になるっぽい!!!
どうやら調べてみると、下記の様なケースとかで使えるらしい
irb(main):084:0> a = Test.new
=> #<Test:0x00007f8f72ae7de8>
irb(main):085:0> b = Test.new
=> #<Test:0x00007f8f72adf170>
irb(main):086:0> a.hoge = b.hoge = 'world'
=> "world"
irb(main):087:0> a.message
=> "Hello world"
irb(main):088:0> b.message
=> "Hello world"
一回で、2つ以上の変数に代入することができる!
まとめ
- 要素代入関数は、代入の様な形の式で関数を呼び出すことができる! そして、
=
がない同名のメソッドと使い分けることが出来る! - 返り値は常に引数の値になる! つまり 同じ引数を一回で、2つ以上の変数に代入することができる!
参考にさせてもらいました
【Ruby on Rails】=を使う代入関数。書き方とハマった部分書くけど、使い所わからん。