LoginSignup
14
9

More than 5 years have passed since last update.

ruby で =()がついたメソッドを理解する

Last updated at Posted at 2019-03-27

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.messageHello 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】=を使う代入関数。書き方とハマった部分書くけど、使い所わからん。

14
9
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9