{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 6-4 メソッド探索方法\n", "### 6-4-1 自身のメソッドを呼び出したときの探索方法" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":hello" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class BaseClass\n", " def hello\n", " :hello\n", " end\n", "end\n", "\n", "base_object = BaseClass.new\n", "base_object.hello" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-4-2 スーパークラスのメソッドを呼び出したときの探索方法" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":hello" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class InheritClass < BaseClass\n", "end\n", "\n", "inherit_object = InheritClass.new\n", "inherit_object.hello" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-4-3 特異メソッドを呼び出したときの探索方法" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":singleton_method_hello" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def base_object.hello\n", " :singleton_method_hello\n", "end\n", "\n", "base_object.hello" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-4-4 クラスにmixinされたメソッドを呼び出したときの探索方法" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":hello_from_module" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module HelloModule\n", " def hello_from_module\n", " :hello_from_module\n", " end\n", "end\n", "\n", "class InheritClass\n", " include HelloModule\n", "end\n", "\n", "inherit_object = InheritClass.new\n", "inherit_object.hello_from_module" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MixinClass" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module ByeModule\n", "end\n", "\n", "class MixinClass < BaseClass\n", " include HelloModule\n", " include ByeModule\n", "end" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DuplicateMixinClass" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class DuplicateMixinClass < BaseClass\n", " include HelloModule\n", " include ByeModule\n", " include HelloModule\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-4-5 オブジェクトに依存しないメソッドを呼び出したときの探索方法" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "ename": "NoMethodError", "evalue": "undefined method `net_exist_method' for #", "output_type": "error", "traceback": [ "\u001b[31mNoMethodError\u001b[0m: undefined method `net_exist_method' for #", "\u001b[37m(pry):44:in `
'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.1/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "inherit_object = InheritClass.new\n", "inherit_object.net_exist_method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-4-6 メソッド探索のまとめ" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":hello_module" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module HelloModule\n", " def hello\n", " :hello_module\n", " end\n", "end\n", "\n", "class GrandParentClass\n", " def hello\n", " :grand_parent_hello\n", " end\n", "end\n", "\n", "class ParentClass < GrandParentClass\n", " include HelloModule\n", "end\n", "\n", "class ChildClass < ParentClass\n", "end\n", "\n", "child = ChildClass.new\n", "child.hello" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6-5 Module#prepend\n", "### 6-5-1 Module#prependの使い方" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":prepended_method" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module PrependModule\n", " def prepended_method\n", " :prepended_method\n", " end\n", "end\n", "\n", "class PrependedClass\n", " prepend PrependModule\n", "end\n", "\n", "prepended_obj = PrependedClass.new\n", "prepended_obj.prepended_method" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":from_prepend_module" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module IncludeModule\n", " def embeded_method\n", " :from_include_module\n", " end\n", "end\n", "\n", "module PrependModule\n", " def embeded_method\n", " :from_prepend_module\n", " end\n", "end\n", "\n", "class EmbeddedClass\n", " include IncludeModule\n", " prepend PrependModule\n", "end\n", "\n", "embeded_obj = EmbeddedClass.new\n", "embeded_obj.embeded_method" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":from_prepend_module" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class ReverseEmbeddedClass\n", " prepend PrependModule\n", " include IncludeModule\n", "end\n", "\n", "reverse_embeded_obj = ReverseEmbeddedClass.new\n", "reverse_embeded_obj.embeded_method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-5-2 Module#prependの動作" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":from_prepend_module" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class PrependedClass\n", " prepend PrependModule\n", "\n", " def embeded_method\n", " :prepended_class\n", " end\n", "end\n", "\n", "obj = PrependedClass.new\n", "obj.embeded_method" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "super_call_method\n" ] }, { "data": { "text/plain": [ ":overrode" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module SuperCallModule\n", " def super_call_method\n", " puts \"super_call_method\"\n", " super\n", " end\n", "end\n", "\n", "class OverrideClass\n", " prepend SuperCallModule\n", "\n", " def super_call_method\n", " :overrode\n", " end\n", "end\n", "\n", "override_obj = OverrideClass.new\n", "override_obj.super_call_method" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Hi! hello\"" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module BeforeHelloFilter\n", " def hello\n", " \"Hi! \" + super\n", " end\n", "end\n", "\n", "class Hello\n", " prepend BeforeHelloFilter\n", "\n", " def hello\n", " \"hello\"\n", " end\n", "end\n", "\n", "Hello.new.hello" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":second_prepend_method" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module FirstPrependModule\n", " def prepended_method\n", " :first_prepend_module\n", " end\n", "end\n", "\n", "module SecondPrependModule\n", " def prepended_method\n", " :second_prepend_method\n", " end\n", "end\n", "\n", "class PrependedClass\n", " prepend FirstPrependModule\n", " prepend SecondPrependModule\n", "end\n", "\n", "prepended_obj = PrependedClass.new\n", "prepended_obj.prepended_method" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Ruby 2.6.1", "language": "ruby", "name": "ruby2.6.1" }, "language_info": { "file_extension": ".rb", "mimetype": "application/x-ruby", "name": "ruby", "version": "2.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }