**************
 繧ェ繝悶ず繧ァ繧ッ繝�
**************

======================
 繧ェ繝悶ず繧ァ繧ッ繝域欠蜷代→縺ッ
======================

* `繧、繝。繝シ繧ク縺ァ逅�ァ」縺吶k縲後�繝ュ繧ー繝ゥ繝溘Φ繧ー蛻晏ソ�€�′遒コ螳溘↓諢丞袖荳肴�縺ォ縺ェ繧銀€昴が繝悶ず繧ァ繧ッ繝域欠蜷代�繝ュ繧ー繝ゥ繝溘Φ繧ー窶昴▲縺ヲ縺ェ繧薙↑縺ョ縺輔€�(繝悶Ο繧ー縲後�繝ュ繧ー繝ゥ繝溘Φ繧ー繧定カ」蜻ウ縺ォ縺励◆縺�€�) <http://tec.citrussin.com/entry/2015/08/13/155115>`_

Ruby縺ァ縺ッ縺吶∋縺ヲ縺ョ繝��繧ソ縺ッ繧ェ繝悶ず繧ァ繧ッ繝医〒縺ゅk縲ゆセ九∴縺ー謨エ謨ー縺ョ繧ッ繝ゥ繧ケ縺ッ ``Integer`` 縲∵枚蟄怜�縺ョ繧ッ繝ゥ繧ケ縺ッ ``String`` 縺ェ縺ゥ縲�

Ruby險€隱槭↓ `譛€蛻昴°繧臥オ�∩霎シ縺セ繧後※縺�k繧ッ繝ゥ繧ケ <https://docs.ruby-lang.org/ja/latest/library/_builtin.html>`_ 縺ィ縲� `邨�∩霎シ縺ソ縺ァ縺ッ縺ェ縺�′讓呎コ也噪縺ォ逕ィ諢上&繧後※縺�k繧ッ繝ゥ繧ケ <https://docs.ruby-lang.org/ja/latest/library/index.html>`_ 縺後≠繧九€�

============
 繧ッ繝ゥ繧ケ螳夂セゥ
============

* `繧ッ繝ゥ繧ケ螳夂セゥ <https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#class>`_
* `繧ッ繝ゥ繧ケ縺ィ縺ッ(RubyLife) <http://www.rubylife.jp/ini/class/index1.html>`_

蜷後§繧ッ繝ゥ繧ケ蜷阪〒隍�焚邂�園縺ォ螳夂セゥ繧呈嶌縺�※繧ゅh縺�€ゅ◎縺ョ蝣エ蜷医�螳夂セゥ縺瑚ソス蜉�縺輔l縺ヲ縺�¥縲�

==========
 繝。繧ス繝�ラ
==========

* `繝。繧ス繝�ラ(RubyLife) <http://www.rubylife.jp/ini/method/>`_

繝。繧ス繝�ラ繧貞ョ溯。後☆繧区凾縺ッ蠢�★螳溯。御クサ菴薙→縺ェ繧九が繝悶ず繧ァ繧ッ繝�(縲檎ァ√€阪′隱ー縺九→縺�≧縺薙→)縺後≠繧翫€√◎繧後� ``self`` 縺ィ縺�≧螟画焚縺ォ蜈・縺」縺ヲ縺�k縲�

繝。繧ス繝�ラ繧貞他縺ウ蜃コ縺呎凾縺ッ螳溯。御クサ菴薙→縺ェ繧九が繝悶ず繧ァ繧ッ繝医r謖�ョ壹@縺ェ縺�→縺�¢縺ェ縺�′縲∵欠螳壹@縺ェ縺��エ蜷医� ``self`` 縺御スソ繧上l繧九€ゅ@縺溘′縺」縺ヲ谺。縺ョ莠後▽縺ッ蜷後§縲�

.. code-block:: ruby

   foo()

.. code-block:: ruby

   self.foo()

.. note::

   Ruby縺ォ髢「謨ー繧�シ皮ョ怜ュ舌�辟。縺上€√☆縺ケ縺ヲ繝。繧ス繝�ラ縺ァ縺ゅk縲る未謨ー縺ョ繧医≧縺ォ菴ソ縺�b縺ョ縺ッ ``Object`` 繧ッ繝ゥ繧ケ縺ァ螳夂セゥ縺輔l縺ヲ縺�k�域ュ」遒コ縺ォ縺ッ ``Kernel`` 繝「繧ク繝・繝シ繝ォ縺ァ螳夂セゥ縺輔l縲� ``Object``  繧ッ繝ゥ繧ケ縺ォ繧、繝ウ繝昴�繝医&繧後※縺�k�峨€� ``Object`` 縺ッ縺吶∋縺ヲ縺ョ繧ッ繝ゥ繧ケ縺ョ繧ケ繝シ繝代�繧ッ繝ゥ繧ケ縺ェ縺ョ縺ァ縲√◎縺薙〒螳夂セゥ縺輔l縺溘Γ繧ス繝�ラ縺ッ縺吶∋縺ヲ縺ョ繧ェ繝悶ず繧ァ繧ッ繝医〒繝。繧ス繝�ラ蜷阪□縺第嶌縺�※菴ソ縺�%縺ィ縺後〒縺阪k縲�

====================
 繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ョ逕滓�
====================

繧ッ繝ゥ繧ケA縺ョ譁ー縺励>繧ェ繝悶ず繧ァ繧ッ繝医r菴懊k縺ォ縺ッ縲√け繝ゥ繧ケA縺ョ ``new`` 繝。繧ス繝�ラ繧貞他縺ウ蜃コ縺励€∬ソ斐j蛟、縺ィ縺励※繧ッ繝ゥ繧ケA縺ョ譁ー縺励>繧、繝ウ繧ケ繧ソ繝ウ繧ケ繧貞女縺大叙繧九€ゅb縺励け繝ゥ繧ケA縺ォ ``initialize`` 縺ィ縺�≧蜷榊燕縺ョ繝。繧ス繝�ラ縺悟ョ夂セゥ縺輔l縺ヲ縺�k縺ィ縲� ``new`` 縺ァ譁ー縺励¥繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺御ス懊i繧後◆譎ゅ↓縲√◎縺ョ繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ョ繝。繧ス繝�ラ縺ィ縺励※閾ェ蜍慕噪縺ォ蜻シ縺ウ縺�縺輔l繧九€�

.. code-block:: ruby

   class Human
     def initialize
       puts '逕溘∪繧後◆!'
     end
   end

   x = Human.new

==================
 繧、繝ウ繧ケ繧ソ繝ウ繧ケ螟画焚
==================

* `繧、繝ウ繧ケ繧ソ繝ウ繧ケ螟画焚 <https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#instance>`_

繧、繝ウ繧ケ繧ソ繝ウ繧ケ螟画焚縺ッ縲√◎繧後◇繧後�繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺ォ蜷後§蜷榊燕縺ァ蛻・縺ョ螟画焚縺悟ュ伜惠縺励€√Γ繧ス繝�ラ繧貞ョ溯。後☆繧九う繝ウ繧ケ繧ソ繝ウ繧ケ縺梧戟縺」縺ヲ縺�k螟画焚縺御スソ繧上l繧九€�

.. code-block:: ruby

   class Student
     def initialize(n, s)
       @name = n
       @score = s
     end
     def name
       @name
     end
     def score
       @score
     end
     def score=(s)
       @score = s
     end
     def compare(x)
       case
       when @score > x.score
	 "遘√�#{x.name}繧医j雉「縺�!"
       when @score < x.score
	 "遘√�#{x.name}繧医j繧「繝帙〒縺吮€ヲ"
       else
	 "遘√�#{x.name}縺ィ蠑輔″蛻�¢"
       end
     end
   end

   taro = Student.new('螟ェ驛�', 65)
   hanako = Student.new('闃ア蟄�', 80)
   puts taro.compare(hanako)  # 螟ェ驛弱�蛛エ縺九i隕九※闃ア蟄舌→豈碑シ�☆繧�
   puts hanako.compare(taro)  # 闃ア蟄舌�蛛エ縺九i隕九※螟ェ驛弱→豈碑シ�☆繧�

繧、繝ウ繧ケ繧ソ繝ウ繧ケ螟画焚縺ッ縲∽サ悶�繧ェ繝悶ず繧ァ繧ッ繝医°繧芽ェュ縺ソ譖ク縺阪〒縺阪↑縺��縺ァ縲√い繧ッ繧サ繧ケ逕ィ縺ョ繝。繧ス繝�ラ�井ク翫�萓九□縺ィ ``score`` 縺ィ ``score=`` 縺ィ縺具シ峨r譖ク縺丞ソ�ヲ√′縺ゅk縲ゅ◎繧後�髱「蛟偵↑縺ョ縺ァ縲� |attr_accessor_manual|_ 縺ェ縺ゥ繧剃スソ縺�→荳€陦後〒貂医�縲�

.. |attr_accessor_manual| replace:: ``attr_accessor``
.. _attr_accessor_manual: https://docs.ruby-lang.org/ja/latest/class/Module.html#I_ATTR_ACCESSOR

.. code-block:: ruby

   class Student
     attr_reader :name
     attr_accessor :score
     def initialize(n, s)
       @name = n
       @score = s
     end
     def compare(x)
       case
       when @score > x.score
	 "遘√�#{x.name}繧医j雉「縺�!"
       when @score < x.score
	 "遘√�#{x.name}繧医j繧「繝帙〒縺吮€ヲ"
       else
	 "遘√�#{x.name}縺ィ蠑輔″蛻�¢"
       end
     end
   end

.. admonition:: 隱イ鬘�8
   :class: exercise

   谺。縺ョ繧医≧縺ェ繝。繧ス繝�ラ繧呈戟縺、鬆宣≡蜿」蠎ァ縺ョ繧ッ繝ゥ繧ケ繧貞ョ夂セゥ縺帙h縲ゅ◆縺�縺励€∵ョ矩ォ倥h繧雁、壹>驥鷹。阪�蠑輔″蜃コ縺励◆繧頑険繧願セシ繧薙□繧翫〒縺阪↑縺��縺ァ縲√◎縺ョ蝣エ蜷医�繧ィ繝ゥ繝シ繝。繝�そ繝シ繧ク繧貞�蜉帙@縲∵ョ矩ォ倥�螟峨∴縺ェ縺�b縺ョ縺ィ縺吶k縲�

   * 谿矩ォ倥r隱ソ縺ケ繧�
   * 驥鷹。阪r謖�ョ壹@縺ヲ鬆舌¢繧�
   * 驥鷹。阪r謖�ョ壹@縺ヲ蠑輔″蜃コ縺�
   * 逶ク謇九�蜿」蠎ァ縺ィ驥鷹。阪r謖�ョ壹@縺ヲ謖ッ繧願セシ繧€

   螳溯。御セ九�谺。縺ョ繧医≧縺ォ縺ェ繧九€�

   .. code-block:: ruby
   
      a = Account.new #a縺ョ蜿」蠎ァ
      a.deposit(3000) #a縺ョ蜿」蠎ァ縺ォ3000蜀��舌¢繧�
      b = Account.new #b縺ョ蜿」蠎ァ
      b.deposit(1000) #b縺ョ蜿」蠎ァ縺ォ1000蜀��舌¢繧�
      b.withdraw(500) #b縺ョ蜿」蠎ァ縺九i500蜀�シ輔″蜃コ縺�
      a.transfer(b, 2000) #a縺ョ蜿」蠎ァ縺九ib縺ョ蜿」蠎ァ縺ォ2000蜀�険繧願セシ繧€
      puts a.balance #a縺ョ蜿」蠎ァ谿矩ォ倥r陦ィ遉コ
      puts b.balance #b縺ョ蜿」蠎ァ谿矩ォ倥r陦ィ遉コ
      b.transfer(a, 5000) #b縺ョ蜿」蠎ァ縺九ia縺ョ蜿」蠎ァ縺ォ5000蜀�険繧願セシ繧€

   縺ェ縺翫€∵ョ矩ォ倅ク崎カウ縺ョ繝。繝�そ繝シ繧ク繧定。ィ遉コ縺吶k縺ィ縺薙m縺ッ縲√�繝ュ繧ー繝ゥ繝�蜀�〒荳€邂�園縺�縺代↓縺吶k縺薙→縲�

   :ref:`縲占ァ」遲比セ九€� <ex8-answer>`

======
 邯呎価
======

* `繧ッ繝ゥ繧ケ縺ョ邯呎価(RubyLife) <http://www.rubylife.jp/ini/inherit/>`_

蜈�↓縺ェ繧九け繝ゥ繧ケ繧定ヲェ繧ッ繝ゥ繧ケ縺セ縺溘�繧ケ繝シ繝代�繧ッ繝ゥ繧ケ縲∵眠縺励¥菴懊k繧ッ繝ゥ繧ケ繧貞ュ舌け繝ゥ繧ケ縺セ縺溘�繧オ繝悶け繝ゥ繧ケ縺ィ蜻シ縺カ縲�

.. code-block:: ruby

   class Student
     def initialize(n)
       @name = n
     end
     def name
       @name
     end
   end

   class KeioStudent < Student
     def university
       '諷カ諛臥セゥ蝪セ螟ァ蟄ヲ'
     end
   end

   class PStudent < KeioStudent
     def faculty
       '邱丞粋謾ソ遲門ュヲ驛ィ'
     end
   end

   class EStudent < KeioStudent
     def faculty
       '迺ー蠅�ュ蝣ア蟄ヲ驛ィ'
     end
   end

   taro = PStudent.new('螟ェ驛�')
   puts "#{taro.name}縺ッ#{taro.university}#{taro.faculty}縺ョ蟄ヲ逕溘〒縺吶€�"

.. admonition:: 隱イ鬘�9
   :class: exercise

   荳翫�繝励Ο繧ー繝ゥ繝�縺ァ縲� ``Student`` 繧ッ繝ゥ繧ケ縺ョ繝。繧ス繝�ラ縺ィ縺励※ ``affiliation`` 繝。繧ス繝�ラ繧貞ョ夂セゥ縺励€√◎縺ョ蟄ヲ逕溘�螟ァ蟄ヲ蜷阪→蟄ヲ驛ィ蜷阪r縺、縺ェ縺偵◆譁�ュ怜�繧定ソ斐☆繧医≧縺ォ縺帙h縲�( ``PStudent`` 縺ィ ``EStudent`` 縺ォ螳夂セゥ縺吶k縺ョ縺ァ縺ッ縺ェ縺�%縺ィ縺ォ豕ィ諢�)

   螳溯。御セ九�縺薙s縺ェ諢溘§縲�

   .. code-block:: ruby
   
      taro = PStudent.new('螟ェ驛�')
      hanako = EStudent.new('闃ア蟄�')
      puts "#{taro.name}縺ッ#{taro.affiliation}縺ョ蟄ヲ逕溘〒縺吶€�"
      puts "#{hanako.name}縺ッ#{hanako.affiliation}縺ョ蟄ヲ逕溘〒縺吶€�"

   :ref:`縲占ァ」遲比セ九€� <ex9-answer>`

==============
 迚ケ逡ー繝。繧ス繝�ラ
==============

* `迚ケ逡ー繝。繧ス繝�ラ螳夂セゥ <https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#singleton_method>`_
* `邨仙ア€縲ヽuby縺ョ迚ケ逡ー繝。繧ス繝�ラ縺」縺ヲ菴輔↑縺ョ��(繝悶Ο繧ー縲茎asata299's blog縲�) <http://blog.livedoor.jp/sasata299/archives/51497378.html>`_

譎ョ騾壹�繝。繧ス繝�ラ縺ッ縲√≠繧九け繝ゥ繧ケ縺ョ繧、繝ウ繧ケ繧ソ繝ウ繧ケ蜈ィ驛ィ縺ォ蜈ア騾壹□縺後€∫音螳壹�繧、繝ウ繧ケ繧ソ繝ウ繧ケ縺�縺代�繝。繧ス繝�ラ繧貞ョ夂セゥ縺ァ縺阪k縲�

==============
 繧「繧ッ繧サ繧ケ蛻カ蠕。
==============

* `蜻シ縺ウ蜃コ縺怜宛髯� <https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#limit>`_
* `Ruby 縺ョ private 縺ィ protected 縲よュエ蜿イ縺ィ菴ソ縺��縺�(Qiita) <https://qiita.com/tbpgr/items/6f1c0c7b77218f74c63e>`_

Java繧Г++縺ョ ``public`` , ``protected`` , ``private`` 縺ィ縺ッ諢丞袖縺碁&縺��縺ァ豕ィ諢上€�