{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-2-4 メソッドの定義\n", "\n", "リスト 6.13 継承とincludeした時のメソッド優先順序" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":second_include_module" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module FirstIncludeModule\n", " def same_name_method\n", " :first_include_module\n", " end\n", "end\n", "\n", "module SecondIncludeModule\n", " def same_name_method\n", " :second_include_module\n", " end\n", "end\n", "\n", "class Klass\n", " include FirstIncludeModule\n", " include SecondIncludeModule\n", "end\n", "\n", "object = Klass.new\n", "object.same_name_method" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":first_include_module" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class Klass\n", " define_method :same_name_method, FirstIncludeModule.instance_method(:same_name_method)\n", "end\n", "\n", "object = Klass.new\n", "object.same_name_method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-2-5 MethodTransplanting" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":un_include_module_method" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module UnIncludeModule\n", " def un_include_module_method\n", " :un_include_module_method\n", " end\n", "end\n", "\n", "class Klass2\n", " # TypeErrr にならない\n", " define_method :un_include_module_method, UnIncludeModule.instance_method(:un_include_module_method)\n", "end\n", "\n", "object = Klass2.new\n", "object.un_include_module_method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6-3 特異クラス\n", "### 6-3-1 特異クラスと特異メソッド" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":new_singleton_method" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class OriginalClass\n", "end\n", "\n", "obj = OriginalClass.new\n", "\n", "def obj.new_singleton_method\n", " :new_singleton_method\n", "end" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "false" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obj.class.method_defined? :new_singleton_method" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obj.singleton_class.method_defined? :new_singleton_method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-3-2 特異クラスの確認方法" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#\n" ] }, { "data": { "text/plain": [ "#>" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class Klass3; end\n", "\n", "p klass = Klass3.new\n", "klass.singleton_class" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "KLASS_OBJECT = klass\n", "\n", "class << klass; self; end == KLASS_OBJECT.singleton_class" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-3-3 特異クラスが作成されるタイミング" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":define_singleton_method" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obj = Object.new\n", "\n", "def obj.define_singleton_method\n", " :singleton_method\n", "end" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "class << obj\n", "end" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "#>" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obj.singleton_class" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-3-4 オブジェクトと特異クラス" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OriginalClass2" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class OriginalClass2\n", "end\n", "\n", "obj = OriginalClass2.new\n", "obj.singleton_class.superclass" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "false\n" ] }, { "data": { "text/plain": [ "true" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p obj.instance_of? obj.singleton_class\n", "obj.instance_of? OriginalClass2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-3-5 特異クラスを持てないオブジェクト" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "can't define singleton", "output_type": "error", "traceback": [ "\u001b[31mTypeError\u001b[0m: can't define singleton", "\u001b[37m(pry):82:in `singleton_class'\u001b[0m", "\u001b[37m(pry):82:in `
'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "1.singleton_class" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "can't define singleton", "output_type": "error", "traceback": [ "\u001b[31mTypeError\u001b[0m: can't define singleton", "\u001b[37m(pry):83:in `singleton_class'\u001b[0m", "\u001b[37m(pry):83:in `
'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ ":symbol.singleton_class" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TrueClass\n", "FalseClass\n" ] }, { "data": { "text/plain": [ "NilClass" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p true.singleton_class\n", "p false.singleton_class\n", "nil.singleton_class" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-3-6 特異クラスの特徴" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#\n", "#>\n" ] }, { "ename": "TypeError", "evalue": "can't create instance of singleton class", "output_type": "error", "traceback": [ "\u001b[31mTypeError\u001b[0m: can't create instance of singleton class", "\u001b[37m(pry):93:in `new'\u001b[0m", "\u001b[37m(pry):93:in `
'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "class Klass3; end\n", "\n", "p klass = Klass.new\n", "\n", "p EigenClass = klass.singleton_class\n", "\n", "EigenClass.new" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "can't make subclass of singleton class", "output_type": "error", "traceback": [ "\u001b[31mTypeError\u001b[0m: can't make subclass of singleton class", "\u001b[37m(pry):94:in `
'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/lib/ruby/gems/2.6.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/ketchup/.rbenv/versions/2.6.0/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "class NewClass < EigenClass\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-3-7 特異クラスとObject#extend" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":extend_method" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "module ExtendedModule\n", " def extend_method\n", " :extend_method\n", " end\n", "end\n", "\n", "obj = Object.new\n", "obj.extend ExtendedModule\n", "\n", "obj.extend_method" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[#>, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]\n" ] }, { "data": { "text/plain": [ "[#>, ExtendedModule, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obj = Object.new\n", "p obj.singleton_class.ancestors\n", "\n", "obj.extend ExtendedModule\n", "obj.singleton_class.ancestors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-3-8 特異クラスを使う" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "#" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SINGLETON_OBJECT = Object.new" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":only_method" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class << SINGLETON_OBJECT\n", " def only_method\n", " :only_method\n", " end\n", "end" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "#>" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SingletonClass = SINGLETON_OBJECT.singleton_class" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":instance_get" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def SingletonClass.instance_get\n", " SINGLETON_OBJECT\n", "end" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":only_method" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SingletonClass.instance_get.only_method" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Ruby 2.6.0", "language": "ruby", "name": "ruby2.6.0" }, "language_info": { "file_extension": ".rb", "mimetype": "application/x-ruby", "name": "ruby", "version": "2.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }